// 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

extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
VTBL_ENTRY *P__ZTIN3ccc4AA15E = _ZTIN3ccc4AA15E; 
Class_Descriptor cd__ZN3ccc4AA15E = {  "_ZN3ccc4AA15E", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTIN3ccc4AA15E),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  BB15  {
};
//SIG(-1 _ZN3ccc4BB15E) C1{}
}
namespace ccc { 
}
static void Test__ZN3ccc4BB15E()
{
  {
    init_simple_test("_ZN3ccc4BB15E");
    ::ccc::BB15 lv;
    check2(sizeof(lv), 1, "sizeof(_ZN3ccc4BB15E)");
    check2(__alignof__(lv), 1, "__alignof__(_ZN3ccc4BB15E)");
  }
}
static Arrange_To_Call_Me v_ZN3ccc4BB15E(Test__ZN3ccc4BB15E, "_ZN3ccc4BB15E", 1);

#else // __cplusplus

extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
VTBL_ENTRY *P__ZTIN3ccc4BB15E = _ZTIN3ccc4BB15E; 
Class_Descriptor cd__ZN3ccc4BB15E = {  "_ZN3ccc4BB15E", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  1, // object size
  NSPAIRA(_ZTIN3ccc4BB15E),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y0  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y03pqrEv
  ~CC0x0y0(); // tgen
  CC0x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y0E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y03abcEv");}
void  ccc::CC0x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y03efgEv");}
void  ccc::CC0x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y03pqrEv");}
ccc::CC0x0y0 ::~CC0x0y0(){ note_dtor("_ZN3ccc7CC0x0y0E", this);} // tgen
ccc::CC0x0y0 ::CC0x0y0(){ note_ctor("_ZN3ccc7CC0x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y0E, buf);
    ::ccc::CC0x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y0E);
    dp->::ccc::CC0x0y0::~CC0x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y0E(Test__ZN3ccc7CC0x0y0E, "_ZN3ccc7CC0x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y0C1Ev();
extern void _ZN3ccc7CC0x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y0E[] = {
  NSPAIR(_ZN3ccc7CC0x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y0E[];
extern void _ZN3ccc7CC0x0y03abcEv();
extern void _ZN3ccc7CC0x0y03efgEv();
extern void _ZN3ccc7CC0x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03abcEv,_ZThn4_N3ccc7CC0x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03efgEv,_ZThn4_N3ccc7CC0x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y03pqrEv,_ZThn4_N3ccc7CC0x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y03abcEv,_ZThn4_N3ccc7CC0x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y03efgEv,_ZThn4_N3ccc7CC0x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y03pqrEv,_ZThn4_N3ccc7CC0x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y0E[];
Class_Descriptor cd__ZN3ccc7CC0x0y0E = {  "_ZN3ccc7CC0x0y0E", // class name
  bases__ZN3ccc7CC0x0y0E, 2,
  &(vtc__ZN3ccc7CC0x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y1  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x0y13efgEv
  ~CC0x0y1(); // tgen
  CC0x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y1E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y13abcEv");}
void  ccc::CC0x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y13pqrEv");}
void  ccc::CC0x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y13efgEv");}
ccc::CC0x0y1 ::~CC0x0y1(){ note_dtor("_ZN3ccc7CC0x0y1E", this);} // tgen
ccc::CC0x0y1 ::CC0x0y1(){ note_ctor("_ZN3ccc7CC0x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y1E, buf);
    ::ccc::CC0x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y1E);
    dp->::ccc::CC0x0y1::~CC0x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y1E(Test__ZN3ccc7CC0x0y1E, "_ZN3ccc7CC0x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y1C1Ev();
extern void _ZN3ccc7CC0x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y1E[] = {
  NSPAIR(_ZN3ccc7CC0x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y1E[];
extern void _ZN3ccc7CC0x0y13abcEv();
extern void _ZN3ccc7CC0x0y13efgEv();
extern void _ZN3ccc7CC0x0y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13abcEv,_ZThn4_N3ccc7CC0x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13efgEv,_ZThn4_N3ccc7CC0x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y13pqrEv,_ZThn4_N3ccc7CC0x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y13abcEv,_ZThn4_N3ccc7CC0x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y13efgEv,_ZThn4_N3ccc7CC0x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y13pqrEv,_ZThn4_N3ccc7CC0x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y1E[];
Class_Descriptor cd__ZN3ccc7CC0x0y1E = {  "_ZN3ccc7CC0x0y1E", // class name
  bases__ZN3ccc7CC0x0y1E, 2,
  &(vtc__ZN3ccc7CC0x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y2  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y23pqrEv
  ~CC0x0y2(); // tgen
  CC0x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y2E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y23efgEv");}
void  ccc::CC0x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y23abcEv");}
void  ccc::CC0x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y23pqrEv");}
ccc::CC0x0y2 ::~CC0x0y2(){ note_dtor("_ZN3ccc7CC0x0y2E", this);} // tgen
ccc::CC0x0y2 ::CC0x0y2(){ note_ctor("_ZN3ccc7CC0x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y2E, buf);
    ::ccc::CC0x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y2E);
    dp->::ccc::CC0x0y2::~CC0x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y2E(Test__ZN3ccc7CC0x0y2E, "_ZN3ccc7CC0x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y2C1Ev();
extern void _ZN3ccc7CC0x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y2E[] = {
  NSPAIR(_ZN3ccc7CC0x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y2E[];
extern void _ZN3ccc7CC0x0y23abcEv();
extern void _ZN3ccc7CC0x0y23efgEv();
extern void _ZN3ccc7CC0x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23abcEv,_ZThn4_N3ccc7CC0x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23efgEv,_ZThn4_N3ccc7CC0x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y23pqrEv,_ZThn4_N3ccc7CC0x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y23abcEv,_ZThn4_N3ccc7CC0x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y23efgEv,_ZThn4_N3ccc7CC0x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y23pqrEv,_ZThn4_N3ccc7CC0x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y2E[];
Class_Descriptor cd__ZN3ccc7CC0x0y2E = {  "_ZN3ccc7CC0x0y2E", // class name
  bases__ZN3ccc7CC0x0y2E, 2,
  &(vtc__ZN3ccc7CC0x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y3  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x0y33abcEv
  ~CC0x0y3(); // tgen
  CC0x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y3E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y33efgEv");}
void  ccc::CC0x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y33pqrEv");}
void  ccc::CC0x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y33abcEv");}
ccc::CC0x0y3 ::~CC0x0y3(){ note_dtor("_ZN3ccc7CC0x0y3E", this);} // tgen
ccc::CC0x0y3 ::CC0x0y3(){ note_ctor("_ZN3ccc7CC0x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y3E, buf);
    ::ccc::CC0x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y3E);
    dp->::ccc::CC0x0y3::~CC0x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y3E(Test__ZN3ccc7CC0x0y3E, "_ZN3ccc7CC0x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y3C1Ev();
extern void _ZN3ccc7CC0x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y3E[] = {
  NSPAIR(_ZN3ccc7CC0x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y3E[];
extern void _ZN3ccc7CC0x0y33abcEv();
extern void _ZN3ccc7CC0x0y33efgEv();
extern void _ZN3ccc7CC0x0y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33abcEv,_ZThn4_N3ccc7CC0x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33efgEv,_ZThn4_N3ccc7CC0x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y33pqrEv,_ZThn4_N3ccc7CC0x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y33abcEv,_ZThn4_N3ccc7CC0x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y33efgEv,_ZThn4_N3ccc7CC0x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y33pqrEv,_ZThn4_N3ccc7CC0x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y3E[];
Class_Descriptor cd__ZN3ccc7CC0x0y3E = {  "_ZN3ccc7CC0x0y3E", // class name
  bases__ZN3ccc7CC0x0y3E, 2,
  &(vtc__ZN3ccc7CC0x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y4  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC0x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y43efgEv
  ~CC0x0y4(); // tgen
  CC0x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y4E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y43pqrEv");}
void  ccc::CC0x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y43abcEv");}
void  ccc::CC0x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y43efgEv");}
ccc::CC0x0y4 ::~CC0x0y4(){ note_dtor("_ZN3ccc7CC0x0y4E", this);} // tgen
ccc::CC0x0y4 ::CC0x0y4(){ note_ctor("_ZN3ccc7CC0x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y4E, buf);
    ::ccc::CC0x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y4E);
    dp->::ccc::CC0x0y4::~CC0x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y4E(Test__ZN3ccc7CC0x0y4E, "_ZN3ccc7CC0x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y4C1Ev();
extern void _ZN3ccc7CC0x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y4E[] = {
  NSPAIR(_ZN3ccc7CC0x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y4E[];
extern void _ZN3ccc7CC0x0y43abcEv();
extern void _ZN3ccc7CC0x0y43efgEv();
extern void _ZN3ccc7CC0x0y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43abcEv,_ZThn4_N3ccc7CC0x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43efgEv,_ZThn4_N3ccc7CC0x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y43pqrEv,_ZThn4_N3ccc7CC0x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y43abcEv,_ZThn4_N3ccc7CC0x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y43efgEv,_ZThn4_N3ccc7CC0x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y43pqrEv,_ZThn4_N3ccc7CC0x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y4E[];
Class_Descriptor cd__ZN3ccc7CC0x0y4E = {  "_ZN3ccc7CC0x0y4E", // class name
  bases__ZN3ccc7CC0x0y4E, 2,
  &(vtc__ZN3ccc7CC0x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y5  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC0x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y53abcEv
  ~CC0x0y5(); // tgen
  CC0x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y5E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y53pqrEv");}
void  ccc::CC0x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y53efgEv");}
void  ccc::CC0x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y53abcEv");}
ccc::CC0x0y5 ::~CC0x0y5(){ note_dtor("_ZN3ccc7CC0x0y5E", this);} // tgen
ccc::CC0x0y5 ::CC0x0y5(){ note_ctor("_ZN3ccc7CC0x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y5E, buf);
    ::ccc::CC0x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y5E);
    dp->::ccc::CC0x0y5::~CC0x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y5E(Test__ZN3ccc7CC0x0y5E, "_ZN3ccc7CC0x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y5C1Ev();
extern void _ZN3ccc7CC0x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y5E[] = {
  NSPAIR(_ZN3ccc7CC0x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y5E[];
extern void _ZN3ccc7CC0x0y53abcEv();
extern void _ZN3ccc7CC0x0y53efgEv();
extern void _ZN3ccc7CC0x0y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53abcEv,_ZThn4_N3ccc7CC0x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53efgEv,_ZThn4_N3ccc7CC0x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y53pqrEv,_ZThn4_N3ccc7CC0x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y53abcEv,_ZThn4_N3ccc7CC0x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y53efgEv,_ZThn4_N3ccc7CC0x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y53pqrEv,_ZThn4_N3ccc7CC0x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y5E[];
Class_Descriptor cd__ZN3ccc7CC0x0y5E = {  "_ZN3ccc7CC0x0y5E", // class name
  bases__ZN3ccc7CC0x0y5E, 2,
  &(vtc__ZN3ccc7CC0x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y6  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x0y63efgEv
  ~CC0x0y6(); // tgen
  CC0x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y6E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y63abcEv");}
void  ccc::CC0x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y63efgEv");}
ccc::CC0x0y6 ::~CC0x0y6(){ note_dtor("_ZN3ccc7CC0x0y6E", this);} // tgen
ccc::CC0x0y6 ::CC0x0y6(){ note_ctor("_ZN3ccc7CC0x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y6E, buf);
    ::ccc::CC0x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y6E);
    dp->::ccc::CC0x0y6::~CC0x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y6E(Test__ZN3ccc7CC0x0y6E, "_ZN3ccc7CC0x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y6C1Ev();
extern void _ZN3ccc7CC0x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y6E[] = {
  NSPAIR(_ZN3ccc7CC0x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y6E[];
extern void _ZN3ccc7CC0x0y63abcEv();
extern void _ZN3ccc7CC0x0y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y63abcEv,_ZThn4_N3ccc7CC0x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y63efgEv,_ZThn4_N3ccc7CC0x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y63abcEv,_ZThn4_N3ccc7CC0x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y63efgEv,_ZThn4_N3ccc7CC0x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y6E[];
Class_Descriptor cd__ZN3ccc7CC0x0y6E = {  "_ZN3ccc7CC0x0y6E", // class name
  bases__ZN3ccc7CC0x0y6E, 2,
  &(vtc__ZN3ccc7CC0x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y7  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC0x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y73pqrEv
  ~CC0x0y7(); // tgen
  CC0x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y7E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y73abcEv");}
void  ccc::CC0x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y73pqrEv");}
ccc::CC0x0y7 ::~CC0x0y7(){ note_dtor("_ZN3ccc7CC0x0y7E", this);} // tgen
ccc::CC0x0y7 ::CC0x0y7(){ note_ctor("_ZN3ccc7CC0x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y7E, buf);
    ::ccc::CC0x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y7E);
    dp->::ccc::CC0x0y7::~CC0x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y7E(Test__ZN3ccc7CC0x0y7E, "_ZN3ccc7CC0x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y7C1Ev();
extern void _ZN3ccc7CC0x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y7E[] = {
  NSPAIR(_ZN3ccc7CC0x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y7E[];
extern void _ZN3ccc7CC0x0y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y73abcEv,_ZThn4_N3ccc7CC0x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y73pqrEv,_ZThn4_N3ccc7CC0x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y73abcEv,_ZThn4_N3ccc7CC0x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y73pqrEv,_ZThn4_N3ccc7CC0x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y7E[];
Class_Descriptor cd__ZN3ccc7CC0x0y7E = {  "_ZN3ccc7CC0x0y7E", // class name
  bases__ZN3ccc7CC0x0y7E, 2,
  &(vtc__ZN3ccc7CC0x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y8  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x0y83abcEv
  ~CC0x0y8(); // tgen
  CC0x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y8E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y83efgEv");}
void  ccc::CC0x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x0y83abcEv");}
ccc::CC0x0y8 ::~CC0x0y8(){ note_dtor("_ZN3ccc7CC0x0y8E", this);} // tgen
ccc::CC0x0y8 ::CC0x0y8(){ note_ctor("_ZN3ccc7CC0x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y8E, buf);
    ::ccc::CC0x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y8E);
    dp->::ccc::CC0x0y8::~CC0x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y8E(Test__ZN3ccc7CC0x0y8E, "_ZN3ccc7CC0x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y8C1Ev();
extern void _ZN3ccc7CC0x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y8E[] = {
  NSPAIR(_ZN3ccc7CC0x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y8E[];
extern void _ZN3ccc7CC0x0y83abcEv();
extern void _ZN3ccc7CC0x0y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y83abcEv,_ZThn4_N3ccc7CC0x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y83efgEv,_ZThn4_N3ccc7CC0x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y83abcEv,_ZThn4_N3ccc7CC0x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y83efgEv,_ZThn4_N3ccc7CC0x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y8E[];
Class_Descriptor cd__ZN3ccc7CC0x0y8E = {  "_ZN3ccc7CC0x0y8E", // class name
  bases__ZN3ccc7CC0x0y8E, 2,
  &(vtc__ZN3ccc7CC0x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y9  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC0x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x0y93pqrEv
  ~CC0x0y9(); // tgen
  CC0x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x0y9E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x0y93efgEv");}
void  ccc::CC0x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x0y93pqrEv");}
ccc::CC0x0y9 ::~CC0x0y9(){ note_dtor("_ZN3ccc7CC0x0y9E", this);} // tgen
ccc::CC0x0y9 ::CC0x0y9(){ note_ctor("_ZN3ccc7CC0x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x0y9E, buf);
    ::ccc::CC0x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x0y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC0x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x0y9E);
    dp->::ccc::CC0x0y9::~CC0x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x0y9E(Test__ZN3ccc7CC0x0y9E, "_ZN3ccc7CC0x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x0y9C1Ev();
extern void _ZN3ccc7CC0x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x0y9E[] = {
  NSPAIR(_ZN3ccc7CC0x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC0x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x0y93efgEv();
extern void _ZN3ccc7CC0x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y93efgEv,_ZThn4_N3ccc7CC0x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x0y93pqrEv,_ZThn4_N3ccc7CC0x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y93efgEv,_ZThn4_N3ccc7CC0x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x0y93pqrEv,_ZThn4_N3ccc7CC0x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x0y9E[];
Class_Descriptor cd__ZN3ccc7CC0x0y9E = {  "_ZN3ccc7CC0x0y9E", // class name
  bases__ZN3ccc7CC0x0y9E, 2,
  &(vtc__ZN3ccc7CC0x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y10  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x0y103abcEv
  ~CC0x0y10(); // tgen
  CC0x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y10E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y103pqrEv");}
void  ccc::CC0x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x0y103abcEv");}
ccc::CC0x0y10 ::~CC0x0y10(){ note_dtor("_ZN3ccc8CC0x0y10E", this);} // tgen
ccc::CC0x0y10 ::CC0x0y10(){ note_ctor("_ZN3ccc8CC0x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y10E, buf);
    ::ccc::CC0x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y10E);
    dp->::ccc::CC0x0y10::~CC0x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y10E(Test__ZN3ccc8CC0x0y10E, "_ZN3ccc8CC0x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y10C1Ev();
extern void _ZN3ccc8CC0x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y10E[] = {
  NSPAIR(_ZN3ccc8CC0x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y10E[];
extern void _ZN3ccc8CC0x0y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y103abcEv,_ZThn4_N3ccc8CC0x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y103pqrEv,_ZThn4_N3ccc8CC0x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y103abcEv,_ZThn4_N3ccc8CC0x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y103pqrEv,_ZThn4_N3ccc8CC0x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y10E[];
Class_Descriptor cd__ZN3ccc8CC0x0y10E = {  "_ZN3ccc8CC0x0y10E", // class name
  bases__ZN3ccc8CC0x0y10E, 2,
  &(vtc__ZN3ccc8CC0x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y11  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x0y113efgEv
  ~CC0x0y11(); // tgen
  CC0x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y11E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y113pqrEv");}
void  ccc::CC0x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x0y113efgEv");}
ccc::CC0x0y11 ::~CC0x0y11(){ note_dtor("_ZN3ccc8CC0x0y11E", this);} // tgen
ccc::CC0x0y11 ::CC0x0y11(){ note_ctor("_ZN3ccc8CC0x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y11E, buf);
    ::ccc::CC0x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y11E);
    dp->::ccc::CC0x0y11::~CC0x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y11E(Test__ZN3ccc8CC0x0y11E, "_ZN3ccc8CC0x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y11C1Ev();
extern void _ZN3ccc8CC0x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y11E[] = {
  NSPAIR(_ZN3ccc8CC0x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x0y113efgEv();
extern void _ZN3ccc8CC0x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y113efgEv,_ZThn4_N3ccc8CC0x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y113pqrEv,_ZThn4_N3ccc8CC0x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y113efgEv,_ZThn4_N3ccc8CC0x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y113pqrEv,_ZThn4_N3ccc8CC0x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y11E[];
Class_Descriptor cd__ZN3ccc8CC0x0y11E = {  "_ZN3ccc8CC0x0y11E", // class name
  bases__ZN3ccc8CC0x0y11E, 2,
  &(vtc__ZN3ccc8CC0x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y12  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC0x0y123abcEv
  ~CC0x0y12(); // tgen
  CC0x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x0y123abcEv");}
ccc::CC0x0y12 ::~CC0x0y12(){ note_dtor("_ZN3ccc8CC0x0y12E", this);} // tgen
ccc::CC0x0y12 ::CC0x0y12(){ note_ctor("_ZN3ccc8CC0x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y12E, buf);
    ::ccc::CC0x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y12E);
    dp->::ccc::CC0x0y12::~CC0x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y12E(Test__ZN3ccc8CC0x0y12E, "_ZN3ccc8CC0x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y12C1Ev();
extern void _ZN3ccc8CC0x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y12E[] = {
  NSPAIR(_ZN3ccc8CC0x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y12E[];
extern void _ZN3ccc8CC0x0y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y123abcEv,_ZThn4_N3ccc8CC0x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y123abcEv,_ZThn4_N3ccc8CC0x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y12E[];
Class_Descriptor cd__ZN3ccc8CC0x0y12E = {  "_ZN3ccc8CC0x0y12E", // class name
  bases__ZN3ccc8CC0x0y12E, 2,
  &(vtc__ZN3ccc8CC0x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y13  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC0x0y133efgEv
  ~CC0x0y13(); // tgen
  CC0x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x0y133efgEv");}
ccc::CC0x0y13 ::~CC0x0y13(){ note_dtor("_ZN3ccc8CC0x0y13E", this);} // tgen
ccc::CC0x0y13 ::CC0x0y13(){ note_ctor("_ZN3ccc8CC0x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y13E, buf);
    ::ccc::CC0x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y13E);
    dp->::ccc::CC0x0y13::~CC0x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y13E(Test__ZN3ccc8CC0x0y13E, "_ZN3ccc8CC0x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y13C1Ev();
extern void _ZN3ccc8CC0x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y13E[] = {
  NSPAIR(_ZN3ccc8CC0x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x0y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y133efgEv,_ZThn4_N3ccc8CC0x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y133efgEv,_ZThn4_N3ccc8CC0x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y13E[];
Class_Descriptor cd__ZN3ccc8CC0x0y13E = {  "_ZN3ccc8CC0x0y13E", // class name
  bases__ZN3ccc8CC0x0y13E, 2,
  &(vtc__ZN3ccc8CC0x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y14  : ::ccc::AA0 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC0x0y143pqrEv
  ~CC0x0y14(); // tgen
  CC0x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x0y143pqrEv");}
ccc::CC0x0y14 ::~CC0x0y14(){ note_dtor("_ZN3ccc8CC0x0y14E", this);} // tgen
ccc::CC0x0y14 ::CC0x0y14(){ note_ctor("_ZN3ccc8CC0x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y14E, buf);
    ::ccc::CC0x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y14E);
    dp->::ccc::CC0x0y14::~CC0x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y14E(Test__ZN3ccc8CC0x0y14E, "_ZN3ccc8CC0x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y14C1Ev();
extern void _ZN3ccc8CC0x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y14E[] = {
  NSPAIR(_ZN3ccc8CC0x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x0y143pqrEv,_ZThn4_N3ccc8CC0x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x0y143pqrEv,_ZThn4_N3ccc8CC0x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y14E[];
Class_Descriptor cd__ZN3ccc8CC0x0y14E = {  "_ZN3ccc8CC0x0y14E", // class name
  bases__ZN3ccc8CC0x0y14E, 2,
  &(vtc__ZN3ccc8CC0x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x0y15  : ::ccc::AA0 , ::ccc::BB0 {
  ~CC0x0y15(); // tgen
  CC0x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x0y15 ::~CC0x0y15(){ note_dtor("_ZN3ccc8CC0x0y15E", this);} // tgen
ccc::CC0x0y15 ::CC0x0y15(){ note_ctor("_ZN3ccc8CC0x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x0y15E, buf);
    ::ccc::CC0x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x0y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC0x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x0y15E);
    dp->::ccc::CC0x0y15::~CC0x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x0y15E(Test__ZN3ccc8CC0x0y15E, "_ZN3ccc8CC0x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x0y15C1Ev();
extern void _ZN3ccc8CC0x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x0y15E[] = {
  NSPAIR(_ZN3ccc8CC0x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC0x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x0y15E[];
Class_Descriptor cd__ZN3ccc8CC0x0y15E = {  "_ZN3ccc8CC0x0y15E", // class name
  bases__ZN3ccc8CC0x0y15E, 2,
  &(vtc__ZN3ccc8CC0x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y0  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y03pqrEv
  ~CC0x1y0(); // tgen
  CC0x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y0E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y03abcEv");}
void  ccc::CC0x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y03efgEv");}
void  ccc::CC0x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y03pqrEv");}
ccc::CC0x1y0 ::~CC0x1y0(){ note_dtor("_ZN3ccc7CC0x1y0E", this);} // tgen
ccc::CC0x1y0 ::CC0x1y0(){ note_ctor("_ZN3ccc7CC0x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y0E, buf);
    ::ccc::CC0x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y0E);
    dp->::ccc::CC0x1y0::~CC0x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y0E(Test__ZN3ccc7CC0x1y0E, "_ZN3ccc7CC0x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y0C1Ev();
extern void _ZN3ccc7CC0x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y0E[] = {
  NSPAIR(_ZN3ccc7CC0x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y0E[];
extern void _ZN3ccc7CC0x1y03abcEv();
extern void _ZN3ccc7CC0x1y03efgEv();
extern void _ZN3ccc7CC0x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03abcEv,_ZThn4_N3ccc7CC0x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03pqrEv,_ZThn4_N3ccc7CC0x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y03efgEv,_ZThn4_N3ccc7CC0x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y03abcEv,_ZThn4_N3ccc7CC0x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y03pqrEv,_ZThn4_N3ccc7CC0x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y03efgEv,_ZThn4_N3ccc7CC0x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y0E[];
Class_Descriptor cd__ZN3ccc7CC0x1y0E = {  "_ZN3ccc7CC0x1y0E", // class name
  bases__ZN3ccc7CC0x1y0E, 2,
  &(vtc__ZN3ccc7CC0x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y1  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x1y13efgEv
  ~CC0x1y1(); // tgen
  CC0x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y1E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y13abcEv");}
void  ccc::CC0x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y13pqrEv");}
void  ccc::CC0x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y13efgEv");}
ccc::CC0x1y1 ::~CC0x1y1(){ note_dtor("_ZN3ccc7CC0x1y1E", this);} // tgen
ccc::CC0x1y1 ::CC0x1y1(){ note_ctor("_ZN3ccc7CC0x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y1E, buf);
    ::ccc::CC0x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y1E);
    dp->::ccc::CC0x1y1::~CC0x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y1E(Test__ZN3ccc7CC0x1y1E, "_ZN3ccc7CC0x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y1C1Ev();
extern void _ZN3ccc7CC0x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y1E[] = {
  NSPAIR(_ZN3ccc7CC0x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y1E[];
extern void _ZN3ccc7CC0x1y13abcEv();
extern void _ZN3ccc7CC0x1y13efgEv();
extern void _ZN3ccc7CC0x1y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13abcEv,_ZThn4_N3ccc7CC0x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13pqrEv,_ZThn4_N3ccc7CC0x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y13efgEv,_ZThn4_N3ccc7CC0x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y13abcEv,_ZThn4_N3ccc7CC0x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y13pqrEv,_ZThn4_N3ccc7CC0x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y13efgEv,_ZThn4_N3ccc7CC0x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y1E[];
Class_Descriptor cd__ZN3ccc7CC0x1y1E = {  "_ZN3ccc7CC0x1y1E", // class name
  bases__ZN3ccc7CC0x1y1E, 2,
  &(vtc__ZN3ccc7CC0x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y2  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y23pqrEv
  ~CC0x1y2(); // tgen
  CC0x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y2E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y23efgEv");}
void  ccc::CC0x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y23abcEv");}
void  ccc::CC0x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y23pqrEv");}
ccc::CC0x1y2 ::~CC0x1y2(){ note_dtor("_ZN3ccc7CC0x1y2E", this);} // tgen
ccc::CC0x1y2 ::CC0x1y2(){ note_ctor("_ZN3ccc7CC0x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y2E, buf);
    ::ccc::CC0x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y2E);
    dp->::ccc::CC0x1y2::~CC0x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y2E(Test__ZN3ccc7CC0x1y2E, "_ZN3ccc7CC0x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y2C1Ev();
extern void _ZN3ccc7CC0x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y2E[] = {
  NSPAIR(_ZN3ccc7CC0x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y2E[];
extern void _ZN3ccc7CC0x1y23abcEv();
extern void _ZN3ccc7CC0x1y23efgEv();
extern void _ZN3ccc7CC0x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23abcEv,_ZThn4_N3ccc7CC0x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23pqrEv,_ZThn4_N3ccc7CC0x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y23efgEv,_ZThn4_N3ccc7CC0x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y23abcEv,_ZThn4_N3ccc7CC0x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y23pqrEv,_ZThn4_N3ccc7CC0x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y23efgEv,_ZThn4_N3ccc7CC0x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y2E[];
Class_Descriptor cd__ZN3ccc7CC0x1y2E = {  "_ZN3ccc7CC0x1y2E", // class name
  bases__ZN3ccc7CC0x1y2E, 2,
  &(vtc__ZN3ccc7CC0x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y3  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x1y33abcEv
  ~CC0x1y3(); // tgen
  CC0x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y3E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y33efgEv");}
void  ccc::CC0x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y33pqrEv");}
void  ccc::CC0x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y33abcEv");}
ccc::CC0x1y3 ::~CC0x1y3(){ note_dtor("_ZN3ccc7CC0x1y3E", this);} // tgen
ccc::CC0x1y3 ::CC0x1y3(){ note_ctor("_ZN3ccc7CC0x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y3E, buf);
    ::ccc::CC0x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y3E);
    dp->::ccc::CC0x1y3::~CC0x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y3E(Test__ZN3ccc7CC0x1y3E, "_ZN3ccc7CC0x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y3C1Ev();
extern void _ZN3ccc7CC0x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y3E[] = {
  NSPAIR(_ZN3ccc7CC0x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y3E[];
extern void _ZN3ccc7CC0x1y33abcEv();
extern void _ZN3ccc7CC0x1y33efgEv();
extern void _ZN3ccc7CC0x1y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33abcEv,_ZThn4_N3ccc7CC0x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33pqrEv,_ZThn4_N3ccc7CC0x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y33efgEv,_ZThn4_N3ccc7CC0x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y33abcEv,_ZThn4_N3ccc7CC0x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y33pqrEv,_ZThn4_N3ccc7CC0x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y33efgEv,_ZThn4_N3ccc7CC0x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y3E[];
Class_Descriptor cd__ZN3ccc7CC0x1y3E = {  "_ZN3ccc7CC0x1y3E", // class name
  bases__ZN3ccc7CC0x1y3E, 2,
  &(vtc__ZN3ccc7CC0x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y4  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC0x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y43efgEv
  ~CC0x1y4(); // tgen
  CC0x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y4E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y43pqrEv");}
void  ccc::CC0x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y43abcEv");}
void  ccc::CC0x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y43efgEv");}
ccc::CC0x1y4 ::~CC0x1y4(){ note_dtor("_ZN3ccc7CC0x1y4E", this);} // tgen
ccc::CC0x1y4 ::CC0x1y4(){ note_ctor("_ZN3ccc7CC0x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y4E, buf);
    ::ccc::CC0x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y4E);
    dp->::ccc::CC0x1y4::~CC0x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y4E(Test__ZN3ccc7CC0x1y4E, "_ZN3ccc7CC0x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y4C1Ev();
extern void _ZN3ccc7CC0x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y4E[] = {
  NSPAIR(_ZN3ccc7CC0x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y4E[];
extern void _ZN3ccc7CC0x1y43abcEv();
extern void _ZN3ccc7CC0x1y43efgEv();
extern void _ZN3ccc7CC0x1y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43abcEv,_ZThn4_N3ccc7CC0x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43pqrEv,_ZThn4_N3ccc7CC0x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y43efgEv,_ZThn4_N3ccc7CC0x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y43abcEv,_ZThn4_N3ccc7CC0x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y43pqrEv,_ZThn4_N3ccc7CC0x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y43efgEv,_ZThn4_N3ccc7CC0x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y4E[];
Class_Descriptor cd__ZN3ccc7CC0x1y4E = {  "_ZN3ccc7CC0x1y4E", // class name
  bases__ZN3ccc7CC0x1y4E, 2,
  &(vtc__ZN3ccc7CC0x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y5  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC0x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y53abcEv
  ~CC0x1y5(); // tgen
  CC0x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y5E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y53pqrEv");}
void  ccc::CC0x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y53efgEv");}
void  ccc::CC0x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y53abcEv");}
ccc::CC0x1y5 ::~CC0x1y5(){ note_dtor("_ZN3ccc7CC0x1y5E", this);} // tgen
ccc::CC0x1y5 ::CC0x1y5(){ note_ctor("_ZN3ccc7CC0x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y5E, buf);
    ::ccc::CC0x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y5E);
    dp->::ccc::CC0x1y5::~CC0x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y5E(Test__ZN3ccc7CC0x1y5E, "_ZN3ccc7CC0x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y5C1Ev();
extern void _ZN3ccc7CC0x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y5E[] = {
  NSPAIR(_ZN3ccc7CC0x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y5E[];
extern void _ZN3ccc7CC0x1y53abcEv();
extern void _ZN3ccc7CC0x1y53efgEv();
extern void _ZN3ccc7CC0x1y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53abcEv,_ZThn4_N3ccc7CC0x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53pqrEv,_ZThn4_N3ccc7CC0x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y53efgEv,_ZThn4_N3ccc7CC0x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y53abcEv,_ZThn4_N3ccc7CC0x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y53pqrEv,_ZThn4_N3ccc7CC0x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y53efgEv,_ZThn4_N3ccc7CC0x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y5E[];
Class_Descriptor cd__ZN3ccc7CC0x1y5E = {  "_ZN3ccc7CC0x1y5E", // class name
  bases__ZN3ccc7CC0x1y5E, 2,
  &(vtc__ZN3ccc7CC0x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y6  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x1y63efgEv
  ~CC0x1y6(); // tgen
  CC0x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y6E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y63abcEv");}
void  ccc::CC0x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y63efgEv");}
ccc::CC0x1y6 ::~CC0x1y6(){ note_dtor("_ZN3ccc7CC0x1y6E", this);} // tgen
ccc::CC0x1y6 ::CC0x1y6(){ note_ctor("_ZN3ccc7CC0x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y6E, buf);
    ::ccc::CC0x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y6E);
    dp->::ccc::CC0x1y6::~CC0x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y6E(Test__ZN3ccc7CC0x1y6E, "_ZN3ccc7CC0x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y6C1Ev();
extern void _ZN3ccc7CC0x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y6E[] = {
  NSPAIR(_ZN3ccc7CC0x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y6E[];
extern void _ZN3ccc7CC0x1y63abcEv();
extern void _ZN3ccc7CC0x1y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y63abcEv,_ZThn4_N3ccc7CC0x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y63efgEv,_ZThn4_N3ccc7CC0x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y63abcEv,_ZThn4_N3ccc7CC0x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y63efgEv,_ZThn4_N3ccc7CC0x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y6E[];
Class_Descriptor cd__ZN3ccc7CC0x1y6E = {  "_ZN3ccc7CC0x1y6E", // class name
  bases__ZN3ccc7CC0x1y6E, 2,
  &(vtc__ZN3ccc7CC0x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y7  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC0x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y73pqrEv
  ~CC0x1y7(); // tgen
  CC0x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y7E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y73abcEv");}
void  ccc::CC0x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y73pqrEv");}
ccc::CC0x1y7 ::~CC0x1y7(){ note_dtor("_ZN3ccc7CC0x1y7E", this);} // tgen
ccc::CC0x1y7 ::CC0x1y7(){ note_ctor("_ZN3ccc7CC0x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y7E, buf);
    ::ccc::CC0x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y7E);
    dp->::ccc::CC0x1y7::~CC0x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y7E(Test__ZN3ccc7CC0x1y7E, "_ZN3ccc7CC0x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y7C1Ev();
extern void _ZN3ccc7CC0x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y7E[] = {
  NSPAIR(_ZN3ccc7CC0x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y7E[];
extern void _ZN3ccc7CC0x1y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y73abcEv,_ZThn4_N3ccc7CC0x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y73pqrEv,_ZThn4_N3ccc7CC0x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y73abcEv,_ZThn4_N3ccc7CC0x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y73pqrEv,_ZThn4_N3ccc7CC0x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y7E[];
Class_Descriptor cd__ZN3ccc7CC0x1y7E = {  "_ZN3ccc7CC0x1y7E", // class name
  bases__ZN3ccc7CC0x1y7E, 2,
  &(vtc__ZN3ccc7CC0x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y8  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x1y83abcEv
  ~CC0x1y8(); // tgen
  CC0x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y8E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y83efgEv");}
void  ccc::CC0x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x1y83abcEv");}
ccc::CC0x1y8 ::~CC0x1y8(){ note_dtor("_ZN3ccc7CC0x1y8E", this);} // tgen
ccc::CC0x1y8 ::CC0x1y8(){ note_ctor("_ZN3ccc7CC0x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y8E, buf);
    ::ccc::CC0x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y8E);
    dp->::ccc::CC0x1y8::~CC0x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y8E(Test__ZN3ccc7CC0x1y8E, "_ZN3ccc7CC0x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y8C1Ev();
extern void _ZN3ccc7CC0x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y8E[] = {
  NSPAIR(_ZN3ccc7CC0x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y8E[];
extern void _ZN3ccc7CC0x1y83abcEv();
extern void _ZN3ccc7CC0x1y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y83abcEv,_ZThn4_N3ccc7CC0x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y83efgEv,_ZThn4_N3ccc7CC0x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y83abcEv,_ZThn4_N3ccc7CC0x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y83efgEv,_ZThn4_N3ccc7CC0x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y8E[];
Class_Descriptor cd__ZN3ccc7CC0x1y8E = {  "_ZN3ccc7CC0x1y8E", // class name
  bases__ZN3ccc7CC0x1y8E, 2,
  &(vtc__ZN3ccc7CC0x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y9  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC0x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x1y93pqrEv
  ~CC0x1y9(); // tgen
  CC0x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x1y9E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x1y93efgEv");}
void  ccc::CC0x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x1y93pqrEv");}
ccc::CC0x1y9 ::~CC0x1y9(){ note_dtor("_ZN3ccc7CC0x1y9E", this);} // tgen
ccc::CC0x1y9 ::CC0x1y9(){ note_ctor("_ZN3ccc7CC0x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x1y9E, buf);
    ::ccc::CC0x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x1y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC0x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x1y9E);
    dp->::ccc::CC0x1y9::~CC0x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x1y9E(Test__ZN3ccc7CC0x1y9E, "_ZN3ccc7CC0x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x1y9C1Ev();
extern void _ZN3ccc7CC0x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x1y9E[] = {
  NSPAIR(_ZN3ccc7CC0x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC0x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x1y93efgEv();
extern void _ZN3ccc7CC0x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y93pqrEv,_ZThn4_N3ccc7CC0x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x1y93efgEv,_ZThn4_N3ccc7CC0x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y93pqrEv,_ZThn4_N3ccc7CC0x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x1y93efgEv,_ZThn4_N3ccc7CC0x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x1y9E[];
Class_Descriptor cd__ZN3ccc7CC0x1y9E = {  "_ZN3ccc7CC0x1y9E", // class name
  bases__ZN3ccc7CC0x1y9E, 2,
  &(vtc__ZN3ccc7CC0x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y10  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x1y103abcEv
  ~CC0x1y10(); // tgen
  CC0x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y10E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y103pqrEv");}
void  ccc::CC0x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x1y103abcEv");}
ccc::CC0x1y10 ::~CC0x1y10(){ note_dtor("_ZN3ccc8CC0x1y10E", this);} // tgen
ccc::CC0x1y10 ::CC0x1y10(){ note_ctor("_ZN3ccc8CC0x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y10E, buf);
    ::ccc::CC0x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y10E);
    dp->::ccc::CC0x1y10::~CC0x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y10E(Test__ZN3ccc8CC0x1y10E, "_ZN3ccc8CC0x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y10C1Ev();
extern void _ZN3ccc8CC0x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y10E[] = {
  NSPAIR(_ZN3ccc8CC0x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y10E[];
extern void _ZN3ccc8CC0x1y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y103abcEv,_ZThn4_N3ccc8CC0x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y103pqrEv,_ZThn4_N3ccc8CC0x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y103abcEv,_ZThn4_N3ccc8CC0x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y103pqrEv,_ZThn4_N3ccc8CC0x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y10E[];
Class_Descriptor cd__ZN3ccc8CC0x1y10E = {  "_ZN3ccc8CC0x1y10E", // class name
  bases__ZN3ccc8CC0x1y10E, 2,
  &(vtc__ZN3ccc8CC0x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y11  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x1y113efgEv
  ~CC0x1y11(); // tgen
  CC0x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y11E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y113pqrEv");}
void  ccc::CC0x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x1y113efgEv");}
ccc::CC0x1y11 ::~CC0x1y11(){ note_dtor("_ZN3ccc8CC0x1y11E", this);} // tgen
ccc::CC0x1y11 ::CC0x1y11(){ note_ctor("_ZN3ccc8CC0x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y11E, buf);
    ::ccc::CC0x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y11E);
    dp->::ccc::CC0x1y11::~CC0x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y11E(Test__ZN3ccc8CC0x1y11E, "_ZN3ccc8CC0x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y11C1Ev();
extern void _ZN3ccc8CC0x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y11E[] = {
  NSPAIR(_ZN3ccc8CC0x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x1y113efgEv();
extern void _ZN3ccc8CC0x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y113pqrEv,_ZThn4_N3ccc8CC0x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y113efgEv,_ZThn4_N3ccc8CC0x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y113pqrEv,_ZThn4_N3ccc8CC0x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y113efgEv,_ZThn4_N3ccc8CC0x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y11E[];
Class_Descriptor cd__ZN3ccc8CC0x1y11E = {  "_ZN3ccc8CC0x1y11E", // class name
  bases__ZN3ccc8CC0x1y11E, 2,
  &(vtc__ZN3ccc8CC0x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y12  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC0x1y123abcEv
  ~CC0x1y12(); // tgen
  CC0x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x1y123abcEv");}
ccc::CC0x1y12 ::~CC0x1y12(){ note_dtor("_ZN3ccc8CC0x1y12E", this);} // tgen
ccc::CC0x1y12 ::CC0x1y12(){ note_ctor("_ZN3ccc8CC0x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y12E, buf);
    ::ccc::CC0x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y12E);
    dp->::ccc::CC0x1y12::~CC0x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y12E(Test__ZN3ccc8CC0x1y12E, "_ZN3ccc8CC0x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y12C1Ev();
extern void _ZN3ccc8CC0x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y12E[] = {
  NSPAIR(_ZN3ccc8CC0x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y12E[];
extern void _ZN3ccc8CC0x1y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y123abcEv,_ZThn4_N3ccc8CC0x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y123abcEv,_ZThn4_N3ccc8CC0x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y12E[];
Class_Descriptor cd__ZN3ccc8CC0x1y12E = {  "_ZN3ccc8CC0x1y12E", // class name
  bases__ZN3ccc8CC0x1y12E, 2,
  &(vtc__ZN3ccc8CC0x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y13  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC0x1y133efgEv
  ~CC0x1y13(); // tgen
  CC0x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x1y133efgEv");}
ccc::CC0x1y13 ::~CC0x1y13(){ note_dtor("_ZN3ccc8CC0x1y13E", this);} // tgen
ccc::CC0x1y13 ::CC0x1y13(){ note_ctor("_ZN3ccc8CC0x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y13E, buf);
    ::ccc::CC0x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y13E);
    dp->::ccc::CC0x1y13::~CC0x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y13E(Test__ZN3ccc8CC0x1y13E, "_ZN3ccc8CC0x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y13C1Ev();
extern void _ZN3ccc8CC0x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y13E[] = {
  NSPAIR(_ZN3ccc8CC0x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x1y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y133efgEv,_ZThn4_N3ccc8CC0x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y133efgEv,_ZThn4_N3ccc8CC0x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y13E[];
Class_Descriptor cd__ZN3ccc8CC0x1y13E = {  "_ZN3ccc8CC0x1y13E", // class name
  bases__ZN3ccc8CC0x1y13E, 2,
  &(vtc__ZN3ccc8CC0x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y14  : ::ccc::AA0 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC0x1y143pqrEv
  ~CC0x1y14(); // tgen
  CC0x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x1y143pqrEv");}
ccc::CC0x1y14 ::~CC0x1y14(){ note_dtor("_ZN3ccc8CC0x1y14E", this);} // tgen
ccc::CC0x1y14 ::CC0x1y14(){ note_ctor("_ZN3ccc8CC0x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y14E, buf);
    ::ccc::CC0x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y14E);
    dp->::ccc::CC0x1y14::~CC0x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y14E(Test__ZN3ccc8CC0x1y14E, "_ZN3ccc8CC0x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y14C1Ev();
extern void _ZN3ccc8CC0x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y14E[] = {
  NSPAIR(_ZN3ccc8CC0x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x1y143pqrEv,_ZThn4_N3ccc8CC0x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x1y143pqrEv,_ZThn4_N3ccc8CC0x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y14E[];
Class_Descriptor cd__ZN3ccc8CC0x1y14E = {  "_ZN3ccc8CC0x1y14E", // class name
  bases__ZN3ccc8CC0x1y14E, 2,
  &(vtc__ZN3ccc8CC0x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x1y15  : ::ccc::AA0 , ::ccc::BB1 {
  ~CC0x1y15(); // tgen
  CC0x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x1y15 ::~CC0x1y15(){ note_dtor("_ZN3ccc8CC0x1y15E", this);} // tgen
ccc::CC0x1y15 ::CC0x1y15(){ note_ctor("_ZN3ccc8CC0x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x1y15E, buf);
    ::ccc::CC0x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x1y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC0x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x1y15E);
    dp->::ccc::CC0x1y15::~CC0x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x1y15E(Test__ZN3ccc8CC0x1y15E, "_ZN3ccc8CC0x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x1y15C1Ev();
extern void _ZN3ccc8CC0x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x1y15E[] = {
  NSPAIR(_ZN3ccc8CC0x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC0x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x1y15E[];
Class_Descriptor cd__ZN3ccc8CC0x1y15E = {  "_ZN3ccc8CC0x1y15E", // class name
  bases__ZN3ccc8CC0x1y15E, 2,
  &(vtc__ZN3ccc8CC0x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y0  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y03pqrEv
  ~CC0x2y0(); // tgen
  CC0x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y0E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y03abcEv");}
void  ccc::CC0x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y03efgEv");}
void  ccc::CC0x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y03pqrEv");}
ccc::CC0x2y0 ::~CC0x2y0(){ note_dtor("_ZN3ccc7CC0x2y0E", this);} // tgen
ccc::CC0x2y0 ::CC0x2y0(){ note_ctor("_ZN3ccc7CC0x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y0E, buf);
    ::ccc::CC0x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y0E);
    dp->::ccc::CC0x2y0::~CC0x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y0E(Test__ZN3ccc7CC0x2y0E, "_ZN3ccc7CC0x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y0C1Ev();
extern void _ZN3ccc7CC0x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y0E[] = {
  NSPAIR(_ZN3ccc7CC0x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y0E[];
extern void _ZN3ccc7CC0x2y03abcEv();
extern void _ZN3ccc7CC0x2y03efgEv();
extern void _ZN3ccc7CC0x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03efgEv,_ZThn4_N3ccc7CC0x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03abcEv,_ZThn4_N3ccc7CC0x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y03pqrEv,_ZThn4_N3ccc7CC0x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y03efgEv,_ZThn4_N3ccc7CC0x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y03abcEv,_ZThn4_N3ccc7CC0x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y03pqrEv,_ZThn4_N3ccc7CC0x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y0E[];
Class_Descriptor cd__ZN3ccc7CC0x2y0E = {  "_ZN3ccc7CC0x2y0E", // class name
  bases__ZN3ccc7CC0x2y0E, 2,
  &(vtc__ZN3ccc7CC0x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y1  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x2y13efgEv
  ~CC0x2y1(); // tgen
  CC0x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y1E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y13abcEv");}
void  ccc::CC0x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y13pqrEv");}
void  ccc::CC0x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y13efgEv");}
ccc::CC0x2y1 ::~CC0x2y1(){ note_dtor("_ZN3ccc7CC0x2y1E", this);} // tgen
ccc::CC0x2y1 ::CC0x2y1(){ note_ctor("_ZN3ccc7CC0x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y1E, buf);
    ::ccc::CC0x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y1E);
    dp->::ccc::CC0x2y1::~CC0x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y1E(Test__ZN3ccc7CC0x2y1E, "_ZN3ccc7CC0x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y1C1Ev();
extern void _ZN3ccc7CC0x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y1E[] = {
  NSPAIR(_ZN3ccc7CC0x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y1E[];
extern void _ZN3ccc7CC0x2y13abcEv();
extern void _ZN3ccc7CC0x2y13efgEv();
extern void _ZN3ccc7CC0x2y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13efgEv,_ZThn4_N3ccc7CC0x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13abcEv,_ZThn4_N3ccc7CC0x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y13pqrEv,_ZThn4_N3ccc7CC0x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y13efgEv,_ZThn4_N3ccc7CC0x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y13abcEv,_ZThn4_N3ccc7CC0x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y13pqrEv,_ZThn4_N3ccc7CC0x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y1E[];
Class_Descriptor cd__ZN3ccc7CC0x2y1E = {  "_ZN3ccc7CC0x2y1E", // class name
  bases__ZN3ccc7CC0x2y1E, 2,
  &(vtc__ZN3ccc7CC0x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y2  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y23pqrEv
  ~CC0x2y2(); // tgen
  CC0x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y2E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y23efgEv");}
void  ccc::CC0x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y23abcEv");}
void  ccc::CC0x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y23pqrEv");}
ccc::CC0x2y2 ::~CC0x2y2(){ note_dtor("_ZN3ccc7CC0x2y2E", this);} // tgen
ccc::CC0x2y2 ::CC0x2y2(){ note_ctor("_ZN3ccc7CC0x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y2E, buf);
    ::ccc::CC0x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y2E);
    dp->::ccc::CC0x2y2::~CC0x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y2E(Test__ZN3ccc7CC0x2y2E, "_ZN3ccc7CC0x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y2C1Ev();
extern void _ZN3ccc7CC0x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y2E[] = {
  NSPAIR(_ZN3ccc7CC0x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y2E[];
extern void _ZN3ccc7CC0x2y23abcEv();
extern void _ZN3ccc7CC0x2y23efgEv();
extern void _ZN3ccc7CC0x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23efgEv,_ZThn4_N3ccc7CC0x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23abcEv,_ZThn4_N3ccc7CC0x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y23pqrEv,_ZThn4_N3ccc7CC0x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y23efgEv,_ZThn4_N3ccc7CC0x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y23abcEv,_ZThn4_N3ccc7CC0x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y23pqrEv,_ZThn4_N3ccc7CC0x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y2E[];
Class_Descriptor cd__ZN3ccc7CC0x2y2E = {  "_ZN3ccc7CC0x2y2E", // class name
  bases__ZN3ccc7CC0x2y2E, 2,
  &(vtc__ZN3ccc7CC0x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y3  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x2y33abcEv
  ~CC0x2y3(); // tgen
  CC0x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y3E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y33efgEv");}
void  ccc::CC0x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y33pqrEv");}
void  ccc::CC0x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y33abcEv");}
ccc::CC0x2y3 ::~CC0x2y3(){ note_dtor("_ZN3ccc7CC0x2y3E", this);} // tgen
ccc::CC0x2y3 ::CC0x2y3(){ note_ctor("_ZN3ccc7CC0x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y3E, buf);
    ::ccc::CC0x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y3E);
    dp->::ccc::CC0x2y3::~CC0x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y3E(Test__ZN3ccc7CC0x2y3E, "_ZN3ccc7CC0x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y3C1Ev();
extern void _ZN3ccc7CC0x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y3E[] = {
  NSPAIR(_ZN3ccc7CC0x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y3E[];
extern void _ZN3ccc7CC0x2y33abcEv();
extern void _ZN3ccc7CC0x2y33efgEv();
extern void _ZN3ccc7CC0x2y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33efgEv,_ZThn4_N3ccc7CC0x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33abcEv,_ZThn4_N3ccc7CC0x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y33pqrEv,_ZThn4_N3ccc7CC0x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y33efgEv,_ZThn4_N3ccc7CC0x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y33abcEv,_ZThn4_N3ccc7CC0x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y33pqrEv,_ZThn4_N3ccc7CC0x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y3E[];
Class_Descriptor cd__ZN3ccc7CC0x2y3E = {  "_ZN3ccc7CC0x2y3E", // class name
  bases__ZN3ccc7CC0x2y3E, 2,
  &(vtc__ZN3ccc7CC0x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y4  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC0x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y43efgEv
  ~CC0x2y4(); // tgen
  CC0x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y4E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y43pqrEv");}
void  ccc::CC0x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y43abcEv");}
void  ccc::CC0x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y43efgEv");}
ccc::CC0x2y4 ::~CC0x2y4(){ note_dtor("_ZN3ccc7CC0x2y4E", this);} // tgen
ccc::CC0x2y4 ::CC0x2y4(){ note_ctor("_ZN3ccc7CC0x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y4E, buf);
    ::ccc::CC0x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y4E);
    dp->::ccc::CC0x2y4::~CC0x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y4E(Test__ZN3ccc7CC0x2y4E, "_ZN3ccc7CC0x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y4C1Ev();
extern void _ZN3ccc7CC0x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y4E[] = {
  NSPAIR(_ZN3ccc7CC0x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y4E[];
extern void _ZN3ccc7CC0x2y43abcEv();
extern void _ZN3ccc7CC0x2y43efgEv();
extern void _ZN3ccc7CC0x2y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43efgEv,_ZThn4_N3ccc7CC0x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43abcEv,_ZThn4_N3ccc7CC0x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y43pqrEv,_ZThn4_N3ccc7CC0x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y43efgEv,_ZThn4_N3ccc7CC0x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y43abcEv,_ZThn4_N3ccc7CC0x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y43pqrEv,_ZThn4_N3ccc7CC0x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y4E[];
Class_Descriptor cd__ZN3ccc7CC0x2y4E = {  "_ZN3ccc7CC0x2y4E", // class name
  bases__ZN3ccc7CC0x2y4E, 2,
  &(vtc__ZN3ccc7CC0x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y5  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC0x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y53abcEv
  ~CC0x2y5(); // tgen
  CC0x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y5E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y53pqrEv");}
void  ccc::CC0x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y53efgEv");}
void  ccc::CC0x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y53abcEv");}
ccc::CC0x2y5 ::~CC0x2y5(){ note_dtor("_ZN3ccc7CC0x2y5E", this);} // tgen
ccc::CC0x2y5 ::CC0x2y5(){ note_ctor("_ZN3ccc7CC0x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y5E, buf);
    ::ccc::CC0x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y5E);
    dp->::ccc::CC0x2y5::~CC0x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y5E(Test__ZN3ccc7CC0x2y5E, "_ZN3ccc7CC0x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y5C1Ev();
extern void _ZN3ccc7CC0x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y5E[] = {
  NSPAIR(_ZN3ccc7CC0x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y5E[];
extern void _ZN3ccc7CC0x2y53abcEv();
extern void _ZN3ccc7CC0x2y53efgEv();
extern void _ZN3ccc7CC0x2y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53efgEv,_ZThn4_N3ccc7CC0x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53abcEv,_ZThn4_N3ccc7CC0x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y53pqrEv,_ZThn4_N3ccc7CC0x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y53efgEv,_ZThn4_N3ccc7CC0x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y53abcEv,_ZThn4_N3ccc7CC0x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y53pqrEv,_ZThn4_N3ccc7CC0x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y5E[];
Class_Descriptor cd__ZN3ccc7CC0x2y5E = {  "_ZN3ccc7CC0x2y5E", // class name
  bases__ZN3ccc7CC0x2y5E, 2,
  &(vtc__ZN3ccc7CC0x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y6  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x2y63efgEv
  ~CC0x2y6(); // tgen
  CC0x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y6E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y63abcEv");}
void  ccc::CC0x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y63efgEv");}
ccc::CC0x2y6 ::~CC0x2y6(){ note_dtor("_ZN3ccc7CC0x2y6E", this);} // tgen
ccc::CC0x2y6 ::CC0x2y6(){ note_ctor("_ZN3ccc7CC0x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y6E, buf);
    ::ccc::CC0x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y6E);
    dp->::ccc::CC0x2y6::~CC0x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y6E(Test__ZN3ccc7CC0x2y6E, "_ZN3ccc7CC0x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y6C1Ev();
extern void _ZN3ccc7CC0x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y6E[] = {
  NSPAIR(_ZN3ccc7CC0x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y6E[];
extern void _ZN3ccc7CC0x2y63abcEv();
extern void _ZN3ccc7CC0x2y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y63efgEv,_ZThn4_N3ccc7CC0x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y63abcEv,_ZThn4_N3ccc7CC0x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y63efgEv,_ZThn4_N3ccc7CC0x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y63abcEv,_ZThn4_N3ccc7CC0x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y6E[];
Class_Descriptor cd__ZN3ccc7CC0x2y6E = {  "_ZN3ccc7CC0x2y6E", // class name
  bases__ZN3ccc7CC0x2y6E, 2,
  &(vtc__ZN3ccc7CC0x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y7  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC0x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y73pqrEv
  ~CC0x2y7(); // tgen
  CC0x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y7E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y73abcEv");}
void  ccc::CC0x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y73pqrEv");}
ccc::CC0x2y7 ::~CC0x2y7(){ note_dtor("_ZN3ccc7CC0x2y7E", this);} // tgen
ccc::CC0x2y7 ::CC0x2y7(){ note_ctor("_ZN3ccc7CC0x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y7E, buf);
    ::ccc::CC0x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y7E);
    dp->::ccc::CC0x2y7::~CC0x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y7E(Test__ZN3ccc7CC0x2y7E, "_ZN3ccc7CC0x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y7C1Ev();
extern void _ZN3ccc7CC0x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y7E[] = {
  NSPAIR(_ZN3ccc7CC0x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y7E[];
extern void _ZN3ccc7CC0x2y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y73abcEv,_ZThn4_N3ccc7CC0x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y73pqrEv,_ZThn4_N3ccc7CC0x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y73abcEv,_ZThn4_N3ccc7CC0x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y73pqrEv,_ZThn4_N3ccc7CC0x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y7E[];
Class_Descriptor cd__ZN3ccc7CC0x2y7E = {  "_ZN3ccc7CC0x2y7E", // class name
  bases__ZN3ccc7CC0x2y7E, 2,
  &(vtc__ZN3ccc7CC0x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y8  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x2y83abcEv
  ~CC0x2y8(); // tgen
  CC0x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y8E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y83efgEv");}
void  ccc::CC0x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x2y83abcEv");}
ccc::CC0x2y8 ::~CC0x2y8(){ note_dtor("_ZN3ccc7CC0x2y8E", this);} // tgen
ccc::CC0x2y8 ::CC0x2y8(){ note_ctor("_ZN3ccc7CC0x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y8E, buf);
    ::ccc::CC0x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y8E);
    dp->::ccc::CC0x2y8::~CC0x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y8E(Test__ZN3ccc7CC0x2y8E, "_ZN3ccc7CC0x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y8C1Ev();
extern void _ZN3ccc7CC0x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y8E[] = {
  NSPAIR(_ZN3ccc7CC0x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y8E[];
extern void _ZN3ccc7CC0x2y83abcEv();
extern void _ZN3ccc7CC0x2y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y83efgEv,_ZThn4_N3ccc7CC0x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y83abcEv,_ZThn4_N3ccc7CC0x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y83efgEv,_ZThn4_N3ccc7CC0x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y83abcEv,_ZThn4_N3ccc7CC0x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y8E[];
Class_Descriptor cd__ZN3ccc7CC0x2y8E = {  "_ZN3ccc7CC0x2y8E", // class name
  bases__ZN3ccc7CC0x2y8E, 2,
  &(vtc__ZN3ccc7CC0x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y9  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC0x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x2y93pqrEv
  ~CC0x2y9(); // tgen
  CC0x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x2y9E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x2y93efgEv");}
void  ccc::CC0x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x2y93pqrEv");}
ccc::CC0x2y9 ::~CC0x2y9(){ note_dtor("_ZN3ccc7CC0x2y9E", this);} // tgen
ccc::CC0x2y9 ::CC0x2y9(){ note_ctor("_ZN3ccc7CC0x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x2y9E, buf);
    ::ccc::CC0x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x2y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC0x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x2y9E);
    dp->::ccc::CC0x2y9::~CC0x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x2y9E(Test__ZN3ccc7CC0x2y9E, "_ZN3ccc7CC0x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x2y9C1Ev();
extern void _ZN3ccc7CC0x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x2y9E[] = {
  NSPAIR(_ZN3ccc7CC0x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC0x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x2y93efgEv();
extern void _ZN3ccc7CC0x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y93efgEv,_ZThn4_N3ccc7CC0x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x2y93pqrEv,_ZThn4_N3ccc7CC0x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y93efgEv,_ZThn4_N3ccc7CC0x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x2y93pqrEv,_ZThn4_N3ccc7CC0x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x2y9E[];
Class_Descriptor cd__ZN3ccc7CC0x2y9E = {  "_ZN3ccc7CC0x2y9E", // class name
  bases__ZN3ccc7CC0x2y9E, 2,
  &(vtc__ZN3ccc7CC0x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y10  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x2y103abcEv
  ~CC0x2y10(); // tgen
  CC0x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y10E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y103pqrEv");}
void  ccc::CC0x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x2y103abcEv");}
ccc::CC0x2y10 ::~CC0x2y10(){ note_dtor("_ZN3ccc8CC0x2y10E", this);} // tgen
ccc::CC0x2y10 ::CC0x2y10(){ note_ctor("_ZN3ccc8CC0x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y10E, buf);
    ::ccc::CC0x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y10E);
    dp->::ccc::CC0x2y10::~CC0x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y10E(Test__ZN3ccc8CC0x2y10E, "_ZN3ccc8CC0x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y10C1Ev();
extern void _ZN3ccc8CC0x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y10E[] = {
  NSPAIR(_ZN3ccc8CC0x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y10E[];
extern void _ZN3ccc8CC0x2y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y103abcEv,_ZThn4_N3ccc8CC0x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y103pqrEv,_ZThn4_N3ccc8CC0x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y103abcEv,_ZThn4_N3ccc8CC0x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y103pqrEv,_ZThn4_N3ccc8CC0x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y10E[];
Class_Descriptor cd__ZN3ccc8CC0x2y10E = {  "_ZN3ccc8CC0x2y10E", // class name
  bases__ZN3ccc8CC0x2y10E, 2,
  &(vtc__ZN3ccc8CC0x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y11  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x2y113efgEv
  ~CC0x2y11(); // tgen
  CC0x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y11E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y113pqrEv");}
void  ccc::CC0x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x2y113efgEv");}
ccc::CC0x2y11 ::~CC0x2y11(){ note_dtor("_ZN3ccc8CC0x2y11E", this);} // tgen
ccc::CC0x2y11 ::CC0x2y11(){ note_ctor("_ZN3ccc8CC0x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y11E, buf);
    ::ccc::CC0x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y11E);
    dp->::ccc::CC0x2y11::~CC0x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y11E(Test__ZN3ccc8CC0x2y11E, "_ZN3ccc8CC0x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y11C1Ev();
extern void _ZN3ccc8CC0x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y11E[] = {
  NSPAIR(_ZN3ccc8CC0x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x2y113efgEv();
extern void _ZN3ccc8CC0x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y113efgEv,_ZThn4_N3ccc8CC0x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y113pqrEv,_ZThn4_N3ccc8CC0x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y113efgEv,_ZThn4_N3ccc8CC0x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y113pqrEv,_ZThn4_N3ccc8CC0x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y11E[];
Class_Descriptor cd__ZN3ccc8CC0x2y11E = {  "_ZN3ccc8CC0x2y11E", // class name
  bases__ZN3ccc8CC0x2y11E, 2,
  &(vtc__ZN3ccc8CC0x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y12  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC0x2y123abcEv
  ~CC0x2y12(); // tgen
  CC0x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x2y123abcEv");}
ccc::CC0x2y12 ::~CC0x2y12(){ note_dtor("_ZN3ccc8CC0x2y12E", this);} // tgen
ccc::CC0x2y12 ::CC0x2y12(){ note_ctor("_ZN3ccc8CC0x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y12E, buf);
    ::ccc::CC0x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y12E);
    dp->::ccc::CC0x2y12::~CC0x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y12E(Test__ZN3ccc8CC0x2y12E, "_ZN3ccc8CC0x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y12C1Ev();
extern void _ZN3ccc8CC0x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y12E[] = {
  NSPAIR(_ZN3ccc8CC0x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y12E[];
extern void _ZN3ccc8CC0x2y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y123abcEv,_ZThn4_N3ccc8CC0x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y123abcEv,_ZThn4_N3ccc8CC0x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y12E[];
Class_Descriptor cd__ZN3ccc8CC0x2y12E = {  "_ZN3ccc8CC0x2y12E", // class name
  bases__ZN3ccc8CC0x2y12E, 2,
  &(vtc__ZN3ccc8CC0x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y13  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC0x2y133efgEv
  ~CC0x2y13(); // tgen
  CC0x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y13E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x2y133efgEv");}
ccc::CC0x2y13 ::~CC0x2y13(){ note_dtor("_ZN3ccc8CC0x2y13E", this);} // tgen
ccc::CC0x2y13 ::CC0x2y13(){ note_ctor("_ZN3ccc8CC0x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y13E, buf);
    ::ccc::CC0x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y13E);
    dp->::ccc::CC0x2y13::~CC0x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y13E(Test__ZN3ccc8CC0x2y13E, "_ZN3ccc8CC0x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y13C1Ev();
extern void _ZN3ccc8CC0x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y13E[] = {
  NSPAIR(_ZN3ccc8CC0x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x2y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y133efgEv,_ZThn4_N3ccc8CC0x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y133efgEv,_ZThn4_N3ccc8CC0x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y13E[];
Class_Descriptor cd__ZN3ccc8CC0x2y13E = {  "_ZN3ccc8CC0x2y13E", // class name
  bases__ZN3ccc8CC0x2y13E, 2,
  &(vtc__ZN3ccc8CC0x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y14  : ::ccc::AA0 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC0x2y143pqrEv
  ~CC0x2y14(); // tgen
  CC0x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x2y143pqrEv");}
ccc::CC0x2y14 ::~CC0x2y14(){ note_dtor("_ZN3ccc8CC0x2y14E", this);} // tgen
ccc::CC0x2y14 ::CC0x2y14(){ note_ctor("_ZN3ccc8CC0x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y14E, buf);
    ::ccc::CC0x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y14E);
    dp->::ccc::CC0x2y14::~CC0x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y14E(Test__ZN3ccc8CC0x2y14E, "_ZN3ccc8CC0x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y14C1Ev();
extern void _ZN3ccc8CC0x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y14E[] = {
  NSPAIR(_ZN3ccc8CC0x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x2y143pqrEv,_ZThn4_N3ccc8CC0x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x2y143pqrEv,_ZThn4_N3ccc8CC0x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y14E[];
Class_Descriptor cd__ZN3ccc8CC0x2y14E = {  "_ZN3ccc8CC0x2y14E", // class name
  bases__ZN3ccc8CC0x2y14E, 2,
  &(vtc__ZN3ccc8CC0x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x2y15  : ::ccc::AA0 , ::ccc::BB2 {
  ~CC0x2y15(); // tgen
  CC0x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x2y15 ::~CC0x2y15(){ note_dtor("_ZN3ccc8CC0x2y15E", this);} // tgen
ccc::CC0x2y15 ::CC0x2y15(){ note_ctor("_ZN3ccc8CC0x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x2y15E, buf);
    ::ccc::CC0x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x2y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC0x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x2y15E);
    dp->::ccc::CC0x2y15::~CC0x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x2y15E(Test__ZN3ccc8CC0x2y15E, "_ZN3ccc8CC0x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x2y15C1Ev();
extern void _ZN3ccc8CC0x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x2y15E[] = {
  NSPAIR(_ZN3ccc8CC0x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC0x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x2y15E[];
Class_Descriptor cd__ZN3ccc8CC0x2y15E = {  "_ZN3ccc8CC0x2y15E", // class name
  bases__ZN3ccc8CC0x2y15E, 2,
  &(vtc__ZN3ccc8CC0x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y0  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y03pqrEv
  ~CC0x3y0(); // tgen
  CC0x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y0E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y03abcEv");}
void  ccc::CC0x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y03efgEv");}
void  ccc::CC0x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y03pqrEv");}
ccc::CC0x3y0 ::~CC0x3y0(){ note_dtor("_ZN3ccc7CC0x3y0E", this);} // tgen
ccc::CC0x3y0 ::CC0x3y0(){ note_ctor("_ZN3ccc7CC0x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y0E, buf);
    ::ccc::CC0x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y0E);
    dp->::ccc::CC0x3y0::~CC0x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y0E(Test__ZN3ccc7CC0x3y0E, "_ZN3ccc7CC0x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y0C1Ev();
extern void _ZN3ccc7CC0x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y0E[] = {
  NSPAIR(_ZN3ccc7CC0x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y0E[];
extern void _ZN3ccc7CC0x3y03abcEv();
extern void _ZN3ccc7CC0x3y03efgEv();
extern void _ZN3ccc7CC0x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03efgEv,_ZThn4_N3ccc7CC0x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03pqrEv,_ZThn4_N3ccc7CC0x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y03abcEv,_ZThn4_N3ccc7CC0x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y03efgEv,_ZThn4_N3ccc7CC0x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y03pqrEv,_ZThn4_N3ccc7CC0x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y03abcEv,_ZThn4_N3ccc7CC0x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y0E[];
Class_Descriptor cd__ZN3ccc7CC0x3y0E = {  "_ZN3ccc7CC0x3y0E", // class name
  bases__ZN3ccc7CC0x3y0E, 2,
  &(vtc__ZN3ccc7CC0x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y1  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x3y13efgEv
  ~CC0x3y1(); // tgen
  CC0x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y1E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y13abcEv");}
void  ccc::CC0x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y13pqrEv");}
void  ccc::CC0x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y13efgEv");}
ccc::CC0x3y1 ::~CC0x3y1(){ note_dtor("_ZN3ccc7CC0x3y1E", this);} // tgen
ccc::CC0x3y1 ::CC0x3y1(){ note_ctor("_ZN3ccc7CC0x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y1E, buf);
    ::ccc::CC0x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y1E);
    dp->::ccc::CC0x3y1::~CC0x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y1E(Test__ZN3ccc7CC0x3y1E, "_ZN3ccc7CC0x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y1C1Ev();
extern void _ZN3ccc7CC0x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y1E[] = {
  NSPAIR(_ZN3ccc7CC0x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y1E[];
extern void _ZN3ccc7CC0x3y13abcEv();
extern void _ZN3ccc7CC0x3y13efgEv();
extern void _ZN3ccc7CC0x3y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13efgEv,_ZThn4_N3ccc7CC0x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13pqrEv,_ZThn4_N3ccc7CC0x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y13abcEv,_ZThn4_N3ccc7CC0x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y13efgEv,_ZThn4_N3ccc7CC0x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y13pqrEv,_ZThn4_N3ccc7CC0x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y13abcEv,_ZThn4_N3ccc7CC0x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y1E[];
Class_Descriptor cd__ZN3ccc7CC0x3y1E = {  "_ZN3ccc7CC0x3y1E", // class name
  bases__ZN3ccc7CC0x3y1E, 2,
  &(vtc__ZN3ccc7CC0x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y2  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y23pqrEv
  ~CC0x3y2(); // tgen
  CC0x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y2E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y23efgEv");}
void  ccc::CC0x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y23abcEv");}
void  ccc::CC0x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y23pqrEv");}
ccc::CC0x3y2 ::~CC0x3y2(){ note_dtor("_ZN3ccc7CC0x3y2E", this);} // tgen
ccc::CC0x3y2 ::CC0x3y2(){ note_ctor("_ZN3ccc7CC0x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y2E, buf);
    ::ccc::CC0x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y2E);
    dp->::ccc::CC0x3y2::~CC0x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y2E(Test__ZN3ccc7CC0x3y2E, "_ZN3ccc7CC0x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y2C1Ev();
extern void _ZN3ccc7CC0x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y2E[] = {
  NSPAIR(_ZN3ccc7CC0x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y2E[];
extern void _ZN3ccc7CC0x3y23abcEv();
extern void _ZN3ccc7CC0x3y23efgEv();
extern void _ZN3ccc7CC0x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23efgEv,_ZThn4_N3ccc7CC0x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23pqrEv,_ZThn4_N3ccc7CC0x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y23abcEv,_ZThn4_N3ccc7CC0x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y23efgEv,_ZThn4_N3ccc7CC0x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y23pqrEv,_ZThn4_N3ccc7CC0x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y23abcEv,_ZThn4_N3ccc7CC0x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y2E[];
Class_Descriptor cd__ZN3ccc7CC0x3y2E = {  "_ZN3ccc7CC0x3y2E", // class name
  bases__ZN3ccc7CC0x3y2E, 2,
  &(vtc__ZN3ccc7CC0x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y3  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x3y33abcEv
  ~CC0x3y3(); // tgen
  CC0x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y3E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y33efgEv");}
void  ccc::CC0x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y33pqrEv");}
void  ccc::CC0x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y33abcEv");}
ccc::CC0x3y3 ::~CC0x3y3(){ note_dtor("_ZN3ccc7CC0x3y3E", this);} // tgen
ccc::CC0x3y3 ::CC0x3y3(){ note_ctor("_ZN3ccc7CC0x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y3E, buf);
    ::ccc::CC0x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y3E);
    dp->::ccc::CC0x3y3::~CC0x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y3E(Test__ZN3ccc7CC0x3y3E, "_ZN3ccc7CC0x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y3C1Ev();
extern void _ZN3ccc7CC0x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y3E[] = {
  NSPAIR(_ZN3ccc7CC0x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y3E[];
extern void _ZN3ccc7CC0x3y33abcEv();
extern void _ZN3ccc7CC0x3y33efgEv();
extern void _ZN3ccc7CC0x3y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33efgEv,_ZThn4_N3ccc7CC0x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33pqrEv,_ZThn4_N3ccc7CC0x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y33abcEv,_ZThn4_N3ccc7CC0x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y33efgEv,_ZThn4_N3ccc7CC0x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y33pqrEv,_ZThn4_N3ccc7CC0x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y33abcEv,_ZThn4_N3ccc7CC0x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y3E[];
Class_Descriptor cd__ZN3ccc7CC0x3y3E = {  "_ZN3ccc7CC0x3y3E", // class name
  bases__ZN3ccc7CC0x3y3E, 2,
  &(vtc__ZN3ccc7CC0x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y4  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC0x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y43efgEv
  ~CC0x3y4(); // tgen
  CC0x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y4E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y43pqrEv");}
void  ccc::CC0x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y43abcEv");}
void  ccc::CC0x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y43efgEv");}
ccc::CC0x3y4 ::~CC0x3y4(){ note_dtor("_ZN3ccc7CC0x3y4E", this);} // tgen
ccc::CC0x3y4 ::CC0x3y4(){ note_ctor("_ZN3ccc7CC0x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y4E, buf);
    ::ccc::CC0x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y4E);
    dp->::ccc::CC0x3y4::~CC0x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y4E(Test__ZN3ccc7CC0x3y4E, "_ZN3ccc7CC0x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y4C1Ev();
extern void _ZN3ccc7CC0x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y4E[] = {
  NSPAIR(_ZN3ccc7CC0x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y4E[];
extern void _ZN3ccc7CC0x3y43abcEv();
extern void _ZN3ccc7CC0x3y43efgEv();
extern void _ZN3ccc7CC0x3y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43efgEv,_ZThn4_N3ccc7CC0x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43pqrEv,_ZThn4_N3ccc7CC0x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y43abcEv,_ZThn4_N3ccc7CC0x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y43efgEv,_ZThn4_N3ccc7CC0x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y43pqrEv,_ZThn4_N3ccc7CC0x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y43abcEv,_ZThn4_N3ccc7CC0x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y4E[];
Class_Descriptor cd__ZN3ccc7CC0x3y4E = {  "_ZN3ccc7CC0x3y4E", // class name
  bases__ZN3ccc7CC0x3y4E, 2,
  &(vtc__ZN3ccc7CC0x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y5  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC0x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y53abcEv
  ~CC0x3y5(); // tgen
  CC0x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y5E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y53pqrEv");}
void  ccc::CC0x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y53efgEv");}
void  ccc::CC0x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y53abcEv");}
ccc::CC0x3y5 ::~CC0x3y5(){ note_dtor("_ZN3ccc7CC0x3y5E", this);} // tgen
ccc::CC0x3y5 ::CC0x3y5(){ note_ctor("_ZN3ccc7CC0x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y5E, buf);
    ::ccc::CC0x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y5E);
    dp->::ccc::CC0x3y5::~CC0x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y5E(Test__ZN3ccc7CC0x3y5E, "_ZN3ccc7CC0x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y5C1Ev();
extern void _ZN3ccc7CC0x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y5E[] = {
  NSPAIR(_ZN3ccc7CC0x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y5E[];
extern void _ZN3ccc7CC0x3y53abcEv();
extern void _ZN3ccc7CC0x3y53efgEv();
extern void _ZN3ccc7CC0x3y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53efgEv,_ZThn4_N3ccc7CC0x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53pqrEv,_ZThn4_N3ccc7CC0x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y53abcEv,_ZThn4_N3ccc7CC0x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y53efgEv,_ZThn4_N3ccc7CC0x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y53pqrEv,_ZThn4_N3ccc7CC0x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y53abcEv,_ZThn4_N3ccc7CC0x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y5E[];
Class_Descriptor cd__ZN3ccc7CC0x3y5E = {  "_ZN3ccc7CC0x3y5E", // class name
  bases__ZN3ccc7CC0x3y5E, 2,
  &(vtc__ZN3ccc7CC0x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y6  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x3y63efgEv
  ~CC0x3y6(); // tgen
  CC0x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y6E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y63abcEv");}
void  ccc::CC0x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y63efgEv");}
ccc::CC0x3y6 ::~CC0x3y6(){ note_dtor("_ZN3ccc7CC0x3y6E", this);} // tgen
ccc::CC0x3y6 ::CC0x3y6(){ note_ctor("_ZN3ccc7CC0x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y6E, buf);
    ::ccc::CC0x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y6E);
    dp->::ccc::CC0x3y6::~CC0x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y6E(Test__ZN3ccc7CC0x3y6E, "_ZN3ccc7CC0x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y6C1Ev();
extern void _ZN3ccc7CC0x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y6E[] = {
  NSPAIR(_ZN3ccc7CC0x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y6E[];
extern void _ZN3ccc7CC0x3y63abcEv();
extern void _ZN3ccc7CC0x3y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y63efgEv,_ZThn4_N3ccc7CC0x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y63abcEv,_ZThn4_N3ccc7CC0x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y63efgEv,_ZThn4_N3ccc7CC0x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y63abcEv,_ZThn4_N3ccc7CC0x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y6E[];
Class_Descriptor cd__ZN3ccc7CC0x3y6E = {  "_ZN3ccc7CC0x3y6E", // class name
  bases__ZN3ccc7CC0x3y6E, 2,
  &(vtc__ZN3ccc7CC0x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y7  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC0x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y73pqrEv
  ~CC0x3y7(); // tgen
  CC0x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y7E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y73abcEv");}
void  ccc::CC0x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y73pqrEv");}
ccc::CC0x3y7 ::~CC0x3y7(){ note_dtor("_ZN3ccc7CC0x3y7E", this);} // tgen
ccc::CC0x3y7 ::CC0x3y7(){ note_ctor("_ZN3ccc7CC0x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y7E, buf);
    ::ccc::CC0x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y7E);
    dp->::ccc::CC0x3y7::~CC0x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y7E(Test__ZN3ccc7CC0x3y7E, "_ZN3ccc7CC0x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y7C1Ev();
extern void _ZN3ccc7CC0x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y7E[] = {
  NSPAIR(_ZN3ccc7CC0x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y7E[];
extern void _ZN3ccc7CC0x3y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y73pqrEv,_ZThn4_N3ccc7CC0x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y73abcEv,_ZThn4_N3ccc7CC0x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y73pqrEv,_ZThn4_N3ccc7CC0x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y73abcEv,_ZThn4_N3ccc7CC0x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y7E[];
Class_Descriptor cd__ZN3ccc7CC0x3y7E = {  "_ZN3ccc7CC0x3y7E", // class name
  bases__ZN3ccc7CC0x3y7E, 2,
  &(vtc__ZN3ccc7CC0x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y8  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x3y83abcEv
  ~CC0x3y8(); // tgen
  CC0x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y8E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y83efgEv");}
void  ccc::CC0x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x3y83abcEv");}
ccc::CC0x3y8 ::~CC0x3y8(){ note_dtor("_ZN3ccc7CC0x3y8E", this);} // tgen
ccc::CC0x3y8 ::CC0x3y8(){ note_ctor("_ZN3ccc7CC0x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y8E, buf);
    ::ccc::CC0x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y8E);
    dp->::ccc::CC0x3y8::~CC0x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y8E(Test__ZN3ccc7CC0x3y8E, "_ZN3ccc7CC0x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y8C1Ev();
extern void _ZN3ccc7CC0x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y8E[] = {
  NSPAIR(_ZN3ccc7CC0x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y8E[];
extern void _ZN3ccc7CC0x3y83abcEv();
extern void _ZN3ccc7CC0x3y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y83efgEv,_ZThn4_N3ccc7CC0x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y83abcEv,_ZThn4_N3ccc7CC0x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y83efgEv,_ZThn4_N3ccc7CC0x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y83abcEv,_ZThn4_N3ccc7CC0x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y8E[];
Class_Descriptor cd__ZN3ccc7CC0x3y8E = {  "_ZN3ccc7CC0x3y8E", // class name
  bases__ZN3ccc7CC0x3y8E, 2,
  &(vtc__ZN3ccc7CC0x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y9  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC0x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x3y93pqrEv
  ~CC0x3y9(); // tgen
  CC0x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x3y9E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x3y93efgEv");}
void  ccc::CC0x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x3y93pqrEv");}
ccc::CC0x3y9 ::~CC0x3y9(){ note_dtor("_ZN3ccc7CC0x3y9E", this);} // tgen
ccc::CC0x3y9 ::CC0x3y9(){ note_ctor("_ZN3ccc7CC0x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x3y9E, buf);
    ::ccc::CC0x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x3y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC0x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x3y9E);
    dp->::ccc::CC0x3y9::~CC0x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x3y9E(Test__ZN3ccc7CC0x3y9E, "_ZN3ccc7CC0x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x3y9C1Ev();
extern void _ZN3ccc7CC0x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x3y9E[] = {
  NSPAIR(_ZN3ccc7CC0x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC0x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x3y93efgEv();
extern void _ZN3ccc7CC0x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y93efgEv,_ZThn4_N3ccc7CC0x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x3y93pqrEv,_ZThn4_N3ccc7CC0x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y93efgEv,_ZThn4_N3ccc7CC0x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x3y93pqrEv,_ZThn4_N3ccc7CC0x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x3y9E[];
Class_Descriptor cd__ZN3ccc7CC0x3y9E = {  "_ZN3ccc7CC0x3y9E", // class name
  bases__ZN3ccc7CC0x3y9E, 2,
  &(vtc__ZN3ccc7CC0x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y10  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x3y103abcEv
  ~CC0x3y10(); // tgen
  CC0x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y10E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y103pqrEv");}
void  ccc::CC0x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x3y103abcEv");}
ccc::CC0x3y10 ::~CC0x3y10(){ note_dtor("_ZN3ccc8CC0x3y10E", this);} // tgen
ccc::CC0x3y10 ::CC0x3y10(){ note_ctor("_ZN3ccc8CC0x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y10E, buf);
    ::ccc::CC0x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y10E);
    dp->::ccc::CC0x3y10::~CC0x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y10E(Test__ZN3ccc8CC0x3y10E, "_ZN3ccc8CC0x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y10C1Ev();
extern void _ZN3ccc8CC0x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y10E[] = {
  NSPAIR(_ZN3ccc8CC0x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y10E[];
extern void _ZN3ccc8CC0x3y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y103pqrEv,_ZThn4_N3ccc8CC0x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y103abcEv,_ZThn4_N3ccc8CC0x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y103pqrEv,_ZThn4_N3ccc8CC0x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y103abcEv,_ZThn4_N3ccc8CC0x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y10E[];
Class_Descriptor cd__ZN3ccc8CC0x3y10E = {  "_ZN3ccc8CC0x3y10E", // class name
  bases__ZN3ccc8CC0x3y10E, 2,
  &(vtc__ZN3ccc8CC0x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y11  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x3y113efgEv
  ~CC0x3y11(); // tgen
  CC0x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y11E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y113pqrEv");}
void  ccc::CC0x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x3y113efgEv");}
ccc::CC0x3y11 ::~CC0x3y11(){ note_dtor("_ZN3ccc8CC0x3y11E", this);} // tgen
ccc::CC0x3y11 ::CC0x3y11(){ note_ctor("_ZN3ccc8CC0x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y11E, buf);
    ::ccc::CC0x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y11E);
    dp->::ccc::CC0x3y11::~CC0x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y11E(Test__ZN3ccc8CC0x3y11E, "_ZN3ccc8CC0x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y11C1Ev();
extern void _ZN3ccc8CC0x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y11E[] = {
  NSPAIR(_ZN3ccc8CC0x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x3y113efgEv();
extern void _ZN3ccc8CC0x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y113efgEv,_ZThn4_N3ccc8CC0x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y113pqrEv,_ZThn4_N3ccc8CC0x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y113efgEv,_ZThn4_N3ccc8CC0x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y113pqrEv,_ZThn4_N3ccc8CC0x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y11E[];
Class_Descriptor cd__ZN3ccc8CC0x3y11E = {  "_ZN3ccc8CC0x3y11E", // class name
  bases__ZN3ccc8CC0x3y11E, 2,
  &(vtc__ZN3ccc8CC0x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y12  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC0x3y123abcEv
  ~CC0x3y12(); // tgen
  CC0x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x3y123abcEv");}
ccc::CC0x3y12 ::~CC0x3y12(){ note_dtor("_ZN3ccc8CC0x3y12E", this);} // tgen
ccc::CC0x3y12 ::CC0x3y12(){ note_ctor("_ZN3ccc8CC0x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y12E, buf);
    ::ccc::CC0x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y12E);
    dp->::ccc::CC0x3y12::~CC0x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y12E(Test__ZN3ccc8CC0x3y12E, "_ZN3ccc8CC0x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y12C1Ev();
extern void _ZN3ccc8CC0x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y12E[] = {
  NSPAIR(_ZN3ccc8CC0x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y12E[];
extern void _ZN3ccc8CC0x3y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y123abcEv,_ZThn4_N3ccc8CC0x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y123abcEv,_ZThn4_N3ccc8CC0x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y12E[];
Class_Descriptor cd__ZN3ccc8CC0x3y12E = {  "_ZN3ccc8CC0x3y12E", // class name
  bases__ZN3ccc8CC0x3y12E, 2,
  &(vtc__ZN3ccc8CC0x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y13  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC0x3y133efgEv
  ~CC0x3y13(); // tgen
  CC0x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y13E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x3y133efgEv");}
ccc::CC0x3y13 ::~CC0x3y13(){ note_dtor("_ZN3ccc8CC0x3y13E", this);} // tgen
ccc::CC0x3y13 ::CC0x3y13(){ note_ctor("_ZN3ccc8CC0x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y13E, buf);
    ::ccc::CC0x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y13E);
    dp->::ccc::CC0x3y13::~CC0x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y13E(Test__ZN3ccc8CC0x3y13E, "_ZN3ccc8CC0x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y13C1Ev();
extern void _ZN3ccc8CC0x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y13E[] = {
  NSPAIR(_ZN3ccc8CC0x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x3y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y133efgEv,_ZThn4_N3ccc8CC0x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y133efgEv,_ZThn4_N3ccc8CC0x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y13E[];
Class_Descriptor cd__ZN3ccc8CC0x3y13E = {  "_ZN3ccc8CC0x3y13E", // class name
  bases__ZN3ccc8CC0x3y13E, 2,
  &(vtc__ZN3ccc8CC0x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y14  : ::ccc::AA0 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC0x3y143pqrEv
  ~CC0x3y14(); // tgen
  CC0x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x3y143pqrEv");}
ccc::CC0x3y14 ::~CC0x3y14(){ note_dtor("_ZN3ccc8CC0x3y14E", this);} // tgen
ccc::CC0x3y14 ::CC0x3y14(){ note_ctor("_ZN3ccc8CC0x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y14E, buf);
    ::ccc::CC0x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y14E);
    dp->::ccc::CC0x3y14::~CC0x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y14E(Test__ZN3ccc8CC0x3y14E, "_ZN3ccc8CC0x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y14C1Ev();
extern void _ZN3ccc8CC0x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y14E[] = {
  NSPAIR(_ZN3ccc8CC0x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x3y143pqrEv,_ZThn4_N3ccc8CC0x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x3y143pqrEv,_ZThn4_N3ccc8CC0x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y14E[];
Class_Descriptor cd__ZN3ccc8CC0x3y14E = {  "_ZN3ccc8CC0x3y14E", // class name
  bases__ZN3ccc8CC0x3y14E, 2,
  &(vtc__ZN3ccc8CC0x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x3y15  : ::ccc::AA0 , ::ccc::BB3 {
  ~CC0x3y15(); // tgen
  CC0x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x3y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x3y15 ::~CC0x3y15(){ note_dtor("_ZN3ccc8CC0x3y15E", this);} // tgen
ccc::CC0x3y15 ::CC0x3y15(){ note_ctor("_ZN3ccc8CC0x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x3y15E, buf);
    ::ccc::CC0x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x3y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC0x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x3y15E);
    dp->::ccc::CC0x3y15::~CC0x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x3y15E(Test__ZN3ccc8CC0x3y15E, "_ZN3ccc8CC0x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x3y15C1Ev();
extern void _ZN3ccc8CC0x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x3y15E[] = {
  NSPAIR(_ZN3ccc8CC0x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC0x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x3y15E[];
Class_Descriptor cd__ZN3ccc8CC0x3y15E = {  "_ZN3ccc8CC0x3y15E", // class name
  bases__ZN3ccc8CC0x3y15E, 2,
  &(vtc__ZN3ccc8CC0x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y0  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y03pqrEv
  ~CC0x4y0(); // tgen
  CC0x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y0E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y03abcEv");}
void  ccc::CC0x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y03efgEv");}
void  ccc::CC0x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y03pqrEv");}
ccc::CC0x4y0 ::~CC0x4y0(){ note_dtor("_ZN3ccc7CC0x4y0E", this);} // tgen
ccc::CC0x4y0 ::CC0x4y0(){ note_ctor("_ZN3ccc7CC0x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y0E, buf);
    ::ccc::CC0x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y0E);
    dp->::ccc::CC0x4y0::~CC0x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y0E(Test__ZN3ccc7CC0x4y0E, "_ZN3ccc7CC0x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y0C1Ev();
extern void _ZN3ccc7CC0x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y0E[] = {
  NSPAIR(_ZN3ccc7CC0x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y0E[];
extern void _ZN3ccc7CC0x4y03abcEv();
extern void _ZN3ccc7CC0x4y03efgEv();
extern void _ZN3ccc7CC0x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03pqrEv,_ZThn4_N3ccc7CC0x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03abcEv,_ZThn4_N3ccc7CC0x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y03efgEv,_ZThn4_N3ccc7CC0x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y03pqrEv,_ZThn4_N3ccc7CC0x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y03abcEv,_ZThn4_N3ccc7CC0x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y03efgEv,_ZThn4_N3ccc7CC0x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y0E[];
Class_Descriptor cd__ZN3ccc7CC0x4y0E = {  "_ZN3ccc7CC0x4y0E", // class name
  bases__ZN3ccc7CC0x4y0E, 2,
  &(vtc__ZN3ccc7CC0x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y1  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x4y13efgEv
  ~CC0x4y1(); // tgen
  CC0x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y1E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y13abcEv");}
void  ccc::CC0x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y13pqrEv");}
void  ccc::CC0x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y13efgEv");}
ccc::CC0x4y1 ::~CC0x4y1(){ note_dtor("_ZN3ccc7CC0x4y1E", this);} // tgen
ccc::CC0x4y1 ::CC0x4y1(){ note_ctor("_ZN3ccc7CC0x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y1E, buf);
    ::ccc::CC0x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y1E);
    dp->::ccc::CC0x4y1::~CC0x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y1E(Test__ZN3ccc7CC0x4y1E, "_ZN3ccc7CC0x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y1C1Ev();
extern void _ZN3ccc7CC0x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y1E[] = {
  NSPAIR(_ZN3ccc7CC0x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y1E[];
extern void _ZN3ccc7CC0x4y13abcEv();
extern void _ZN3ccc7CC0x4y13efgEv();
extern void _ZN3ccc7CC0x4y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13pqrEv,_ZThn4_N3ccc7CC0x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13abcEv,_ZThn4_N3ccc7CC0x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y13efgEv,_ZThn4_N3ccc7CC0x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y13pqrEv,_ZThn4_N3ccc7CC0x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y13abcEv,_ZThn4_N3ccc7CC0x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y13efgEv,_ZThn4_N3ccc7CC0x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y1E[];
Class_Descriptor cd__ZN3ccc7CC0x4y1E = {  "_ZN3ccc7CC0x4y1E", // class name
  bases__ZN3ccc7CC0x4y1E, 2,
  &(vtc__ZN3ccc7CC0x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y2  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y23pqrEv
  ~CC0x4y2(); // tgen
  CC0x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y2E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y23efgEv");}
void  ccc::CC0x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y23abcEv");}
void  ccc::CC0x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y23pqrEv");}
ccc::CC0x4y2 ::~CC0x4y2(){ note_dtor("_ZN3ccc7CC0x4y2E", this);} // tgen
ccc::CC0x4y2 ::CC0x4y2(){ note_ctor("_ZN3ccc7CC0x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y2E, buf);
    ::ccc::CC0x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y2E);
    dp->::ccc::CC0x4y2::~CC0x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y2E(Test__ZN3ccc7CC0x4y2E, "_ZN3ccc7CC0x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y2C1Ev();
extern void _ZN3ccc7CC0x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y2E[] = {
  NSPAIR(_ZN3ccc7CC0x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y2E[];
extern void _ZN3ccc7CC0x4y23abcEv();
extern void _ZN3ccc7CC0x4y23efgEv();
extern void _ZN3ccc7CC0x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23pqrEv,_ZThn4_N3ccc7CC0x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23abcEv,_ZThn4_N3ccc7CC0x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y23efgEv,_ZThn4_N3ccc7CC0x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y23pqrEv,_ZThn4_N3ccc7CC0x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y23abcEv,_ZThn4_N3ccc7CC0x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y23efgEv,_ZThn4_N3ccc7CC0x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y2E[];
Class_Descriptor cd__ZN3ccc7CC0x4y2E = {  "_ZN3ccc7CC0x4y2E", // class name
  bases__ZN3ccc7CC0x4y2E, 2,
  &(vtc__ZN3ccc7CC0x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y3  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x4y33abcEv
  ~CC0x4y3(); // tgen
  CC0x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y3E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y33efgEv");}
void  ccc::CC0x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y33pqrEv");}
void  ccc::CC0x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y33abcEv");}
ccc::CC0x4y3 ::~CC0x4y3(){ note_dtor("_ZN3ccc7CC0x4y3E", this);} // tgen
ccc::CC0x4y3 ::CC0x4y3(){ note_ctor("_ZN3ccc7CC0x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y3E, buf);
    ::ccc::CC0x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y3E);
    dp->::ccc::CC0x4y3::~CC0x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y3E(Test__ZN3ccc7CC0x4y3E, "_ZN3ccc7CC0x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y3C1Ev();
extern void _ZN3ccc7CC0x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y3E[] = {
  NSPAIR(_ZN3ccc7CC0x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y3E[];
extern void _ZN3ccc7CC0x4y33abcEv();
extern void _ZN3ccc7CC0x4y33efgEv();
extern void _ZN3ccc7CC0x4y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33pqrEv,_ZThn4_N3ccc7CC0x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33abcEv,_ZThn4_N3ccc7CC0x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y33efgEv,_ZThn4_N3ccc7CC0x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y33pqrEv,_ZThn4_N3ccc7CC0x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y33abcEv,_ZThn4_N3ccc7CC0x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y33efgEv,_ZThn4_N3ccc7CC0x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y3E[];
Class_Descriptor cd__ZN3ccc7CC0x4y3E = {  "_ZN3ccc7CC0x4y3E", // class name
  bases__ZN3ccc7CC0x4y3E, 2,
  &(vtc__ZN3ccc7CC0x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y4  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC0x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y43efgEv
  ~CC0x4y4(); // tgen
  CC0x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y4E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y43pqrEv");}
void  ccc::CC0x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y43abcEv");}
void  ccc::CC0x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y43efgEv");}
ccc::CC0x4y4 ::~CC0x4y4(){ note_dtor("_ZN3ccc7CC0x4y4E", this);} // tgen
ccc::CC0x4y4 ::CC0x4y4(){ note_ctor("_ZN3ccc7CC0x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y4E, buf);
    ::ccc::CC0x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y4E);
    dp->::ccc::CC0x4y4::~CC0x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y4E(Test__ZN3ccc7CC0x4y4E, "_ZN3ccc7CC0x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y4C1Ev();
extern void _ZN3ccc7CC0x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y4E[] = {
  NSPAIR(_ZN3ccc7CC0x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y4E[];
extern void _ZN3ccc7CC0x4y43abcEv();
extern void _ZN3ccc7CC0x4y43efgEv();
extern void _ZN3ccc7CC0x4y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43pqrEv,_ZThn4_N3ccc7CC0x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43abcEv,_ZThn4_N3ccc7CC0x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y43efgEv,_ZThn4_N3ccc7CC0x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y43pqrEv,_ZThn4_N3ccc7CC0x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y43abcEv,_ZThn4_N3ccc7CC0x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y43efgEv,_ZThn4_N3ccc7CC0x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y4E[];
Class_Descriptor cd__ZN3ccc7CC0x4y4E = {  "_ZN3ccc7CC0x4y4E", // class name
  bases__ZN3ccc7CC0x4y4E, 2,
  &(vtc__ZN3ccc7CC0x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y5  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC0x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y53abcEv
  ~CC0x4y5(); // tgen
  CC0x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y5E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y53pqrEv");}
void  ccc::CC0x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y53efgEv");}
void  ccc::CC0x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y53abcEv");}
ccc::CC0x4y5 ::~CC0x4y5(){ note_dtor("_ZN3ccc7CC0x4y5E", this);} // tgen
ccc::CC0x4y5 ::CC0x4y5(){ note_ctor("_ZN3ccc7CC0x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y5E, buf);
    ::ccc::CC0x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y5E);
    dp->::ccc::CC0x4y5::~CC0x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y5E(Test__ZN3ccc7CC0x4y5E, "_ZN3ccc7CC0x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y5C1Ev();
extern void _ZN3ccc7CC0x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y5E[] = {
  NSPAIR(_ZN3ccc7CC0x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y5E[];
extern void _ZN3ccc7CC0x4y53abcEv();
extern void _ZN3ccc7CC0x4y53efgEv();
extern void _ZN3ccc7CC0x4y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53pqrEv,_ZThn4_N3ccc7CC0x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53abcEv,_ZThn4_N3ccc7CC0x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y53efgEv,_ZThn4_N3ccc7CC0x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y53pqrEv,_ZThn4_N3ccc7CC0x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y53abcEv,_ZThn4_N3ccc7CC0x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y53efgEv,_ZThn4_N3ccc7CC0x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y5E[];
Class_Descriptor cd__ZN3ccc7CC0x4y5E = {  "_ZN3ccc7CC0x4y5E", // class name
  bases__ZN3ccc7CC0x4y5E, 2,
  &(vtc__ZN3ccc7CC0x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y6  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x4y63efgEv
  ~CC0x4y6(); // tgen
  CC0x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y6E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y63abcEv");}
void  ccc::CC0x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y63efgEv");}
ccc::CC0x4y6 ::~CC0x4y6(){ note_dtor("_ZN3ccc7CC0x4y6E", this);} // tgen
ccc::CC0x4y6 ::CC0x4y6(){ note_ctor("_ZN3ccc7CC0x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y6E, buf);
    ::ccc::CC0x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y6E);
    dp->::ccc::CC0x4y6::~CC0x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y6E(Test__ZN3ccc7CC0x4y6E, "_ZN3ccc7CC0x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y6C1Ev();
extern void _ZN3ccc7CC0x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y6E[] = {
  NSPAIR(_ZN3ccc7CC0x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y6E[];
extern void _ZN3ccc7CC0x4y63abcEv();
extern void _ZN3ccc7CC0x4y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y63abcEv,_ZThn4_N3ccc7CC0x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y63efgEv,_ZThn4_N3ccc7CC0x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y63abcEv,_ZThn4_N3ccc7CC0x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y63efgEv,_ZThn4_N3ccc7CC0x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y6E[];
Class_Descriptor cd__ZN3ccc7CC0x4y6E = {  "_ZN3ccc7CC0x4y6E", // class name
  bases__ZN3ccc7CC0x4y6E, 2,
  &(vtc__ZN3ccc7CC0x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y7  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC0x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y73pqrEv
  ~CC0x4y7(); // tgen
  CC0x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y7E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y73abcEv");}
void  ccc::CC0x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y73pqrEv");}
ccc::CC0x4y7 ::~CC0x4y7(){ note_dtor("_ZN3ccc7CC0x4y7E", this);} // tgen
ccc::CC0x4y7 ::CC0x4y7(){ note_ctor("_ZN3ccc7CC0x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y7E, buf);
    ::ccc::CC0x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y7E);
    dp->::ccc::CC0x4y7::~CC0x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y7E(Test__ZN3ccc7CC0x4y7E, "_ZN3ccc7CC0x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y7C1Ev();
extern void _ZN3ccc7CC0x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y7E[] = {
  NSPAIR(_ZN3ccc7CC0x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y7E[];
extern void _ZN3ccc7CC0x4y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y73pqrEv,_ZThn4_N3ccc7CC0x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y73abcEv,_ZThn4_N3ccc7CC0x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y73pqrEv,_ZThn4_N3ccc7CC0x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y73abcEv,_ZThn4_N3ccc7CC0x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y7E[];
Class_Descriptor cd__ZN3ccc7CC0x4y7E = {  "_ZN3ccc7CC0x4y7E", // class name
  bases__ZN3ccc7CC0x4y7E, 2,
  &(vtc__ZN3ccc7CC0x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y8  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x4y83abcEv
  ~CC0x4y8(); // tgen
  CC0x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y8E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y83efgEv");}
void  ccc::CC0x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x4y83abcEv");}
ccc::CC0x4y8 ::~CC0x4y8(){ note_dtor("_ZN3ccc7CC0x4y8E", this);} // tgen
ccc::CC0x4y8 ::CC0x4y8(){ note_ctor("_ZN3ccc7CC0x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y8E, buf);
    ::ccc::CC0x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y8E);
    dp->::ccc::CC0x4y8::~CC0x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y8E(Test__ZN3ccc7CC0x4y8E, "_ZN3ccc7CC0x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y8C1Ev();
extern void _ZN3ccc7CC0x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y8E[] = {
  NSPAIR(_ZN3ccc7CC0x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y8E[];
extern void _ZN3ccc7CC0x4y83abcEv();
extern void _ZN3ccc7CC0x4y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y83abcEv,_ZThn4_N3ccc7CC0x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y83efgEv,_ZThn4_N3ccc7CC0x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y83abcEv,_ZThn4_N3ccc7CC0x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y83efgEv,_ZThn4_N3ccc7CC0x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y8E[];
Class_Descriptor cd__ZN3ccc7CC0x4y8E = {  "_ZN3ccc7CC0x4y8E", // class name
  bases__ZN3ccc7CC0x4y8E, 2,
  &(vtc__ZN3ccc7CC0x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y9  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC0x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x4y93pqrEv
  ~CC0x4y9(); // tgen
  CC0x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x4y9E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x4y93efgEv");}
void  ccc::CC0x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x4y93pqrEv");}
ccc::CC0x4y9 ::~CC0x4y9(){ note_dtor("_ZN3ccc7CC0x4y9E", this);} // tgen
ccc::CC0x4y9 ::CC0x4y9(){ note_ctor("_ZN3ccc7CC0x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x4y9E, buf);
    ::ccc::CC0x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x4y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC0x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x4y9E);
    dp->::ccc::CC0x4y9::~CC0x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x4y9E(Test__ZN3ccc7CC0x4y9E, "_ZN3ccc7CC0x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x4y9C1Ev();
extern void _ZN3ccc7CC0x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x4y9E[] = {
  NSPAIR(_ZN3ccc7CC0x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC0x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x4y93efgEv();
extern void _ZN3ccc7CC0x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y93pqrEv,_ZThn4_N3ccc7CC0x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x4y93efgEv,_ZThn4_N3ccc7CC0x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y93pqrEv,_ZThn4_N3ccc7CC0x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x4y93efgEv,_ZThn4_N3ccc7CC0x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x4y9E[];
Class_Descriptor cd__ZN3ccc7CC0x4y9E = {  "_ZN3ccc7CC0x4y9E", // class name
  bases__ZN3ccc7CC0x4y9E, 2,
  &(vtc__ZN3ccc7CC0x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y10  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x4y103abcEv
  ~CC0x4y10(); // tgen
  CC0x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y10E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y103pqrEv");}
void  ccc::CC0x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x4y103abcEv");}
ccc::CC0x4y10 ::~CC0x4y10(){ note_dtor("_ZN3ccc8CC0x4y10E", this);} // tgen
ccc::CC0x4y10 ::CC0x4y10(){ note_ctor("_ZN3ccc8CC0x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y10E, buf);
    ::ccc::CC0x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y10E);
    dp->::ccc::CC0x4y10::~CC0x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y10E(Test__ZN3ccc8CC0x4y10E, "_ZN3ccc8CC0x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y10C1Ev();
extern void _ZN3ccc8CC0x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y10E[] = {
  NSPAIR(_ZN3ccc8CC0x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y10E[];
extern void _ZN3ccc8CC0x4y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y103pqrEv,_ZThn4_N3ccc8CC0x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y103abcEv,_ZThn4_N3ccc8CC0x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y103pqrEv,_ZThn4_N3ccc8CC0x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y103abcEv,_ZThn4_N3ccc8CC0x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y10E[];
Class_Descriptor cd__ZN3ccc8CC0x4y10E = {  "_ZN3ccc8CC0x4y10E", // class name
  bases__ZN3ccc8CC0x4y10E, 2,
  &(vtc__ZN3ccc8CC0x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y11  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x4y113efgEv
  ~CC0x4y11(); // tgen
  CC0x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y11E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y113pqrEv");}
void  ccc::CC0x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x4y113efgEv");}
ccc::CC0x4y11 ::~CC0x4y11(){ note_dtor("_ZN3ccc8CC0x4y11E", this);} // tgen
ccc::CC0x4y11 ::CC0x4y11(){ note_ctor("_ZN3ccc8CC0x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y11E, buf);
    ::ccc::CC0x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y11E);
    dp->::ccc::CC0x4y11::~CC0x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y11E(Test__ZN3ccc8CC0x4y11E, "_ZN3ccc8CC0x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y11C1Ev();
extern void _ZN3ccc8CC0x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y11E[] = {
  NSPAIR(_ZN3ccc8CC0x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x4y113efgEv();
extern void _ZN3ccc8CC0x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y113pqrEv,_ZThn4_N3ccc8CC0x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y113efgEv,_ZThn4_N3ccc8CC0x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y113pqrEv,_ZThn4_N3ccc8CC0x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y113efgEv,_ZThn4_N3ccc8CC0x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y11E[];
Class_Descriptor cd__ZN3ccc8CC0x4y11E = {  "_ZN3ccc8CC0x4y11E", // class name
  bases__ZN3ccc8CC0x4y11E, 2,
  &(vtc__ZN3ccc8CC0x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y12  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC0x4y123abcEv
  ~CC0x4y12(); // tgen
  CC0x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x4y123abcEv");}
ccc::CC0x4y12 ::~CC0x4y12(){ note_dtor("_ZN3ccc8CC0x4y12E", this);} // tgen
ccc::CC0x4y12 ::CC0x4y12(){ note_ctor("_ZN3ccc8CC0x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y12E, buf);
    ::ccc::CC0x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y12E);
    dp->::ccc::CC0x4y12::~CC0x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y12E(Test__ZN3ccc8CC0x4y12E, "_ZN3ccc8CC0x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y12C1Ev();
extern void _ZN3ccc8CC0x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y12E[] = {
  NSPAIR(_ZN3ccc8CC0x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y12E[];
extern void _ZN3ccc8CC0x4y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y123abcEv,_ZThn4_N3ccc8CC0x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y123abcEv,_ZThn4_N3ccc8CC0x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y12E[];
Class_Descriptor cd__ZN3ccc8CC0x4y12E = {  "_ZN3ccc8CC0x4y12E", // class name
  bases__ZN3ccc8CC0x4y12E, 2,
  &(vtc__ZN3ccc8CC0x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y13  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC0x4y133efgEv
  ~CC0x4y13(); // tgen
  CC0x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x4y133efgEv");}
ccc::CC0x4y13 ::~CC0x4y13(){ note_dtor("_ZN3ccc8CC0x4y13E", this);} // tgen
ccc::CC0x4y13 ::CC0x4y13(){ note_ctor("_ZN3ccc8CC0x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y13E, buf);
    ::ccc::CC0x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y13E);
    dp->::ccc::CC0x4y13::~CC0x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y13E(Test__ZN3ccc8CC0x4y13E, "_ZN3ccc8CC0x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y13C1Ev();
extern void _ZN3ccc8CC0x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y13E[] = {
  NSPAIR(_ZN3ccc8CC0x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x4y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y133efgEv,_ZThn4_N3ccc8CC0x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y133efgEv,_ZThn4_N3ccc8CC0x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y13E[];
Class_Descriptor cd__ZN3ccc8CC0x4y13E = {  "_ZN3ccc8CC0x4y13E", // class name
  bases__ZN3ccc8CC0x4y13E, 2,
  &(vtc__ZN3ccc8CC0x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y14  : ::ccc::AA0 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC0x4y143pqrEv
  ~CC0x4y14(); // tgen
  CC0x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x4y143pqrEv");}
ccc::CC0x4y14 ::~CC0x4y14(){ note_dtor("_ZN3ccc8CC0x4y14E", this);} // tgen
ccc::CC0x4y14 ::CC0x4y14(){ note_ctor("_ZN3ccc8CC0x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y14E, buf);
    ::ccc::CC0x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y14E);
    dp->::ccc::CC0x4y14::~CC0x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y14E(Test__ZN3ccc8CC0x4y14E, "_ZN3ccc8CC0x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y14C1Ev();
extern void _ZN3ccc8CC0x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y14E[] = {
  NSPAIR(_ZN3ccc8CC0x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x4y143pqrEv,_ZThn4_N3ccc8CC0x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x4y143pqrEv,_ZThn4_N3ccc8CC0x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y14E[];
Class_Descriptor cd__ZN3ccc8CC0x4y14E = {  "_ZN3ccc8CC0x4y14E", // class name
  bases__ZN3ccc8CC0x4y14E, 2,
  &(vtc__ZN3ccc8CC0x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x4y15  : ::ccc::AA0 , ::ccc::BB4 {
  ~CC0x4y15(); // tgen
  CC0x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x4y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x4y15 ::~CC0x4y15(){ note_dtor("_ZN3ccc8CC0x4y15E", this);} // tgen
ccc::CC0x4y15 ::CC0x4y15(){ note_ctor("_ZN3ccc8CC0x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x4y15E, buf);
    ::ccc::CC0x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x4y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC0x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x4y15E);
    dp->::ccc::CC0x4y15::~CC0x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x4y15E(Test__ZN3ccc8CC0x4y15E, "_ZN3ccc8CC0x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x4y15C1Ev();
extern void _ZN3ccc8CC0x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x4y15E[] = {
  NSPAIR(_ZN3ccc8CC0x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC0x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x4y15E[];
Class_Descriptor cd__ZN3ccc8CC0x4y15E = {  "_ZN3ccc8CC0x4y15E", // class name
  bases__ZN3ccc8CC0x4y15E, 2,
  &(vtc__ZN3ccc8CC0x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y0  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y03pqrEv
  ~CC0x5y0(); // tgen
  CC0x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y0E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y03abcEv");}
void  ccc::CC0x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y03efgEv");}
void  ccc::CC0x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y03pqrEv");}
ccc::CC0x5y0 ::~CC0x5y0(){ note_dtor("_ZN3ccc7CC0x5y0E", this);} // tgen
ccc::CC0x5y0 ::CC0x5y0(){ note_ctor("_ZN3ccc7CC0x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y0E, buf);
    ::ccc::CC0x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y0E);
    dp->::ccc::CC0x5y0::~CC0x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y0E(Test__ZN3ccc7CC0x5y0E, "_ZN3ccc7CC0x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y0C1Ev();
extern void _ZN3ccc7CC0x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y0E[] = {
  NSPAIR(_ZN3ccc7CC0x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y0E[];
extern void _ZN3ccc7CC0x5y03abcEv();
extern void _ZN3ccc7CC0x5y03efgEv();
extern void _ZN3ccc7CC0x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03pqrEv,_ZThn4_N3ccc7CC0x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03efgEv,_ZThn4_N3ccc7CC0x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y03abcEv,_ZThn4_N3ccc7CC0x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y03pqrEv,_ZThn4_N3ccc7CC0x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y03efgEv,_ZThn4_N3ccc7CC0x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y03abcEv,_ZThn4_N3ccc7CC0x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y0E[];
Class_Descriptor cd__ZN3ccc7CC0x5y0E = {  "_ZN3ccc7CC0x5y0E", // class name
  bases__ZN3ccc7CC0x5y0E, 2,
  &(vtc__ZN3ccc7CC0x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y1  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x5y13efgEv
  ~CC0x5y1(); // tgen
  CC0x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y1E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y13abcEv");}
void  ccc::CC0x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y13pqrEv");}
void  ccc::CC0x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y13efgEv");}
ccc::CC0x5y1 ::~CC0x5y1(){ note_dtor("_ZN3ccc7CC0x5y1E", this);} // tgen
ccc::CC0x5y1 ::CC0x5y1(){ note_ctor("_ZN3ccc7CC0x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y1E, buf);
    ::ccc::CC0x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y1E);
    dp->::ccc::CC0x5y1::~CC0x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y1E(Test__ZN3ccc7CC0x5y1E, "_ZN3ccc7CC0x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y1C1Ev();
extern void _ZN3ccc7CC0x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y1E[] = {
  NSPAIR(_ZN3ccc7CC0x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y1E[];
extern void _ZN3ccc7CC0x5y13abcEv();
extern void _ZN3ccc7CC0x5y13efgEv();
extern void _ZN3ccc7CC0x5y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13pqrEv,_ZThn4_N3ccc7CC0x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13efgEv,_ZThn4_N3ccc7CC0x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y13abcEv,_ZThn4_N3ccc7CC0x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y13pqrEv,_ZThn4_N3ccc7CC0x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y13efgEv,_ZThn4_N3ccc7CC0x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y13abcEv,_ZThn4_N3ccc7CC0x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y1E[];
Class_Descriptor cd__ZN3ccc7CC0x5y1E = {  "_ZN3ccc7CC0x5y1E", // class name
  bases__ZN3ccc7CC0x5y1E, 2,
  &(vtc__ZN3ccc7CC0x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y2  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y23pqrEv
  ~CC0x5y2(); // tgen
  CC0x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y2E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y23efgEv");}
void  ccc::CC0x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y23abcEv");}
void  ccc::CC0x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y23pqrEv");}
ccc::CC0x5y2 ::~CC0x5y2(){ note_dtor("_ZN3ccc7CC0x5y2E", this);} // tgen
ccc::CC0x5y2 ::CC0x5y2(){ note_ctor("_ZN3ccc7CC0x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y2E, buf);
    ::ccc::CC0x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y2E);
    dp->::ccc::CC0x5y2::~CC0x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y2E(Test__ZN3ccc7CC0x5y2E, "_ZN3ccc7CC0x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y2C1Ev();
extern void _ZN3ccc7CC0x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y2E[] = {
  NSPAIR(_ZN3ccc7CC0x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y2E[];
extern void _ZN3ccc7CC0x5y23abcEv();
extern void _ZN3ccc7CC0x5y23efgEv();
extern void _ZN3ccc7CC0x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23pqrEv,_ZThn4_N3ccc7CC0x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23efgEv,_ZThn4_N3ccc7CC0x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y23abcEv,_ZThn4_N3ccc7CC0x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y23pqrEv,_ZThn4_N3ccc7CC0x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y23efgEv,_ZThn4_N3ccc7CC0x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y23abcEv,_ZThn4_N3ccc7CC0x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y2E[];
Class_Descriptor cd__ZN3ccc7CC0x5y2E = {  "_ZN3ccc7CC0x5y2E", // class name
  bases__ZN3ccc7CC0x5y2E, 2,
  &(vtc__ZN3ccc7CC0x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y3  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x5y33abcEv
  ~CC0x5y3(); // tgen
  CC0x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y3E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y33efgEv");}
void  ccc::CC0x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y33pqrEv");}
void  ccc::CC0x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y33abcEv");}
ccc::CC0x5y3 ::~CC0x5y3(){ note_dtor("_ZN3ccc7CC0x5y3E", this);} // tgen
ccc::CC0x5y3 ::CC0x5y3(){ note_ctor("_ZN3ccc7CC0x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y3E, buf);
    ::ccc::CC0x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y3E);
    dp->::ccc::CC0x5y3::~CC0x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y3E(Test__ZN3ccc7CC0x5y3E, "_ZN3ccc7CC0x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y3C1Ev();
extern void _ZN3ccc7CC0x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y3E[] = {
  NSPAIR(_ZN3ccc7CC0x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y3E[];
extern void _ZN3ccc7CC0x5y33abcEv();
extern void _ZN3ccc7CC0x5y33efgEv();
extern void _ZN3ccc7CC0x5y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33pqrEv,_ZThn4_N3ccc7CC0x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33efgEv,_ZThn4_N3ccc7CC0x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y33abcEv,_ZThn4_N3ccc7CC0x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y33pqrEv,_ZThn4_N3ccc7CC0x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y33efgEv,_ZThn4_N3ccc7CC0x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y33abcEv,_ZThn4_N3ccc7CC0x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y3E[];
Class_Descriptor cd__ZN3ccc7CC0x5y3E = {  "_ZN3ccc7CC0x5y3E", // class name
  bases__ZN3ccc7CC0x5y3E, 2,
  &(vtc__ZN3ccc7CC0x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y4  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC0x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y43efgEv
  ~CC0x5y4(); // tgen
  CC0x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y4E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y43pqrEv");}
void  ccc::CC0x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y43abcEv");}
void  ccc::CC0x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y43efgEv");}
ccc::CC0x5y4 ::~CC0x5y4(){ note_dtor("_ZN3ccc7CC0x5y4E", this);} // tgen
ccc::CC0x5y4 ::CC0x5y4(){ note_ctor("_ZN3ccc7CC0x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y4E, buf);
    ::ccc::CC0x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y4E);
    dp->::ccc::CC0x5y4::~CC0x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y4E(Test__ZN3ccc7CC0x5y4E, "_ZN3ccc7CC0x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y4C1Ev();
extern void _ZN3ccc7CC0x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y4E[] = {
  NSPAIR(_ZN3ccc7CC0x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y4E[];
extern void _ZN3ccc7CC0x5y43abcEv();
extern void _ZN3ccc7CC0x5y43efgEv();
extern void _ZN3ccc7CC0x5y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43pqrEv,_ZThn4_N3ccc7CC0x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43efgEv,_ZThn4_N3ccc7CC0x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y43abcEv,_ZThn4_N3ccc7CC0x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y43pqrEv,_ZThn4_N3ccc7CC0x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y43efgEv,_ZThn4_N3ccc7CC0x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y43abcEv,_ZThn4_N3ccc7CC0x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y4E[];
Class_Descriptor cd__ZN3ccc7CC0x5y4E = {  "_ZN3ccc7CC0x5y4E", // class name
  bases__ZN3ccc7CC0x5y4E, 2,
  &(vtc__ZN3ccc7CC0x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y5  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC0x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y53abcEv
  ~CC0x5y5(); // tgen
  CC0x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y5E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y53pqrEv");}
void  ccc::CC0x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y53efgEv");}
void  ccc::CC0x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y53abcEv");}
ccc::CC0x5y5 ::~CC0x5y5(){ note_dtor("_ZN3ccc7CC0x5y5E", this);} // tgen
ccc::CC0x5y5 ::CC0x5y5(){ note_ctor("_ZN3ccc7CC0x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y5E, buf);
    ::ccc::CC0x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y5E);
    dp->::ccc::CC0x5y5::~CC0x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y5E(Test__ZN3ccc7CC0x5y5E, "_ZN3ccc7CC0x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y5C1Ev();
extern void _ZN3ccc7CC0x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y5E[] = {
  NSPAIR(_ZN3ccc7CC0x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y5E[];
extern void _ZN3ccc7CC0x5y53abcEv();
extern void _ZN3ccc7CC0x5y53efgEv();
extern void _ZN3ccc7CC0x5y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53pqrEv,_ZThn4_N3ccc7CC0x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53efgEv,_ZThn4_N3ccc7CC0x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y53abcEv,_ZThn4_N3ccc7CC0x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y53pqrEv,_ZThn4_N3ccc7CC0x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y53efgEv,_ZThn4_N3ccc7CC0x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y53abcEv,_ZThn4_N3ccc7CC0x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y5E[];
Class_Descriptor cd__ZN3ccc7CC0x5y5E = {  "_ZN3ccc7CC0x5y5E", // class name
  bases__ZN3ccc7CC0x5y5E, 2,
  &(vtc__ZN3ccc7CC0x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y6  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x5y63efgEv
  ~CC0x5y6(); // tgen
  CC0x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y6E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y63abcEv");}
void  ccc::CC0x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y63efgEv");}
ccc::CC0x5y6 ::~CC0x5y6(){ note_dtor("_ZN3ccc7CC0x5y6E", this);} // tgen
ccc::CC0x5y6 ::CC0x5y6(){ note_ctor("_ZN3ccc7CC0x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y6E, buf);
    ::ccc::CC0x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y6E);
    dp->::ccc::CC0x5y6::~CC0x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y6E(Test__ZN3ccc7CC0x5y6E, "_ZN3ccc7CC0x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y6C1Ev();
extern void _ZN3ccc7CC0x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y6E[] = {
  NSPAIR(_ZN3ccc7CC0x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y6E[];
extern void _ZN3ccc7CC0x5y63abcEv();
extern void _ZN3ccc7CC0x5y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y63efgEv,_ZThn4_N3ccc7CC0x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y63abcEv,_ZThn4_N3ccc7CC0x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y63efgEv,_ZThn4_N3ccc7CC0x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y63abcEv,_ZThn4_N3ccc7CC0x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y6E[];
Class_Descriptor cd__ZN3ccc7CC0x5y6E = {  "_ZN3ccc7CC0x5y6E", // class name
  bases__ZN3ccc7CC0x5y6E, 2,
  &(vtc__ZN3ccc7CC0x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y7  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC0x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y73pqrEv
  ~CC0x5y7(); // tgen
  CC0x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y7E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y73abcEv");}
void  ccc::CC0x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y73pqrEv");}
ccc::CC0x5y7 ::~CC0x5y7(){ note_dtor("_ZN3ccc7CC0x5y7E", this);} // tgen
ccc::CC0x5y7 ::CC0x5y7(){ note_ctor("_ZN3ccc7CC0x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y7E, buf);
    ::ccc::CC0x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y7E);
    dp->::ccc::CC0x5y7::~CC0x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y7E(Test__ZN3ccc7CC0x5y7E, "_ZN3ccc7CC0x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y7C1Ev();
extern void _ZN3ccc7CC0x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y7E[] = {
  NSPAIR(_ZN3ccc7CC0x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y7E[];
extern void _ZN3ccc7CC0x5y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y73pqrEv,_ZThn4_N3ccc7CC0x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y73abcEv,_ZThn4_N3ccc7CC0x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y73pqrEv,_ZThn4_N3ccc7CC0x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y73abcEv,_ZThn4_N3ccc7CC0x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y7E[];
Class_Descriptor cd__ZN3ccc7CC0x5y7E = {  "_ZN3ccc7CC0x5y7E", // class name
  bases__ZN3ccc7CC0x5y7E, 2,
  &(vtc__ZN3ccc7CC0x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y8  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x5y83abcEv
  ~CC0x5y8(); // tgen
  CC0x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y8E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y83efgEv");}
void  ccc::CC0x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x5y83abcEv");}
ccc::CC0x5y8 ::~CC0x5y8(){ note_dtor("_ZN3ccc7CC0x5y8E", this);} // tgen
ccc::CC0x5y8 ::CC0x5y8(){ note_ctor("_ZN3ccc7CC0x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y8E, buf);
    ::ccc::CC0x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y8E);
    dp->::ccc::CC0x5y8::~CC0x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y8E(Test__ZN3ccc7CC0x5y8E, "_ZN3ccc7CC0x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y8C1Ev();
extern void _ZN3ccc7CC0x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y8E[] = {
  NSPAIR(_ZN3ccc7CC0x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y8E[];
extern void _ZN3ccc7CC0x5y83abcEv();
extern void _ZN3ccc7CC0x5y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y83efgEv,_ZThn4_N3ccc7CC0x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y83abcEv,_ZThn4_N3ccc7CC0x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y83efgEv,_ZThn4_N3ccc7CC0x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y83abcEv,_ZThn4_N3ccc7CC0x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y8E[];
Class_Descriptor cd__ZN3ccc7CC0x5y8E = {  "_ZN3ccc7CC0x5y8E", // class name
  bases__ZN3ccc7CC0x5y8E, 2,
  &(vtc__ZN3ccc7CC0x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y9  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC0x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x5y93pqrEv
  ~CC0x5y9(); // tgen
  CC0x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x5y9E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x5y93efgEv");}
void  ccc::CC0x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x5y93pqrEv");}
ccc::CC0x5y9 ::~CC0x5y9(){ note_dtor("_ZN3ccc7CC0x5y9E", this);} // tgen
ccc::CC0x5y9 ::CC0x5y9(){ note_ctor("_ZN3ccc7CC0x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x5y9E, buf);
    ::ccc::CC0x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x5y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC0x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x5y9E);
    dp->::ccc::CC0x5y9::~CC0x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x5y9E(Test__ZN3ccc7CC0x5y9E, "_ZN3ccc7CC0x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x5y9C1Ev();
extern void _ZN3ccc7CC0x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x5y9E[] = {
  NSPAIR(_ZN3ccc7CC0x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC0x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x5y93efgEv();
extern void _ZN3ccc7CC0x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y93pqrEv,_ZThn4_N3ccc7CC0x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x5y93efgEv,_ZThn4_N3ccc7CC0x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y93pqrEv,_ZThn4_N3ccc7CC0x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x5y93efgEv,_ZThn4_N3ccc7CC0x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x5y9E[];
Class_Descriptor cd__ZN3ccc7CC0x5y9E = {  "_ZN3ccc7CC0x5y9E", // class name
  bases__ZN3ccc7CC0x5y9E, 2,
  &(vtc__ZN3ccc7CC0x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y10  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x5y103abcEv
  ~CC0x5y10(); // tgen
  CC0x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y10E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y103pqrEv");}
void  ccc::CC0x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x5y103abcEv");}
ccc::CC0x5y10 ::~CC0x5y10(){ note_dtor("_ZN3ccc8CC0x5y10E", this);} // tgen
ccc::CC0x5y10 ::CC0x5y10(){ note_ctor("_ZN3ccc8CC0x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y10E, buf);
    ::ccc::CC0x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y10E);
    dp->::ccc::CC0x5y10::~CC0x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y10E(Test__ZN3ccc8CC0x5y10E, "_ZN3ccc8CC0x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y10C1Ev();
extern void _ZN3ccc8CC0x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y10E[] = {
  NSPAIR(_ZN3ccc8CC0x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y10E[];
extern void _ZN3ccc8CC0x5y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y103pqrEv,_ZThn4_N3ccc8CC0x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y103abcEv,_ZThn4_N3ccc8CC0x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y103pqrEv,_ZThn4_N3ccc8CC0x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y103abcEv,_ZThn4_N3ccc8CC0x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y10E[];
Class_Descriptor cd__ZN3ccc8CC0x5y10E = {  "_ZN3ccc8CC0x5y10E", // class name
  bases__ZN3ccc8CC0x5y10E, 2,
  &(vtc__ZN3ccc8CC0x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y11  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x5y113efgEv
  ~CC0x5y11(); // tgen
  CC0x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y11E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y113pqrEv");}
void  ccc::CC0x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x5y113efgEv");}
ccc::CC0x5y11 ::~CC0x5y11(){ note_dtor("_ZN3ccc8CC0x5y11E", this);} // tgen
ccc::CC0x5y11 ::CC0x5y11(){ note_ctor("_ZN3ccc8CC0x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y11E, buf);
    ::ccc::CC0x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y11E);
    dp->::ccc::CC0x5y11::~CC0x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y11E(Test__ZN3ccc8CC0x5y11E, "_ZN3ccc8CC0x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y11C1Ev();
extern void _ZN3ccc8CC0x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y11E[] = {
  NSPAIR(_ZN3ccc8CC0x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x5y113efgEv();
extern void _ZN3ccc8CC0x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y113pqrEv,_ZThn4_N3ccc8CC0x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y113efgEv,_ZThn4_N3ccc8CC0x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y113pqrEv,_ZThn4_N3ccc8CC0x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y113efgEv,_ZThn4_N3ccc8CC0x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y11E[];
Class_Descriptor cd__ZN3ccc8CC0x5y11E = {  "_ZN3ccc8CC0x5y11E", // class name
  bases__ZN3ccc8CC0x5y11E, 2,
  &(vtc__ZN3ccc8CC0x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y12  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC0x5y123abcEv
  ~CC0x5y12(); // tgen
  CC0x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC0x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x5y123abcEv");}
ccc::CC0x5y12 ::~CC0x5y12(){ note_dtor("_ZN3ccc8CC0x5y12E", this);} // tgen
ccc::CC0x5y12 ::CC0x5y12(){ note_ctor("_ZN3ccc8CC0x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y12E, buf);
    ::ccc::CC0x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y12E);
    dp->::ccc::CC0x5y12::~CC0x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y12E(Test__ZN3ccc8CC0x5y12E, "_ZN3ccc8CC0x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y12C1Ev();
extern void _ZN3ccc8CC0x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y12E[] = {
  NSPAIR(_ZN3ccc8CC0x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y12E[];
extern void _ZN3ccc8CC0x5y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y123abcEv,_ZThn4_N3ccc8CC0x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y123abcEv,_ZThn4_N3ccc8CC0x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y12E[];
Class_Descriptor cd__ZN3ccc8CC0x5y12E = {  "_ZN3ccc8CC0x5y12E", // class name
  bases__ZN3ccc8CC0x5y12E, 2,
  &(vtc__ZN3ccc8CC0x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y13  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC0x5y133efgEv
  ~CC0x5y13(); // tgen
  CC0x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC0x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x5y133efgEv");}
ccc::CC0x5y13 ::~CC0x5y13(){ note_dtor("_ZN3ccc8CC0x5y13E", this);} // tgen
ccc::CC0x5y13 ::CC0x5y13(){ note_ctor("_ZN3ccc8CC0x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y13E, buf);
    ::ccc::CC0x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y13E);
    dp->::ccc::CC0x5y13::~CC0x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y13E(Test__ZN3ccc8CC0x5y13E, "_ZN3ccc8CC0x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y13C1Ev();
extern void _ZN3ccc8CC0x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y13E[] = {
  NSPAIR(_ZN3ccc8CC0x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x5y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y133efgEv,_ZThn4_N3ccc8CC0x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y133efgEv,_ZThn4_N3ccc8CC0x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y13E[];
Class_Descriptor cd__ZN3ccc8CC0x5y13E = {  "_ZN3ccc8CC0x5y13E", // class name
  bases__ZN3ccc8CC0x5y13E, 2,
  &(vtc__ZN3ccc8CC0x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y14  : ::ccc::AA0 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC0x5y143pqrEv
  ~CC0x5y14(); // tgen
  CC0x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x5y143pqrEv");}
ccc::CC0x5y14 ::~CC0x5y14(){ note_dtor("_ZN3ccc8CC0x5y14E", this);} // tgen
ccc::CC0x5y14 ::CC0x5y14(){ note_ctor("_ZN3ccc8CC0x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y14E, buf);
    ::ccc::CC0x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y14E);
    dp->::ccc::CC0x5y14::~CC0x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y14E(Test__ZN3ccc8CC0x5y14E, "_ZN3ccc8CC0x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y14C1Ev();
extern void _ZN3ccc8CC0x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y14E[] = {
  NSPAIR(_ZN3ccc8CC0x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x5y143pqrEv,_ZThn4_N3ccc8CC0x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x5y143pqrEv,_ZThn4_N3ccc8CC0x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y14E[];
Class_Descriptor cd__ZN3ccc8CC0x5y14E = {  "_ZN3ccc8CC0x5y14E", // class name
  bases__ZN3ccc8CC0x5y14E, 2,
  &(vtc__ZN3ccc8CC0x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x5y15  : ::ccc::AA0 , ::ccc::BB5 {
  ~CC0x5y15(); // tgen
  CC0x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x5y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC0x5y15 ::~CC0x5y15(){ note_dtor("_ZN3ccc8CC0x5y15E", this);} // tgen
ccc::CC0x5y15 ::CC0x5y15(){ note_ctor("_ZN3ccc8CC0x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x5y15E, buf);
    ::ccc::CC0x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x5y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC0x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x5y15E);
    dp->::ccc::CC0x5y15::~CC0x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x5y15E(Test__ZN3ccc8CC0x5y15E, "_ZN3ccc8CC0x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x5y15C1Ev();
extern void _ZN3ccc8CC0x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x5y15E[] = {
  NSPAIR(_ZN3ccc8CC0x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC0x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x5y15E[];
Class_Descriptor cd__ZN3ccc8CC0x5y15E = {  "_ZN3ccc8CC0x5y15E", // class name
  bases__ZN3ccc8CC0x5y15E, 2,
  &(vtc__ZN3ccc8CC0x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y0  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y03pqrEv
  ~CC0x6y0(); // tgen
  CC0x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y0E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y03abcEv");}
void  ccc::CC0x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y03efgEv");}
void  ccc::CC0x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y03pqrEv");}
ccc::CC0x6y0 ::~CC0x6y0(){ note_dtor("_ZN3ccc7CC0x6y0E", this);} // tgen
ccc::CC0x6y0 ::CC0x6y0(){ note_ctor("_ZN3ccc7CC0x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y0E, buf);
    ::ccc::CC0x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y0E);
    dp->::ccc::CC0x6y0::~CC0x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y0E(Test__ZN3ccc7CC0x6y0E, "_ZN3ccc7CC0x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y0C1Ev();
extern void _ZN3ccc7CC0x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y0E[] = {
  NSPAIR(_ZN3ccc7CC0x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y0E[];
extern void _ZN3ccc7CC0x6y03abcEv();
extern void _ZN3ccc7CC0x6y03efgEv();
extern void _ZN3ccc7CC0x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y03abcEv,_ZThn4_N3ccc7CC0x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y03efgEv,_ZThn4_N3ccc7CC0x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y03abcEv,_ZThn4_N3ccc7CC0x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y03efgEv,_ZThn4_N3ccc7CC0x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y0E[];
Class_Descriptor cd__ZN3ccc7CC0x6y0E = {  "_ZN3ccc7CC0x6y0E", // class name
  bases__ZN3ccc7CC0x6y0E, 2,
  &(vtc__ZN3ccc7CC0x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y1  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x6y13efgEv
  ~CC0x6y1(); // tgen
  CC0x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y1E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y13abcEv");}
void  ccc::CC0x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y13pqrEv");}
void  ccc::CC0x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y13efgEv");}
ccc::CC0x6y1 ::~CC0x6y1(){ note_dtor("_ZN3ccc7CC0x6y1E", this);} // tgen
ccc::CC0x6y1 ::CC0x6y1(){ note_ctor("_ZN3ccc7CC0x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y1E, buf);
    ::ccc::CC0x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y1E);
    dp->::ccc::CC0x6y1::~CC0x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y1E(Test__ZN3ccc7CC0x6y1E, "_ZN3ccc7CC0x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y1C1Ev();
extern void _ZN3ccc7CC0x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y1E[] = {
  NSPAIR(_ZN3ccc7CC0x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y1E[];
extern void _ZN3ccc7CC0x6y13abcEv();
extern void _ZN3ccc7CC0x6y13efgEv();
extern void _ZN3ccc7CC0x6y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y13abcEv,_ZThn4_N3ccc7CC0x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y13efgEv,_ZThn4_N3ccc7CC0x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y13abcEv,_ZThn4_N3ccc7CC0x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y13efgEv,_ZThn4_N3ccc7CC0x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y1E[];
Class_Descriptor cd__ZN3ccc7CC0x6y1E = {  "_ZN3ccc7CC0x6y1E", // class name
  bases__ZN3ccc7CC0x6y1E, 2,
  &(vtc__ZN3ccc7CC0x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y2  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y23pqrEv
  ~CC0x6y2(); // tgen
  CC0x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y2E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y23efgEv");}
void  ccc::CC0x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y23abcEv");}
void  ccc::CC0x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y23pqrEv");}
ccc::CC0x6y2 ::~CC0x6y2(){ note_dtor("_ZN3ccc7CC0x6y2E", this);} // tgen
ccc::CC0x6y2 ::CC0x6y2(){ note_ctor("_ZN3ccc7CC0x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y2E, buf);
    ::ccc::CC0x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y2E);
    dp->::ccc::CC0x6y2::~CC0x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y2E(Test__ZN3ccc7CC0x6y2E, "_ZN3ccc7CC0x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y2C1Ev();
extern void _ZN3ccc7CC0x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y2E[] = {
  NSPAIR(_ZN3ccc7CC0x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y2E[];
extern void _ZN3ccc7CC0x6y23abcEv();
extern void _ZN3ccc7CC0x6y23efgEv();
extern void _ZN3ccc7CC0x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y23abcEv,_ZThn4_N3ccc7CC0x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y23efgEv,_ZThn4_N3ccc7CC0x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y23abcEv,_ZThn4_N3ccc7CC0x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y23efgEv,_ZThn4_N3ccc7CC0x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y2E[];
Class_Descriptor cd__ZN3ccc7CC0x6y2E = {  "_ZN3ccc7CC0x6y2E", // class name
  bases__ZN3ccc7CC0x6y2E, 2,
  &(vtc__ZN3ccc7CC0x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y3  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x6y33abcEv
  ~CC0x6y3(); // tgen
  CC0x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y3E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y33efgEv");}
void  ccc::CC0x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y33pqrEv");}
void  ccc::CC0x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y33abcEv");}
ccc::CC0x6y3 ::~CC0x6y3(){ note_dtor("_ZN3ccc7CC0x6y3E", this);} // tgen
ccc::CC0x6y3 ::CC0x6y3(){ note_ctor("_ZN3ccc7CC0x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y3E, buf);
    ::ccc::CC0x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y3E);
    dp->::ccc::CC0x6y3::~CC0x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y3E(Test__ZN3ccc7CC0x6y3E, "_ZN3ccc7CC0x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y3C1Ev();
extern void _ZN3ccc7CC0x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y3E[] = {
  NSPAIR(_ZN3ccc7CC0x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y3E[];
extern void _ZN3ccc7CC0x6y33abcEv();
extern void _ZN3ccc7CC0x6y33efgEv();
extern void _ZN3ccc7CC0x6y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y33abcEv,_ZThn4_N3ccc7CC0x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y33efgEv,_ZThn4_N3ccc7CC0x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y33abcEv,_ZThn4_N3ccc7CC0x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y33efgEv,_ZThn4_N3ccc7CC0x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y3E[];
Class_Descriptor cd__ZN3ccc7CC0x6y3E = {  "_ZN3ccc7CC0x6y3E", // class name
  bases__ZN3ccc7CC0x6y3E, 2,
  &(vtc__ZN3ccc7CC0x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y4  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC0x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y43efgEv
  ~CC0x6y4(); // tgen
  CC0x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y4E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y43pqrEv");}
void  ccc::CC0x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y43abcEv");}
void  ccc::CC0x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y43efgEv");}
ccc::CC0x6y4 ::~CC0x6y4(){ note_dtor("_ZN3ccc7CC0x6y4E", this);} // tgen
ccc::CC0x6y4 ::CC0x6y4(){ note_ctor("_ZN3ccc7CC0x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y4E, buf);
    ::ccc::CC0x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y4E);
    dp->::ccc::CC0x6y4::~CC0x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y4E(Test__ZN3ccc7CC0x6y4E, "_ZN3ccc7CC0x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y4C1Ev();
extern void _ZN3ccc7CC0x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y4E[] = {
  NSPAIR(_ZN3ccc7CC0x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y4E[];
extern void _ZN3ccc7CC0x6y43abcEv();
extern void _ZN3ccc7CC0x6y43efgEv();
extern void _ZN3ccc7CC0x6y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y43abcEv,_ZThn4_N3ccc7CC0x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y43efgEv,_ZThn4_N3ccc7CC0x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y43abcEv,_ZThn4_N3ccc7CC0x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y43efgEv,_ZThn4_N3ccc7CC0x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y4E[];
Class_Descriptor cd__ZN3ccc7CC0x6y4E = {  "_ZN3ccc7CC0x6y4E", // class name
  bases__ZN3ccc7CC0x6y4E, 2,
  &(vtc__ZN3ccc7CC0x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y5  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC0x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y53abcEv
  ~CC0x6y5(); // tgen
  CC0x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y5E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y53pqrEv");}
void  ccc::CC0x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y53efgEv");}
void  ccc::CC0x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y53abcEv");}
ccc::CC0x6y5 ::~CC0x6y5(){ note_dtor("_ZN3ccc7CC0x6y5E", this);} // tgen
ccc::CC0x6y5 ::CC0x6y5(){ note_ctor("_ZN3ccc7CC0x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y5E, buf);
    ::ccc::CC0x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y5E);
    dp->::ccc::CC0x6y5::~CC0x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y5E(Test__ZN3ccc7CC0x6y5E, "_ZN3ccc7CC0x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y5C1Ev();
extern void _ZN3ccc7CC0x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y5E[] = {
  NSPAIR(_ZN3ccc7CC0x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y5E[];
extern void _ZN3ccc7CC0x6y53abcEv();
extern void _ZN3ccc7CC0x6y53efgEv();
extern void _ZN3ccc7CC0x6y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y53abcEv,_ZThn4_N3ccc7CC0x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y53efgEv,_ZThn4_N3ccc7CC0x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y53abcEv,_ZThn4_N3ccc7CC0x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y53efgEv,_ZThn4_N3ccc7CC0x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y5E[];
Class_Descriptor cd__ZN3ccc7CC0x6y5E = {  "_ZN3ccc7CC0x6y5E", // class name
  bases__ZN3ccc7CC0x6y5E, 2,
  &(vtc__ZN3ccc7CC0x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y6  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x6y63efgEv
  ~CC0x6y6(); // tgen
  CC0x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y6E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y63abcEv");}
void  ccc::CC0x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y63efgEv");}
ccc::CC0x6y6 ::~CC0x6y6(){ note_dtor("_ZN3ccc7CC0x6y6E", this);} // tgen
ccc::CC0x6y6 ::CC0x6y6(){ note_ctor("_ZN3ccc7CC0x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y6E, buf);
    ::ccc::CC0x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y6E);
    dp->::ccc::CC0x6y6::~CC0x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y6E(Test__ZN3ccc7CC0x6y6E, "_ZN3ccc7CC0x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y6C1Ev();
extern void _ZN3ccc7CC0x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y6E[] = {
  NSPAIR(_ZN3ccc7CC0x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y6E[];
extern void _ZN3ccc7CC0x6y63abcEv();
extern void _ZN3ccc7CC0x6y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y63abcEv,_ZThn4_N3ccc7CC0x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y63efgEv,_ZThn4_N3ccc7CC0x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y63abcEv,_ZThn4_N3ccc7CC0x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y63efgEv,_ZThn4_N3ccc7CC0x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y6E[];
Class_Descriptor cd__ZN3ccc7CC0x6y6E = {  "_ZN3ccc7CC0x6y6E", // class name
  bases__ZN3ccc7CC0x6y6E, 2,
  &(vtc__ZN3ccc7CC0x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y7  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC0x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y73pqrEv
  ~CC0x6y7(); // tgen
  CC0x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y7E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y73abcEv");}
void  ccc::CC0x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y73pqrEv");}
ccc::CC0x6y7 ::~CC0x6y7(){ note_dtor("_ZN3ccc7CC0x6y7E", this);} // tgen
ccc::CC0x6y7 ::CC0x6y7(){ note_ctor("_ZN3ccc7CC0x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y7E, buf);
    ::ccc::CC0x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y7E);
    dp->::ccc::CC0x6y7::~CC0x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y7E(Test__ZN3ccc7CC0x6y7E, "_ZN3ccc7CC0x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y7C1Ev();
extern void _ZN3ccc7CC0x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y7E[] = {
  NSPAIR(_ZN3ccc7CC0x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y7E[];
extern void _ZN3ccc7CC0x6y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y73abcEv,_ZThn4_N3ccc7CC0x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y73abcEv,_ZThn4_N3ccc7CC0x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y7E[];
Class_Descriptor cd__ZN3ccc7CC0x6y7E = {  "_ZN3ccc7CC0x6y7E", // class name
  bases__ZN3ccc7CC0x6y7E, 2,
  &(vtc__ZN3ccc7CC0x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y8  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x6y83abcEv
  ~CC0x6y8(); // tgen
  CC0x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y8E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y83efgEv");}
void  ccc::CC0x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x6y83abcEv");}
ccc::CC0x6y8 ::~CC0x6y8(){ note_dtor("_ZN3ccc7CC0x6y8E", this);} // tgen
ccc::CC0x6y8 ::CC0x6y8(){ note_ctor("_ZN3ccc7CC0x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y8E, buf);
    ::ccc::CC0x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y8E);
    dp->::ccc::CC0x6y8::~CC0x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y8E(Test__ZN3ccc7CC0x6y8E, "_ZN3ccc7CC0x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y8C1Ev();
extern void _ZN3ccc7CC0x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y8E[] = {
  NSPAIR(_ZN3ccc7CC0x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y8E[];
extern void _ZN3ccc7CC0x6y83abcEv();
extern void _ZN3ccc7CC0x6y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y83abcEv,_ZThn4_N3ccc7CC0x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y83efgEv,_ZThn4_N3ccc7CC0x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y83abcEv,_ZThn4_N3ccc7CC0x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y83efgEv,_ZThn4_N3ccc7CC0x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y8E[];
Class_Descriptor cd__ZN3ccc7CC0x6y8E = {  "_ZN3ccc7CC0x6y8E", // class name
  bases__ZN3ccc7CC0x6y8E, 2,
  &(vtc__ZN3ccc7CC0x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y9  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC0x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x6y93pqrEv
  ~CC0x6y9(); // tgen
  CC0x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x6y9E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x6y93efgEv");}
void  ccc::CC0x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x6y93pqrEv");}
ccc::CC0x6y9 ::~CC0x6y9(){ note_dtor("_ZN3ccc7CC0x6y9E", this);} // tgen
ccc::CC0x6y9 ::CC0x6y9(){ note_ctor("_ZN3ccc7CC0x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x6y9E, buf);
    ::ccc::CC0x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x6y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC0x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x6y9E);
    dp->::ccc::CC0x6y9::~CC0x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x6y9E(Test__ZN3ccc7CC0x6y9E, "_ZN3ccc7CC0x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x6y9C1Ev();
extern void _ZN3ccc7CC0x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x6y9E[] = {
  NSPAIR(_ZN3ccc7CC0x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC0x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x6y93efgEv();
extern void _ZN3ccc7CC0x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x6y93efgEv,_ZThn4_N3ccc7CC0x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x6y93efgEv,_ZThn4_N3ccc7CC0x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x6y9E[];
Class_Descriptor cd__ZN3ccc7CC0x6y9E = {  "_ZN3ccc7CC0x6y9E", // class name
  bases__ZN3ccc7CC0x6y9E, 2,
  &(vtc__ZN3ccc7CC0x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y10  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x6y103abcEv
  ~CC0x6y10(); // tgen
  CC0x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y10E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y103pqrEv");}
void  ccc::CC0x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x6y103abcEv");}
ccc::CC0x6y10 ::~CC0x6y10(){ note_dtor("_ZN3ccc8CC0x6y10E", this);} // tgen
ccc::CC0x6y10 ::CC0x6y10(){ note_ctor("_ZN3ccc8CC0x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y10E, buf);
    ::ccc::CC0x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y10E);
    dp->::ccc::CC0x6y10::~CC0x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y10E(Test__ZN3ccc8CC0x6y10E, "_ZN3ccc8CC0x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y10C1Ev();
extern void _ZN3ccc8CC0x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y10E[] = {
  NSPAIR(_ZN3ccc8CC0x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y10E[];
extern void _ZN3ccc8CC0x6y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y103abcEv,_ZThn4_N3ccc8CC0x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x6y103abcEv,_ZThn4_N3ccc8CC0x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y10E[];
Class_Descriptor cd__ZN3ccc8CC0x6y10E = {  "_ZN3ccc8CC0x6y10E", // class name
  bases__ZN3ccc8CC0x6y10E, 2,
  &(vtc__ZN3ccc8CC0x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y11  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x6y113efgEv
  ~CC0x6y11(); // tgen
  CC0x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y11E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y113pqrEv");}
void  ccc::CC0x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x6y113efgEv");}
ccc::CC0x6y11 ::~CC0x6y11(){ note_dtor("_ZN3ccc8CC0x6y11E", this);} // tgen
ccc::CC0x6y11 ::CC0x6y11(){ note_ctor("_ZN3ccc8CC0x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y11E, buf);
    ::ccc::CC0x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y11E);
    dp->::ccc::CC0x6y11::~CC0x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y11E(Test__ZN3ccc8CC0x6y11E, "_ZN3ccc8CC0x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y11C1Ev();
extern void _ZN3ccc8CC0x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y11E[] = {
  NSPAIR(_ZN3ccc8CC0x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x6y113efgEv();
extern void _ZN3ccc8CC0x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y113efgEv,_ZThn4_N3ccc8CC0x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x6y113efgEv,_ZThn4_N3ccc8CC0x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y11E[];
Class_Descriptor cd__ZN3ccc8CC0x6y11E = {  "_ZN3ccc8CC0x6y11E", // class name
  bases__ZN3ccc8CC0x6y11E, 2,
  &(vtc__ZN3ccc8CC0x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y12  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC0x6y123abcEv
  ~CC0x6y12(); // tgen
  CC0x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x6y123abcEv");}
ccc::CC0x6y12 ::~CC0x6y12(){ note_dtor("_ZN3ccc8CC0x6y12E", this);} // tgen
ccc::CC0x6y12 ::CC0x6y12(){ note_ctor("_ZN3ccc8CC0x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y12E, buf);
    ::ccc::CC0x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y12E);
    dp->::ccc::CC0x6y12::~CC0x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y12E(Test__ZN3ccc8CC0x6y12E, "_ZN3ccc8CC0x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y12C1Ev();
extern void _ZN3ccc8CC0x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y12E[] = {
  NSPAIR(_ZN3ccc8CC0x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y12E[];
extern void _ZN3ccc8CC0x6y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y123abcEv,_ZThn4_N3ccc8CC0x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x6y123abcEv,_ZThn4_N3ccc8CC0x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y12E[];
Class_Descriptor cd__ZN3ccc8CC0x6y12E = {  "_ZN3ccc8CC0x6y12E", // class name
  bases__ZN3ccc8CC0x6y12E, 2,
  &(vtc__ZN3ccc8CC0x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y13  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC0x6y133efgEv
  ~CC0x6y13(); // tgen
  CC0x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x6y133efgEv");}
ccc::CC0x6y13 ::~CC0x6y13(){ note_dtor("_ZN3ccc8CC0x6y13E", this);} // tgen
ccc::CC0x6y13 ::CC0x6y13(){ note_ctor("_ZN3ccc8CC0x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y13E, buf);
    ::ccc::CC0x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y13E);
    dp->::ccc::CC0x6y13::~CC0x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y13E(Test__ZN3ccc8CC0x6y13E, "_ZN3ccc8CC0x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y13C1Ev();
extern void _ZN3ccc8CC0x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y13E[] = {
  NSPAIR(_ZN3ccc8CC0x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x6y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x6y133efgEv,_ZThn4_N3ccc8CC0x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x6y133efgEv,_ZThn4_N3ccc8CC0x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y13E[];
Class_Descriptor cd__ZN3ccc8CC0x6y13E = {  "_ZN3ccc8CC0x6y13E", // class name
  bases__ZN3ccc8CC0x6y13E, 2,
  &(vtc__ZN3ccc8CC0x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y14  : ::ccc::AA0 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC0x6y143pqrEv
  ~CC0x6y14(); // tgen
  CC0x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x6y143pqrEv");}
ccc::CC0x6y14 ::~CC0x6y14(){ note_dtor("_ZN3ccc8CC0x6y14E", this);} // tgen
ccc::CC0x6y14 ::CC0x6y14(){ note_ctor("_ZN3ccc8CC0x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y14E, buf);
    ::ccc::CC0x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y14E);
    dp->::ccc::CC0x6y14::~CC0x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y14E(Test__ZN3ccc8CC0x6y14E, "_ZN3ccc8CC0x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y14C1Ev();
extern void _ZN3ccc8CC0x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y14E[] = {
  NSPAIR(_ZN3ccc8CC0x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y14E[];
Class_Descriptor cd__ZN3ccc8CC0x6y14E = {  "_ZN3ccc8CC0x6y14E", // class name
  bases__ZN3ccc8CC0x6y14E, 2,
  &(vtc__ZN3ccc8CC0x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x6y15  : ::ccc::AA0 , ::ccc::BB6 {
  ~CC0x6y15(); // tgen
  CC0x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x6y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x6y15 ::~CC0x6y15(){ note_dtor("_ZN3ccc8CC0x6y15E", this);} // tgen
ccc::CC0x6y15 ::CC0x6y15(){ note_ctor("_ZN3ccc8CC0x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x6y15E, buf);
    ::ccc::CC0x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x6y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC0x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x6y15E);
    dp->::ccc::CC0x6y15::~CC0x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x6y15E(Test__ZN3ccc8CC0x6y15E, "_ZN3ccc8CC0x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x6y15C1Ev();
extern void _ZN3ccc8CC0x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x6y15E[] = {
  NSPAIR(_ZN3ccc8CC0x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC0x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x6y15E[];
Class_Descriptor cd__ZN3ccc8CC0x6y15E = {  "_ZN3ccc8CC0x6y15E", // class name
  bases__ZN3ccc8CC0x6y15E, 2,
  &(vtc__ZN3ccc8CC0x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y0  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y03pqrEv
  ~CC0x7y0(); // tgen
  CC0x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y0E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y03abcEv");}
void  ccc::CC0x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y03efgEv");}
void  ccc::CC0x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y03pqrEv");}
ccc::CC0x7y0 ::~CC0x7y0(){ note_dtor("_ZN3ccc7CC0x7y0E", this);} // tgen
ccc::CC0x7y0 ::CC0x7y0(){ note_ctor("_ZN3ccc7CC0x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y0E, buf);
    ::ccc::CC0x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y0E);
    dp->::ccc::CC0x7y0::~CC0x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y0E(Test__ZN3ccc7CC0x7y0E, "_ZN3ccc7CC0x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y0C1Ev();
extern void _ZN3ccc7CC0x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y0E[] = {
  NSPAIR(_ZN3ccc7CC0x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y0E[];
extern void _ZN3ccc7CC0x7y03abcEv();
extern void _ZN3ccc7CC0x7y03efgEv();
extern void _ZN3ccc7CC0x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y03abcEv,_ZThn4_N3ccc7CC0x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y03pqrEv,_ZThn4_N3ccc7CC0x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y03abcEv,_ZThn4_N3ccc7CC0x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y03pqrEv,_ZThn4_N3ccc7CC0x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y0E[];
Class_Descriptor cd__ZN3ccc7CC0x7y0E = {  "_ZN3ccc7CC0x7y0E", // class name
  bases__ZN3ccc7CC0x7y0E, 2,
  &(vtc__ZN3ccc7CC0x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y1  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x7y13efgEv
  ~CC0x7y1(); // tgen
  CC0x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y1E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y13abcEv");}
void  ccc::CC0x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y13pqrEv");}
void  ccc::CC0x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y13efgEv");}
ccc::CC0x7y1 ::~CC0x7y1(){ note_dtor("_ZN3ccc7CC0x7y1E", this);} // tgen
ccc::CC0x7y1 ::CC0x7y1(){ note_ctor("_ZN3ccc7CC0x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y1E, buf);
    ::ccc::CC0x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y1E);
    dp->::ccc::CC0x7y1::~CC0x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y1E(Test__ZN3ccc7CC0x7y1E, "_ZN3ccc7CC0x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y1C1Ev();
extern void _ZN3ccc7CC0x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y1E[] = {
  NSPAIR(_ZN3ccc7CC0x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y1E[];
extern void _ZN3ccc7CC0x7y13abcEv();
extern void _ZN3ccc7CC0x7y13efgEv();
extern void _ZN3ccc7CC0x7y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y13abcEv,_ZThn4_N3ccc7CC0x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y13pqrEv,_ZThn4_N3ccc7CC0x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y13abcEv,_ZThn4_N3ccc7CC0x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y13pqrEv,_ZThn4_N3ccc7CC0x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y1E[];
Class_Descriptor cd__ZN3ccc7CC0x7y1E = {  "_ZN3ccc7CC0x7y1E", // class name
  bases__ZN3ccc7CC0x7y1E, 2,
  &(vtc__ZN3ccc7CC0x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y2  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y23pqrEv
  ~CC0x7y2(); // tgen
  CC0x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y2E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y23efgEv");}
void  ccc::CC0x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y23abcEv");}
void  ccc::CC0x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y23pqrEv");}
ccc::CC0x7y2 ::~CC0x7y2(){ note_dtor("_ZN3ccc7CC0x7y2E", this);} // tgen
ccc::CC0x7y2 ::CC0x7y2(){ note_ctor("_ZN3ccc7CC0x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y2E, buf);
    ::ccc::CC0x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y2E);
    dp->::ccc::CC0x7y2::~CC0x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y2E(Test__ZN3ccc7CC0x7y2E, "_ZN3ccc7CC0x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y2C1Ev();
extern void _ZN3ccc7CC0x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y2E[] = {
  NSPAIR(_ZN3ccc7CC0x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y2E[];
extern void _ZN3ccc7CC0x7y23abcEv();
extern void _ZN3ccc7CC0x7y23efgEv();
extern void _ZN3ccc7CC0x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y23abcEv,_ZThn4_N3ccc7CC0x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y23pqrEv,_ZThn4_N3ccc7CC0x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y23abcEv,_ZThn4_N3ccc7CC0x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y23pqrEv,_ZThn4_N3ccc7CC0x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y2E[];
Class_Descriptor cd__ZN3ccc7CC0x7y2E = {  "_ZN3ccc7CC0x7y2E", // class name
  bases__ZN3ccc7CC0x7y2E, 2,
  &(vtc__ZN3ccc7CC0x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y3  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x7y33abcEv
  ~CC0x7y3(); // tgen
  CC0x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y3E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y33efgEv");}
void  ccc::CC0x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y33pqrEv");}
void  ccc::CC0x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y33abcEv");}
ccc::CC0x7y3 ::~CC0x7y3(){ note_dtor("_ZN3ccc7CC0x7y3E", this);} // tgen
ccc::CC0x7y3 ::CC0x7y3(){ note_ctor("_ZN3ccc7CC0x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y3E, buf);
    ::ccc::CC0x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y3E);
    dp->::ccc::CC0x7y3::~CC0x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y3E(Test__ZN3ccc7CC0x7y3E, "_ZN3ccc7CC0x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y3C1Ev();
extern void _ZN3ccc7CC0x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y3E[] = {
  NSPAIR(_ZN3ccc7CC0x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y3E[];
extern void _ZN3ccc7CC0x7y33abcEv();
extern void _ZN3ccc7CC0x7y33efgEv();
extern void _ZN3ccc7CC0x7y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y33abcEv,_ZThn4_N3ccc7CC0x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y33pqrEv,_ZThn4_N3ccc7CC0x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y33abcEv,_ZThn4_N3ccc7CC0x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y33pqrEv,_ZThn4_N3ccc7CC0x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y3E[];
Class_Descriptor cd__ZN3ccc7CC0x7y3E = {  "_ZN3ccc7CC0x7y3E", // class name
  bases__ZN3ccc7CC0x7y3E, 2,
  &(vtc__ZN3ccc7CC0x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y4  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC0x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y43efgEv
  ~CC0x7y4(); // tgen
  CC0x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y4E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y43pqrEv");}
void  ccc::CC0x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y43abcEv");}
void  ccc::CC0x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y43efgEv");}
ccc::CC0x7y4 ::~CC0x7y4(){ note_dtor("_ZN3ccc7CC0x7y4E", this);} // tgen
ccc::CC0x7y4 ::CC0x7y4(){ note_ctor("_ZN3ccc7CC0x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y4E, buf);
    ::ccc::CC0x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y4E);
    dp->::ccc::CC0x7y4::~CC0x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y4E(Test__ZN3ccc7CC0x7y4E, "_ZN3ccc7CC0x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y4C1Ev();
extern void _ZN3ccc7CC0x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y4E[] = {
  NSPAIR(_ZN3ccc7CC0x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y4E[];
extern void _ZN3ccc7CC0x7y43abcEv();
extern void _ZN3ccc7CC0x7y43efgEv();
extern void _ZN3ccc7CC0x7y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y43abcEv,_ZThn4_N3ccc7CC0x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y43pqrEv,_ZThn4_N3ccc7CC0x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y43abcEv,_ZThn4_N3ccc7CC0x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y43pqrEv,_ZThn4_N3ccc7CC0x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y4E[];
Class_Descriptor cd__ZN3ccc7CC0x7y4E = {  "_ZN3ccc7CC0x7y4E", // class name
  bases__ZN3ccc7CC0x7y4E, 2,
  &(vtc__ZN3ccc7CC0x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y5  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC0x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y53abcEv
  ~CC0x7y5(); // tgen
  CC0x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y5E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y53pqrEv");}
void  ccc::CC0x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y53efgEv");}
void  ccc::CC0x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y53abcEv");}
ccc::CC0x7y5 ::~CC0x7y5(){ note_dtor("_ZN3ccc7CC0x7y5E", this);} // tgen
ccc::CC0x7y5 ::CC0x7y5(){ note_ctor("_ZN3ccc7CC0x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y5E, buf);
    ::ccc::CC0x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y5E);
    dp->::ccc::CC0x7y5::~CC0x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y5E(Test__ZN3ccc7CC0x7y5E, "_ZN3ccc7CC0x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y5C1Ev();
extern void _ZN3ccc7CC0x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y5E[] = {
  NSPAIR(_ZN3ccc7CC0x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y5E[];
extern void _ZN3ccc7CC0x7y53abcEv();
extern void _ZN3ccc7CC0x7y53efgEv();
extern void _ZN3ccc7CC0x7y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y53abcEv,_ZThn4_N3ccc7CC0x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y53pqrEv,_ZThn4_N3ccc7CC0x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y53abcEv,_ZThn4_N3ccc7CC0x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y53pqrEv,_ZThn4_N3ccc7CC0x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y5E[];
Class_Descriptor cd__ZN3ccc7CC0x7y5E = {  "_ZN3ccc7CC0x7y5E", // class name
  bases__ZN3ccc7CC0x7y5E, 2,
  &(vtc__ZN3ccc7CC0x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y6  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x7y63efgEv
  ~CC0x7y6(); // tgen
  CC0x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y6E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y63abcEv");}
void  ccc::CC0x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y63efgEv");}
ccc::CC0x7y6 ::~CC0x7y6(){ note_dtor("_ZN3ccc7CC0x7y6E", this);} // tgen
ccc::CC0x7y6 ::CC0x7y6(){ note_ctor("_ZN3ccc7CC0x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y6E, buf);
    ::ccc::CC0x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y6E);
    dp->::ccc::CC0x7y6::~CC0x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y6E(Test__ZN3ccc7CC0x7y6E, "_ZN3ccc7CC0x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y6C1Ev();
extern void _ZN3ccc7CC0x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y6E[] = {
  NSPAIR(_ZN3ccc7CC0x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y6E[];
extern void _ZN3ccc7CC0x7y63abcEv();
extern void _ZN3ccc7CC0x7y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y63abcEv,_ZThn4_N3ccc7CC0x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y63abcEv,_ZThn4_N3ccc7CC0x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y6E[];
Class_Descriptor cd__ZN3ccc7CC0x7y6E = {  "_ZN3ccc7CC0x7y6E", // class name
  bases__ZN3ccc7CC0x7y6E, 2,
  &(vtc__ZN3ccc7CC0x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y7  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC0x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y73pqrEv
  ~CC0x7y7(); // tgen
  CC0x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y7E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y73abcEv");}
void  ccc::CC0x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y73pqrEv");}
ccc::CC0x7y7 ::~CC0x7y7(){ note_dtor("_ZN3ccc7CC0x7y7E", this);} // tgen
ccc::CC0x7y7 ::CC0x7y7(){ note_ctor("_ZN3ccc7CC0x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y7E, buf);
    ::ccc::CC0x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y7E);
    dp->::ccc::CC0x7y7::~CC0x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y7E(Test__ZN3ccc7CC0x7y7E, "_ZN3ccc7CC0x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y7C1Ev();
extern void _ZN3ccc7CC0x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y7E[] = {
  NSPAIR(_ZN3ccc7CC0x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y7E[];
extern void _ZN3ccc7CC0x7y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y73abcEv,_ZThn4_N3ccc7CC0x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y73pqrEv,_ZThn4_N3ccc7CC0x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y73abcEv,_ZThn4_N3ccc7CC0x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y73pqrEv,_ZThn4_N3ccc7CC0x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y7E[];
Class_Descriptor cd__ZN3ccc7CC0x7y7E = {  "_ZN3ccc7CC0x7y7E", // class name
  bases__ZN3ccc7CC0x7y7E, 2,
  &(vtc__ZN3ccc7CC0x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y8  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x7y83abcEv
  ~CC0x7y8(); // tgen
  CC0x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y8E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y83efgEv");}
void  ccc::CC0x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x7y83abcEv");}
ccc::CC0x7y8 ::~CC0x7y8(){ note_dtor("_ZN3ccc7CC0x7y8E", this);} // tgen
ccc::CC0x7y8 ::CC0x7y8(){ note_ctor("_ZN3ccc7CC0x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y8E, buf);
    ::ccc::CC0x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y8E);
    dp->::ccc::CC0x7y8::~CC0x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y8E(Test__ZN3ccc7CC0x7y8E, "_ZN3ccc7CC0x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y8C1Ev();
extern void _ZN3ccc7CC0x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y8E[] = {
  NSPAIR(_ZN3ccc7CC0x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y8E[];
extern void _ZN3ccc7CC0x7y83abcEv();
extern void _ZN3ccc7CC0x7y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y83abcEv,_ZThn4_N3ccc7CC0x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y83abcEv,_ZThn4_N3ccc7CC0x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y8E[];
Class_Descriptor cd__ZN3ccc7CC0x7y8E = {  "_ZN3ccc7CC0x7y8E", // class name
  bases__ZN3ccc7CC0x7y8E, 2,
  &(vtc__ZN3ccc7CC0x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y9  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC0x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x7y93pqrEv
  ~CC0x7y9(); // tgen
  CC0x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x7y9E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x7y93efgEv");}
void  ccc::CC0x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x7y93pqrEv");}
ccc::CC0x7y9 ::~CC0x7y9(){ note_dtor("_ZN3ccc7CC0x7y9E", this);} // tgen
ccc::CC0x7y9 ::CC0x7y9(){ note_ctor("_ZN3ccc7CC0x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x7y9E, buf);
    ::ccc::CC0x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x7y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC0x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x7y9E);
    dp->::ccc::CC0x7y9::~CC0x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x7y9E(Test__ZN3ccc7CC0x7y9E, "_ZN3ccc7CC0x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x7y9C1Ev();
extern void _ZN3ccc7CC0x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x7y9E[] = {
  NSPAIR(_ZN3ccc7CC0x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC0x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x7y93efgEv();
extern void _ZN3ccc7CC0x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x7y93pqrEv,_ZThn4_N3ccc7CC0x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x7y93pqrEv,_ZThn4_N3ccc7CC0x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x7y9E[];
Class_Descriptor cd__ZN3ccc7CC0x7y9E = {  "_ZN3ccc7CC0x7y9E", // class name
  bases__ZN3ccc7CC0x7y9E, 2,
  &(vtc__ZN3ccc7CC0x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y10  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x7y103abcEv
  ~CC0x7y10(); // tgen
  CC0x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y10E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y103pqrEv");}
void  ccc::CC0x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x7y103abcEv");}
ccc::CC0x7y10 ::~CC0x7y10(){ note_dtor("_ZN3ccc8CC0x7y10E", this);} // tgen
ccc::CC0x7y10 ::CC0x7y10(){ note_ctor("_ZN3ccc8CC0x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y10E, buf);
    ::ccc::CC0x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y10E);
    dp->::ccc::CC0x7y10::~CC0x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y10E(Test__ZN3ccc8CC0x7y10E, "_ZN3ccc8CC0x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y10C1Ev();
extern void _ZN3ccc8CC0x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y10E[] = {
  NSPAIR(_ZN3ccc8CC0x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y10E[];
extern void _ZN3ccc8CC0x7y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y103abcEv,_ZThn4_N3ccc8CC0x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y103pqrEv,_ZThn4_N3ccc8CC0x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x7y103abcEv,_ZThn4_N3ccc8CC0x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x7y103pqrEv,_ZThn4_N3ccc8CC0x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y10E[];
Class_Descriptor cd__ZN3ccc8CC0x7y10E = {  "_ZN3ccc8CC0x7y10E", // class name
  bases__ZN3ccc8CC0x7y10E, 2,
  &(vtc__ZN3ccc8CC0x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y11  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x7y113efgEv
  ~CC0x7y11(); // tgen
  CC0x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y11E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y113pqrEv");}
void  ccc::CC0x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x7y113efgEv");}
ccc::CC0x7y11 ::~CC0x7y11(){ note_dtor("_ZN3ccc8CC0x7y11E", this);} // tgen
ccc::CC0x7y11 ::CC0x7y11(){ note_ctor("_ZN3ccc8CC0x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y11E, buf);
    ::ccc::CC0x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y11E);
    dp->::ccc::CC0x7y11::~CC0x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y11E(Test__ZN3ccc8CC0x7y11E, "_ZN3ccc8CC0x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y11C1Ev();
extern void _ZN3ccc8CC0x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y11E[] = {
  NSPAIR(_ZN3ccc8CC0x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x7y113efgEv();
extern void _ZN3ccc8CC0x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y113pqrEv,_ZThn4_N3ccc8CC0x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x7y113pqrEv,_ZThn4_N3ccc8CC0x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y11E[];
Class_Descriptor cd__ZN3ccc8CC0x7y11E = {  "_ZN3ccc8CC0x7y11E", // class name
  bases__ZN3ccc8CC0x7y11E, 2,
  &(vtc__ZN3ccc8CC0x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y12  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC0x7y123abcEv
  ~CC0x7y12(); // tgen
  CC0x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x7y123abcEv");}
ccc::CC0x7y12 ::~CC0x7y12(){ note_dtor("_ZN3ccc8CC0x7y12E", this);} // tgen
ccc::CC0x7y12 ::CC0x7y12(){ note_ctor("_ZN3ccc8CC0x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y12E, buf);
    ::ccc::CC0x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y12E);
    dp->::ccc::CC0x7y12::~CC0x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y12E(Test__ZN3ccc8CC0x7y12E, "_ZN3ccc8CC0x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y12C1Ev();
extern void _ZN3ccc8CC0x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y12E[] = {
  NSPAIR(_ZN3ccc8CC0x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y12E[];
extern void _ZN3ccc8CC0x7y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y123abcEv,_ZThn4_N3ccc8CC0x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x7y123abcEv,_ZThn4_N3ccc8CC0x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y12E[];
Class_Descriptor cd__ZN3ccc8CC0x7y12E = {  "_ZN3ccc8CC0x7y12E", // class name
  bases__ZN3ccc8CC0x7y12E, 2,
  &(vtc__ZN3ccc8CC0x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y13  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC0x7y133efgEv
  ~CC0x7y13(); // tgen
  CC0x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x7y133efgEv");}
ccc::CC0x7y13 ::~CC0x7y13(){ note_dtor("_ZN3ccc8CC0x7y13E", this);} // tgen
ccc::CC0x7y13 ::CC0x7y13(){ note_ctor("_ZN3ccc8CC0x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y13E, buf);
    ::ccc::CC0x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y13E);
    dp->::ccc::CC0x7y13::~CC0x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y13E(Test__ZN3ccc8CC0x7y13E, "_ZN3ccc8CC0x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y13C1Ev();
extern void _ZN3ccc8CC0x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y13E[] = {
  NSPAIR(_ZN3ccc8CC0x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x7y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y13E[];
Class_Descriptor cd__ZN3ccc8CC0x7y13E = {  "_ZN3ccc8CC0x7y13E", // class name
  bases__ZN3ccc8CC0x7y13E, 2,
  &(vtc__ZN3ccc8CC0x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y14  : ::ccc::AA0 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC0x7y143pqrEv
  ~CC0x7y14(); // tgen
  CC0x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x7y143pqrEv");}
ccc::CC0x7y14 ::~CC0x7y14(){ note_dtor("_ZN3ccc8CC0x7y14E", this);} // tgen
ccc::CC0x7y14 ::CC0x7y14(){ note_ctor("_ZN3ccc8CC0x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y14E, buf);
    ::ccc::CC0x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y14E);
    dp->::ccc::CC0x7y14::~CC0x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y14E(Test__ZN3ccc8CC0x7y14E, "_ZN3ccc8CC0x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y14C1Ev();
extern void _ZN3ccc8CC0x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y14E[] = {
  NSPAIR(_ZN3ccc8CC0x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x7y143pqrEv,_ZThn4_N3ccc8CC0x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x7y143pqrEv,_ZThn4_N3ccc8CC0x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y14E[];
Class_Descriptor cd__ZN3ccc8CC0x7y14E = {  "_ZN3ccc8CC0x7y14E", // class name
  bases__ZN3ccc8CC0x7y14E, 2,
  &(vtc__ZN3ccc8CC0x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x7y15  : ::ccc::AA0 , ::ccc::BB7 {
  ~CC0x7y15(); // tgen
  CC0x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x7y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x7y15 ::~CC0x7y15(){ note_dtor("_ZN3ccc8CC0x7y15E", this);} // tgen
ccc::CC0x7y15 ::CC0x7y15(){ note_ctor("_ZN3ccc8CC0x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x7y15E, buf);
    ::ccc::CC0x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x7y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC0x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x7y15E);
    dp->::ccc::CC0x7y15::~CC0x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x7y15E(Test__ZN3ccc8CC0x7y15E, "_ZN3ccc8CC0x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x7y15C1Ev();
extern void _ZN3ccc8CC0x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x7y15E[] = {
  NSPAIR(_ZN3ccc8CC0x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC0x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x7y15E[];
Class_Descriptor cd__ZN3ccc8CC0x7y15E = {  "_ZN3ccc8CC0x7y15E", // class name
  bases__ZN3ccc8CC0x7y15E, 2,
  &(vtc__ZN3ccc8CC0x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y0  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y03pqrEv
  ~CC0x8y0(); // tgen
  CC0x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y0E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y03abcEv");}
void  ccc::CC0x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y03efgEv");}
void  ccc::CC0x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y03pqrEv");}
ccc::CC0x8y0 ::~CC0x8y0(){ note_dtor("_ZN3ccc7CC0x8y0E", this);} // tgen
ccc::CC0x8y0 ::CC0x8y0(){ note_ctor("_ZN3ccc7CC0x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y0E, buf);
    ::ccc::CC0x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y0E);
    dp->::ccc::CC0x8y0::~CC0x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y0E(Test__ZN3ccc7CC0x8y0E, "_ZN3ccc7CC0x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y0C1Ev();
extern void _ZN3ccc7CC0x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y0E[] = {
  NSPAIR(_ZN3ccc7CC0x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y0E[];
extern void _ZN3ccc7CC0x8y03abcEv();
extern void _ZN3ccc7CC0x8y03efgEv();
extern void _ZN3ccc7CC0x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y03efgEv,_ZThn4_N3ccc7CC0x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y03abcEv,_ZThn4_N3ccc7CC0x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y03efgEv,_ZThn4_N3ccc7CC0x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y03abcEv,_ZThn4_N3ccc7CC0x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y0E[];
Class_Descriptor cd__ZN3ccc7CC0x8y0E = {  "_ZN3ccc7CC0x8y0E", // class name
  bases__ZN3ccc7CC0x8y0E, 2,
  &(vtc__ZN3ccc7CC0x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y1  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x8y13efgEv
  ~CC0x8y1(); // tgen
  CC0x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y1E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y13abcEv");}
void  ccc::CC0x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y13pqrEv");}
void  ccc::CC0x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y13efgEv");}
ccc::CC0x8y1 ::~CC0x8y1(){ note_dtor("_ZN3ccc7CC0x8y1E", this);} // tgen
ccc::CC0x8y1 ::CC0x8y1(){ note_ctor("_ZN3ccc7CC0x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y1E, buf);
    ::ccc::CC0x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y1E);
    dp->::ccc::CC0x8y1::~CC0x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y1E(Test__ZN3ccc7CC0x8y1E, "_ZN3ccc7CC0x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y1C1Ev();
extern void _ZN3ccc7CC0x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y1E[] = {
  NSPAIR(_ZN3ccc7CC0x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y1E[];
extern void _ZN3ccc7CC0x8y13abcEv();
extern void _ZN3ccc7CC0x8y13efgEv();
extern void _ZN3ccc7CC0x8y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y13efgEv,_ZThn4_N3ccc7CC0x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y13abcEv,_ZThn4_N3ccc7CC0x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y13efgEv,_ZThn4_N3ccc7CC0x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y13abcEv,_ZThn4_N3ccc7CC0x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y1E[];
Class_Descriptor cd__ZN3ccc7CC0x8y1E = {  "_ZN3ccc7CC0x8y1E", // class name
  bases__ZN3ccc7CC0x8y1E, 2,
  &(vtc__ZN3ccc7CC0x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y2  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y23pqrEv
  ~CC0x8y2(); // tgen
  CC0x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y2E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y23efgEv");}
void  ccc::CC0x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y23abcEv");}
void  ccc::CC0x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y23pqrEv");}
ccc::CC0x8y2 ::~CC0x8y2(){ note_dtor("_ZN3ccc7CC0x8y2E", this);} // tgen
ccc::CC0x8y2 ::CC0x8y2(){ note_ctor("_ZN3ccc7CC0x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y2E, buf);
    ::ccc::CC0x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y2E);
    dp->::ccc::CC0x8y2::~CC0x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y2E(Test__ZN3ccc7CC0x8y2E, "_ZN3ccc7CC0x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y2C1Ev();
extern void _ZN3ccc7CC0x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y2E[] = {
  NSPAIR(_ZN3ccc7CC0x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y2E[];
extern void _ZN3ccc7CC0x8y23abcEv();
extern void _ZN3ccc7CC0x8y23efgEv();
extern void _ZN3ccc7CC0x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y23efgEv,_ZThn4_N3ccc7CC0x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y23abcEv,_ZThn4_N3ccc7CC0x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y23efgEv,_ZThn4_N3ccc7CC0x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y23abcEv,_ZThn4_N3ccc7CC0x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y2E[];
Class_Descriptor cd__ZN3ccc7CC0x8y2E = {  "_ZN3ccc7CC0x8y2E", // class name
  bases__ZN3ccc7CC0x8y2E, 2,
  &(vtc__ZN3ccc7CC0x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y3  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x8y33abcEv
  ~CC0x8y3(); // tgen
  CC0x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y3E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y33efgEv");}
void  ccc::CC0x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y33pqrEv");}
void  ccc::CC0x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y33abcEv");}
ccc::CC0x8y3 ::~CC0x8y3(){ note_dtor("_ZN3ccc7CC0x8y3E", this);} // tgen
ccc::CC0x8y3 ::CC0x8y3(){ note_ctor("_ZN3ccc7CC0x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y3E, buf);
    ::ccc::CC0x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y3E);
    dp->::ccc::CC0x8y3::~CC0x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y3E(Test__ZN3ccc7CC0x8y3E, "_ZN3ccc7CC0x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y3C1Ev();
extern void _ZN3ccc7CC0x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y3E[] = {
  NSPAIR(_ZN3ccc7CC0x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y3E[];
extern void _ZN3ccc7CC0x8y33abcEv();
extern void _ZN3ccc7CC0x8y33efgEv();
extern void _ZN3ccc7CC0x8y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y33efgEv,_ZThn4_N3ccc7CC0x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y33abcEv,_ZThn4_N3ccc7CC0x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y33efgEv,_ZThn4_N3ccc7CC0x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y33abcEv,_ZThn4_N3ccc7CC0x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y3E[];
Class_Descriptor cd__ZN3ccc7CC0x8y3E = {  "_ZN3ccc7CC0x8y3E", // class name
  bases__ZN3ccc7CC0x8y3E, 2,
  &(vtc__ZN3ccc7CC0x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y4  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC0x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y43efgEv
  ~CC0x8y4(); // tgen
  CC0x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y4E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y43pqrEv");}
void  ccc::CC0x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y43abcEv");}
void  ccc::CC0x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y43efgEv");}
ccc::CC0x8y4 ::~CC0x8y4(){ note_dtor("_ZN3ccc7CC0x8y4E", this);} // tgen
ccc::CC0x8y4 ::CC0x8y4(){ note_ctor("_ZN3ccc7CC0x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y4E, buf);
    ::ccc::CC0x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y4E);
    dp->::ccc::CC0x8y4::~CC0x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y4E(Test__ZN3ccc7CC0x8y4E, "_ZN3ccc7CC0x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y4C1Ev();
extern void _ZN3ccc7CC0x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y4E[] = {
  NSPAIR(_ZN3ccc7CC0x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y4E[];
extern void _ZN3ccc7CC0x8y43abcEv();
extern void _ZN3ccc7CC0x8y43efgEv();
extern void _ZN3ccc7CC0x8y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y43efgEv,_ZThn4_N3ccc7CC0x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y43abcEv,_ZThn4_N3ccc7CC0x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y43efgEv,_ZThn4_N3ccc7CC0x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y43abcEv,_ZThn4_N3ccc7CC0x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y4E[];
Class_Descriptor cd__ZN3ccc7CC0x8y4E = {  "_ZN3ccc7CC0x8y4E", // class name
  bases__ZN3ccc7CC0x8y4E, 2,
  &(vtc__ZN3ccc7CC0x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y5  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC0x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y53abcEv
  ~CC0x8y5(); // tgen
  CC0x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y5E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y53pqrEv");}
void  ccc::CC0x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y53efgEv");}
void  ccc::CC0x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y53abcEv");}
ccc::CC0x8y5 ::~CC0x8y5(){ note_dtor("_ZN3ccc7CC0x8y5E", this);} // tgen
ccc::CC0x8y5 ::CC0x8y5(){ note_ctor("_ZN3ccc7CC0x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y5E, buf);
    ::ccc::CC0x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y5E);
    dp->::ccc::CC0x8y5::~CC0x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y5E(Test__ZN3ccc7CC0x8y5E, "_ZN3ccc7CC0x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y5C1Ev();
extern void _ZN3ccc7CC0x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y5E[] = {
  NSPAIR(_ZN3ccc7CC0x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y5E[];
extern void _ZN3ccc7CC0x8y53abcEv();
extern void _ZN3ccc7CC0x8y53efgEv();
extern void _ZN3ccc7CC0x8y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y53efgEv,_ZThn4_N3ccc7CC0x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y53abcEv,_ZThn4_N3ccc7CC0x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y53efgEv,_ZThn4_N3ccc7CC0x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y53abcEv,_ZThn4_N3ccc7CC0x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y5E[];
Class_Descriptor cd__ZN3ccc7CC0x8y5E = {  "_ZN3ccc7CC0x8y5E", // class name
  bases__ZN3ccc7CC0x8y5E, 2,
  &(vtc__ZN3ccc7CC0x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y6  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x8y63efgEv
  ~CC0x8y6(); // tgen
  CC0x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y6E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y63abcEv");}
void  ccc::CC0x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y63efgEv");}
ccc::CC0x8y6 ::~CC0x8y6(){ note_dtor("_ZN3ccc7CC0x8y6E", this);} // tgen
ccc::CC0x8y6 ::CC0x8y6(){ note_ctor("_ZN3ccc7CC0x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y6E, buf);
    ::ccc::CC0x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y6E);
    dp->::ccc::CC0x8y6::~CC0x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y6E(Test__ZN3ccc7CC0x8y6E, "_ZN3ccc7CC0x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y6C1Ev();
extern void _ZN3ccc7CC0x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y6E[] = {
  NSPAIR(_ZN3ccc7CC0x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y6E[];
extern void _ZN3ccc7CC0x8y63abcEv();
extern void _ZN3ccc7CC0x8y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y63efgEv,_ZThn4_N3ccc7CC0x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y63abcEv,_ZThn4_N3ccc7CC0x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y63efgEv,_ZThn4_N3ccc7CC0x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y63abcEv,_ZThn4_N3ccc7CC0x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y6E[];
Class_Descriptor cd__ZN3ccc7CC0x8y6E = {  "_ZN3ccc7CC0x8y6E", // class name
  bases__ZN3ccc7CC0x8y6E, 2,
  &(vtc__ZN3ccc7CC0x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y7  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC0x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y73pqrEv
  ~CC0x8y7(); // tgen
  CC0x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y7E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y73abcEv");}
void  ccc::CC0x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y73pqrEv");}
ccc::CC0x8y7 ::~CC0x8y7(){ note_dtor("_ZN3ccc7CC0x8y7E", this);} // tgen
ccc::CC0x8y7 ::CC0x8y7(){ note_ctor("_ZN3ccc7CC0x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y7E, buf);
    ::ccc::CC0x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y7E);
    dp->::ccc::CC0x8y7::~CC0x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y7E(Test__ZN3ccc7CC0x8y7E, "_ZN3ccc7CC0x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y7C1Ev();
extern void _ZN3ccc7CC0x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y7E[] = {
  NSPAIR(_ZN3ccc7CC0x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y7E[];
extern void _ZN3ccc7CC0x8y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y73abcEv,_ZThn4_N3ccc7CC0x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y73abcEv,_ZThn4_N3ccc7CC0x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y7E[];
Class_Descriptor cd__ZN3ccc7CC0x8y7E = {  "_ZN3ccc7CC0x8y7E", // class name
  bases__ZN3ccc7CC0x8y7E, 2,
  &(vtc__ZN3ccc7CC0x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y8  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x8y83abcEv
  ~CC0x8y8(); // tgen
  CC0x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y8E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y83efgEv");}
void  ccc::CC0x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x8y83abcEv");}
ccc::CC0x8y8 ::~CC0x8y8(){ note_dtor("_ZN3ccc7CC0x8y8E", this);} // tgen
ccc::CC0x8y8 ::CC0x8y8(){ note_ctor("_ZN3ccc7CC0x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y8E, buf);
    ::ccc::CC0x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y8E);
    dp->::ccc::CC0x8y8::~CC0x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y8E(Test__ZN3ccc7CC0x8y8E, "_ZN3ccc7CC0x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y8C1Ev();
extern void _ZN3ccc7CC0x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y8E[] = {
  NSPAIR(_ZN3ccc7CC0x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y8E[];
extern void _ZN3ccc7CC0x8y83abcEv();
extern void _ZN3ccc7CC0x8y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y83efgEv,_ZThn4_N3ccc7CC0x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y83abcEv,_ZThn4_N3ccc7CC0x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y83efgEv,_ZThn4_N3ccc7CC0x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y83abcEv,_ZThn4_N3ccc7CC0x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y8E[];
Class_Descriptor cd__ZN3ccc7CC0x8y8E = {  "_ZN3ccc7CC0x8y8E", // class name
  bases__ZN3ccc7CC0x8y8E, 2,
  &(vtc__ZN3ccc7CC0x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y9  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC0x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x8y93pqrEv
  ~CC0x8y9(); // tgen
  CC0x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x8y9E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x8y93efgEv");}
void  ccc::CC0x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x8y93pqrEv");}
ccc::CC0x8y9 ::~CC0x8y9(){ note_dtor("_ZN3ccc7CC0x8y9E", this);} // tgen
ccc::CC0x8y9 ::CC0x8y9(){ note_ctor("_ZN3ccc7CC0x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x8y9E, buf);
    ::ccc::CC0x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x8y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC0x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x8y9E);
    dp->::ccc::CC0x8y9::~CC0x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x8y9E(Test__ZN3ccc7CC0x8y9E, "_ZN3ccc7CC0x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x8y9C1Ev();
extern void _ZN3ccc7CC0x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x8y9E[] = {
  NSPAIR(_ZN3ccc7CC0x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC0x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x8y93efgEv();
extern void _ZN3ccc7CC0x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x8y93efgEv,_ZThn4_N3ccc7CC0x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x8y93efgEv,_ZThn4_N3ccc7CC0x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x8y9E[];
Class_Descriptor cd__ZN3ccc7CC0x8y9E = {  "_ZN3ccc7CC0x8y9E", // class name
  bases__ZN3ccc7CC0x8y9E, 2,
  &(vtc__ZN3ccc7CC0x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y10  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x8y103abcEv
  ~CC0x8y10(); // tgen
  CC0x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y10E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y103pqrEv");}
void  ccc::CC0x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x8y103abcEv");}
ccc::CC0x8y10 ::~CC0x8y10(){ note_dtor("_ZN3ccc8CC0x8y10E", this);} // tgen
ccc::CC0x8y10 ::CC0x8y10(){ note_ctor("_ZN3ccc8CC0x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y10E, buf);
    ::ccc::CC0x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y10E);
    dp->::ccc::CC0x8y10::~CC0x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y10E(Test__ZN3ccc8CC0x8y10E, "_ZN3ccc8CC0x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y10C1Ev();
extern void _ZN3ccc8CC0x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y10E[] = {
  NSPAIR(_ZN3ccc8CC0x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y10E[];
extern void _ZN3ccc8CC0x8y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y103abcEv,_ZThn4_N3ccc8CC0x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x8y103abcEv,_ZThn4_N3ccc8CC0x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y10E[];
Class_Descriptor cd__ZN3ccc8CC0x8y10E = {  "_ZN3ccc8CC0x8y10E", // class name
  bases__ZN3ccc8CC0x8y10E, 2,
  &(vtc__ZN3ccc8CC0x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y11  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x8y113efgEv
  ~CC0x8y11(); // tgen
  CC0x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y11E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y113pqrEv");}
void  ccc::CC0x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x8y113efgEv");}
ccc::CC0x8y11 ::~CC0x8y11(){ note_dtor("_ZN3ccc8CC0x8y11E", this);} // tgen
ccc::CC0x8y11 ::CC0x8y11(){ note_ctor("_ZN3ccc8CC0x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y11E, buf);
    ::ccc::CC0x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y11E);
    dp->::ccc::CC0x8y11::~CC0x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y11E(Test__ZN3ccc8CC0x8y11E, "_ZN3ccc8CC0x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y11C1Ev();
extern void _ZN3ccc8CC0x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y11E[] = {
  NSPAIR(_ZN3ccc8CC0x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x8y113efgEv();
extern void _ZN3ccc8CC0x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y113efgEv,_ZThn4_N3ccc8CC0x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x8y113efgEv,_ZThn4_N3ccc8CC0x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y11E[];
Class_Descriptor cd__ZN3ccc8CC0x8y11E = {  "_ZN3ccc8CC0x8y11E", // class name
  bases__ZN3ccc8CC0x8y11E, 2,
  &(vtc__ZN3ccc8CC0x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y12  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC0x8y123abcEv
  ~CC0x8y12(); // tgen
  CC0x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x8y123abcEv");}
ccc::CC0x8y12 ::~CC0x8y12(){ note_dtor("_ZN3ccc8CC0x8y12E", this);} // tgen
ccc::CC0x8y12 ::CC0x8y12(){ note_ctor("_ZN3ccc8CC0x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y12E, buf);
    ::ccc::CC0x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y12E);
    dp->::ccc::CC0x8y12::~CC0x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y12E(Test__ZN3ccc8CC0x8y12E, "_ZN3ccc8CC0x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y12C1Ev();
extern void _ZN3ccc8CC0x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y12E[] = {
  NSPAIR(_ZN3ccc8CC0x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y12E[];
extern void _ZN3ccc8CC0x8y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y123abcEv,_ZThn4_N3ccc8CC0x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x8y123abcEv,_ZThn4_N3ccc8CC0x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y12E[];
Class_Descriptor cd__ZN3ccc8CC0x8y12E = {  "_ZN3ccc8CC0x8y12E", // class name
  bases__ZN3ccc8CC0x8y12E, 2,
  &(vtc__ZN3ccc8CC0x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y13  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC0x8y133efgEv
  ~CC0x8y13(); // tgen
  CC0x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y13E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x8y133efgEv");}
ccc::CC0x8y13 ::~CC0x8y13(){ note_dtor("_ZN3ccc8CC0x8y13E", this);} // tgen
ccc::CC0x8y13 ::CC0x8y13(){ note_ctor("_ZN3ccc8CC0x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y13E, buf);
    ::ccc::CC0x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y13E);
    dp->::ccc::CC0x8y13::~CC0x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y13E(Test__ZN3ccc8CC0x8y13E, "_ZN3ccc8CC0x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y13C1Ev();
extern void _ZN3ccc8CC0x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y13E[] = {
  NSPAIR(_ZN3ccc8CC0x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x8y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x8y133efgEv,_ZThn4_N3ccc8CC0x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x8y133efgEv,_ZThn4_N3ccc8CC0x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y13E[];
Class_Descriptor cd__ZN3ccc8CC0x8y13E = {  "_ZN3ccc8CC0x8y13E", // class name
  bases__ZN3ccc8CC0x8y13E, 2,
  &(vtc__ZN3ccc8CC0x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y14  : ::ccc::AA0 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC0x8y143pqrEv
  ~CC0x8y14(); // tgen
  CC0x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x8y143pqrEv");}
ccc::CC0x8y14 ::~CC0x8y14(){ note_dtor("_ZN3ccc8CC0x8y14E", this);} // tgen
ccc::CC0x8y14 ::CC0x8y14(){ note_ctor("_ZN3ccc8CC0x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y14E, buf);
    ::ccc::CC0x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y14E);
    dp->::ccc::CC0x8y14::~CC0x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y14E(Test__ZN3ccc8CC0x8y14E, "_ZN3ccc8CC0x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y14C1Ev();
extern void _ZN3ccc8CC0x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y14E[] = {
  NSPAIR(_ZN3ccc8CC0x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y14E[];
Class_Descriptor cd__ZN3ccc8CC0x8y14E = {  "_ZN3ccc8CC0x8y14E", // class name
  bases__ZN3ccc8CC0x8y14E, 2,
  &(vtc__ZN3ccc8CC0x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x8y15  : ::ccc::AA0 , ::ccc::BB8 {
  ~CC0x8y15(); // tgen
  CC0x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x8y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x8y15 ::~CC0x8y15(){ note_dtor("_ZN3ccc8CC0x8y15E", this);} // tgen
ccc::CC0x8y15 ::CC0x8y15(){ note_ctor("_ZN3ccc8CC0x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x8y15E, buf);
    ::ccc::CC0x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x8y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC0x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x8y15E);
    dp->::ccc::CC0x8y15::~CC0x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x8y15E(Test__ZN3ccc8CC0x8y15E, "_ZN3ccc8CC0x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x8y15C1Ev();
extern void _ZN3ccc8CC0x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x8y15E[] = {
  NSPAIR(_ZN3ccc8CC0x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC0x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x8y15E[];
Class_Descriptor cd__ZN3ccc8CC0x8y15E = {  "_ZN3ccc8CC0x8y15E", // class name
  bases__ZN3ccc8CC0x8y15E, 2,
  &(vtc__ZN3ccc8CC0x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y0  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y03pqrEv
  ~CC0x9y0(); // tgen
  CC0x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y0E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y03abcEv");}
void  ccc::CC0x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y03efgEv");}
void  ccc::CC0x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y03pqrEv");}
ccc::CC0x9y0 ::~CC0x9y0(){ note_dtor("_ZN3ccc7CC0x9y0E", this);} // tgen
ccc::CC0x9y0 ::CC0x9y0(){ note_ctor("_ZN3ccc7CC0x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y0E, buf);
    ::ccc::CC0x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y0E);
    dp->::ccc::CC0x9y0::~CC0x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y0E(Test__ZN3ccc7CC0x9y0E, "_ZN3ccc7CC0x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y0C1Ev();
extern void _ZN3ccc7CC0x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y0E[] = {
  NSPAIR(_ZN3ccc7CC0x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y0E[];
extern void _ZN3ccc7CC0x9y03abcEv();
extern void _ZN3ccc7CC0x9y03efgEv();
extern void _ZN3ccc7CC0x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y03efgEv,_ZThn4_N3ccc7CC0x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y03pqrEv,_ZThn4_N3ccc7CC0x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y03efgEv,_ZThn4_N3ccc7CC0x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y03pqrEv,_ZThn4_N3ccc7CC0x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y0E[];
Class_Descriptor cd__ZN3ccc7CC0x9y0E = {  "_ZN3ccc7CC0x9y0E", // class name
  bases__ZN3ccc7CC0x9y0E, 2,
  &(vtc__ZN3ccc7CC0x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y1  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x9y13efgEv
  ~CC0x9y1(); // tgen
  CC0x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y1E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y13abcEv");}
void  ccc::CC0x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y13pqrEv");}
void  ccc::CC0x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y13efgEv");}
ccc::CC0x9y1 ::~CC0x9y1(){ note_dtor("_ZN3ccc7CC0x9y1E", this);} // tgen
ccc::CC0x9y1 ::CC0x9y1(){ note_ctor("_ZN3ccc7CC0x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y1E, buf);
    ::ccc::CC0x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y1E);
    dp->::ccc::CC0x9y1::~CC0x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y1E(Test__ZN3ccc7CC0x9y1E, "_ZN3ccc7CC0x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y1C1Ev();
extern void _ZN3ccc7CC0x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y1E[] = {
  NSPAIR(_ZN3ccc7CC0x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y1E[];
extern void _ZN3ccc7CC0x9y13abcEv();
extern void _ZN3ccc7CC0x9y13efgEv();
extern void _ZN3ccc7CC0x9y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y13efgEv,_ZThn4_N3ccc7CC0x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y13pqrEv,_ZThn4_N3ccc7CC0x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y13efgEv,_ZThn4_N3ccc7CC0x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y13pqrEv,_ZThn4_N3ccc7CC0x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y1E[];
Class_Descriptor cd__ZN3ccc7CC0x9y1E = {  "_ZN3ccc7CC0x9y1E", // class name
  bases__ZN3ccc7CC0x9y1E, 2,
  &(vtc__ZN3ccc7CC0x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y2  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y23pqrEv
  ~CC0x9y2(); // tgen
  CC0x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y2E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y23efgEv");}
void  ccc::CC0x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y23abcEv");}
void  ccc::CC0x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y23pqrEv");}
ccc::CC0x9y2 ::~CC0x9y2(){ note_dtor("_ZN3ccc7CC0x9y2E", this);} // tgen
ccc::CC0x9y2 ::CC0x9y2(){ note_ctor("_ZN3ccc7CC0x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y2E, buf);
    ::ccc::CC0x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y2E);
    dp->::ccc::CC0x9y2::~CC0x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y2E(Test__ZN3ccc7CC0x9y2E, "_ZN3ccc7CC0x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y2C1Ev();
extern void _ZN3ccc7CC0x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y2E[] = {
  NSPAIR(_ZN3ccc7CC0x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y2E[];
extern void _ZN3ccc7CC0x9y23abcEv();
extern void _ZN3ccc7CC0x9y23efgEv();
extern void _ZN3ccc7CC0x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y23efgEv,_ZThn4_N3ccc7CC0x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y23pqrEv,_ZThn4_N3ccc7CC0x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y23efgEv,_ZThn4_N3ccc7CC0x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y23pqrEv,_ZThn4_N3ccc7CC0x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y2E[];
Class_Descriptor cd__ZN3ccc7CC0x9y2E = {  "_ZN3ccc7CC0x9y2E", // class name
  bases__ZN3ccc7CC0x9y2E, 2,
  &(vtc__ZN3ccc7CC0x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y3  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x9y33abcEv
  ~CC0x9y3(); // tgen
  CC0x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y3E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y33efgEv");}
void  ccc::CC0x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y33pqrEv");}
void  ccc::CC0x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y33abcEv");}
ccc::CC0x9y3 ::~CC0x9y3(){ note_dtor("_ZN3ccc7CC0x9y3E", this);} // tgen
ccc::CC0x9y3 ::CC0x9y3(){ note_ctor("_ZN3ccc7CC0x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y3E, buf);
    ::ccc::CC0x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y3E);
    dp->::ccc::CC0x9y3::~CC0x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y3E(Test__ZN3ccc7CC0x9y3E, "_ZN3ccc7CC0x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y3C1Ev();
extern void _ZN3ccc7CC0x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y3E[] = {
  NSPAIR(_ZN3ccc7CC0x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y3E[];
extern void _ZN3ccc7CC0x9y33abcEv();
extern void _ZN3ccc7CC0x9y33efgEv();
extern void _ZN3ccc7CC0x9y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y33efgEv,_ZThn4_N3ccc7CC0x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y33pqrEv,_ZThn4_N3ccc7CC0x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y33efgEv,_ZThn4_N3ccc7CC0x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y33pqrEv,_ZThn4_N3ccc7CC0x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y3E[];
Class_Descriptor cd__ZN3ccc7CC0x9y3E = {  "_ZN3ccc7CC0x9y3E", // class name
  bases__ZN3ccc7CC0x9y3E, 2,
  &(vtc__ZN3ccc7CC0x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y4  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC0x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC0x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y43efgEv
  ~CC0x9y4(); // tgen
  CC0x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y4E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y43pqrEv");}
void  ccc::CC0x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y43abcEv");}
void  ccc::CC0x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y43efgEv");}
ccc::CC0x9y4 ::~CC0x9y4(){ note_dtor("_ZN3ccc7CC0x9y4E", this);} // tgen
ccc::CC0x9y4 ::CC0x9y4(){ note_ctor("_ZN3ccc7CC0x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y4E, buf);
    ::ccc::CC0x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y4E);
    dp->::ccc::CC0x9y4::~CC0x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y4E(Test__ZN3ccc7CC0x9y4E, "_ZN3ccc7CC0x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y4C1Ev();
extern void _ZN3ccc7CC0x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y4E[] = {
  NSPAIR(_ZN3ccc7CC0x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y4E[];
extern void _ZN3ccc7CC0x9y43abcEv();
extern void _ZN3ccc7CC0x9y43efgEv();
extern void _ZN3ccc7CC0x9y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y43efgEv,_ZThn4_N3ccc7CC0x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y43pqrEv,_ZThn4_N3ccc7CC0x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y43efgEv,_ZThn4_N3ccc7CC0x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y43pqrEv,_ZThn4_N3ccc7CC0x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y4E[];
Class_Descriptor cd__ZN3ccc7CC0x9y4E = {  "_ZN3ccc7CC0x9y4E", // class name
  bases__ZN3ccc7CC0x9y4E, 2,
  &(vtc__ZN3ccc7CC0x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y5  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC0x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC0x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y53abcEv
  ~CC0x9y5(); // tgen
  CC0x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y5E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y53pqrEv");}
void  ccc::CC0x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y53efgEv");}
void  ccc::CC0x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y53abcEv");}
ccc::CC0x9y5 ::~CC0x9y5(){ note_dtor("_ZN3ccc7CC0x9y5E", this);} // tgen
ccc::CC0x9y5 ::CC0x9y5(){ note_ctor("_ZN3ccc7CC0x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y5E, buf);
    ::ccc::CC0x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y5E);
    dp->::ccc::CC0x9y5::~CC0x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y5E(Test__ZN3ccc7CC0x9y5E, "_ZN3ccc7CC0x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y5C1Ev();
extern void _ZN3ccc7CC0x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y5E[] = {
  NSPAIR(_ZN3ccc7CC0x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y5E[];
extern void _ZN3ccc7CC0x9y53abcEv();
extern void _ZN3ccc7CC0x9y53efgEv();
extern void _ZN3ccc7CC0x9y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y53efgEv,_ZThn4_N3ccc7CC0x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y53pqrEv,_ZThn4_N3ccc7CC0x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y53efgEv,_ZThn4_N3ccc7CC0x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y53pqrEv,_ZThn4_N3ccc7CC0x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y5E[];
Class_Descriptor cd__ZN3ccc7CC0x9y5E = {  "_ZN3ccc7CC0x9y5E", // class name
  bases__ZN3ccc7CC0x9y5E, 2,
  &(vtc__ZN3ccc7CC0x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y6  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC0x9y63efgEv
  ~CC0x9y6(); // tgen
  CC0x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y6E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y63abcEv");}
void  ccc::CC0x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y63efgEv");}
ccc::CC0x9y6 ::~CC0x9y6(){ note_dtor("_ZN3ccc7CC0x9y6E", this);} // tgen
ccc::CC0x9y6 ::CC0x9y6(){ note_ctor("_ZN3ccc7CC0x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y6E, buf);
    ::ccc::CC0x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y6E);
    dp->::ccc::CC0x9y6::~CC0x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y6E(Test__ZN3ccc7CC0x9y6E, "_ZN3ccc7CC0x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y6C1Ev();
extern void _ZN3ccc7CC0x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y6E[] = {
  NSPAIR(_ZN3ccc7CC0x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y6E[];
extern void _ZN3ccc7CC0x9y63abcEv();
extern void _ZN3ccc7CC0x9y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y63efgEv,_ZThn4_N3ccc7CC0x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y63efgEv,_ZThn4_N3ccc7CC0x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y6E[];
Class_Descriptor cd__ZN3ccc7CC0x9y6E = {  "_ZN3ccc7CC0x9y6E", // class name
  bases__ZN3ccc7CC0x9y6E, 2,
  &(vtc__ZN3ccc7CC0x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y7  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC0x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y73pqrEv
  ~CC0x9y7(); // tgen
  CC0x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y7E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y73abcEv");}
void  ccc::CC0x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y73pqrEv");}
ccc::CC0x9y7 ::~CC0x9y7(){ note_dtor("_ZN3ccc7CC0x9y7E", this);} // tgen
ccc::CC0x9y7 ::CC0x9y7(){ note_ctor("_ZN3ccc7CC0x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y7E, buf);
    ::ccc::CC0x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y7E);
    dp->::ccc::CC0x9y7::~CC0x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y7E(Test__ZN3ccc7CC0x9y7E, "_ZN3ccc7CC0x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y7C1Ev();
extern void _ZN3ccc7CC0x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y7E[] = {
  NSPAIR(_ZN3ccc7CC0x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y7E[];
extern void _ZN3ccc7CC0x9y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc7CC0x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y73pqrEv,_ZThn4_N3ccc7CC0x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y73pqrEv,_ZThn4_N3ccc7CC0x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y7E[];
Class_Descriptor cd__ZN3ccc7CC0x9y7E = {  "_ZN3ccc7CC0x9y7E", // class name
  bases__ZN3ccc7CC0x9y7E, 2,
  &(vtc__ZN3ccc7CC0x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y8  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC0x9y83abcEv
  ~CC0x9y8(); // tgen
  CC0x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y8E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y83efgEv");}
void  ccc::CC0x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC0x9y83abcEv");}
ccc::CC0x9y8 ::~CC0x9y8(){ note_dtor("_ZN3ccc7CC0x9y8E", this);} // tgen
ccc::CC0x9y8 ::CC0x9y8(){ note_ctor("_ZN3ccc7CC0x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y8E, buf);
    ::ccc::CC0x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y8E);
    dp->::ccc::CC0x9y8::~CC0x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y8E(Test__ZN3ccc7CC0x9y8E, "_ZN3ccc7CC0x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y8C1Ev();
extern void _ZN3ccc7CC0x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y8E[] = {
  NSPAIR(_ZN3ccc7CC0x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y8E[];
extern void _ZN3ccc7CC0x9y83abcEv();
extern void _ZN3ccc7CC0x9y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y83efgEv,_ZThn4_N3ccc7CC0x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y83efgEv,_ZThn4_N3ccc7CC0x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y8E[];
Class_Descriptor cd__ZN3ccc7CC0x9y8E = {  "_ZN3ccc7CC0x9y8E", // class name
  bases__ZN3ccc7CC0x9y8E, 2,
  &(vtc__ZN3ccc7CC0x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y9  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC0x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC0x9y93pqrEv
  ~CC0x9y9(); // tgen
  CC0x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC0x9y9E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC0x9y93efgEv");}
void  ccc::CC0x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC0x9y93pqrEv");}
ccc::CC0x9y9 ::~CC0x9y9(){ note_dtor("_ZN3ccc7CC0x9y9E", this);} // tgen
ccc::CC0x9y9 ::CC0x9y9(){ note_ctor("_ZN3ccc7CC0x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC0x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC0x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC0x9y9E, buf);
    ::ccc::CC0x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC0x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC0x9y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc7CC0x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC0x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC0x9y9E);
    dp->::ccc::CC0x9y9::~CC0x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC0x9y9E(Test__ZN3ccc7CC0x9y9E, "_ZN3ccc7CC0x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC0x9y9C1Ev();
extern void _ZN3ccc7CC0x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC0x9y9E[] = {
  NSPAIR(_ZN3ccc7CC0x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC0x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC0x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc7CC0x9y93efgEv();
extern void _ZN3ccc7CC0x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y93efgEv,_ZThn4_N3ccc7CC0x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC0x9y93pqrEv,_ZThn4_N3ccc7CC0x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC0x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC0x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC0x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y93efgEv,_ZThn4_N3ccc7CC0x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC0x9y93pqrEv,_ZThn4_N3ccc7CC0x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC0x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC0x9y9E[];
Class_Descriptor cd__ZN3ccc7CC0x9y9E = {  "_ZN3ccc7CC0x9y9E", // class name
  bases__ZN3ccc7CC0x9y9E, 2,
  &(vtc__ZN3ccc7CC0x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC0x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC0x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y10  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x9y103abcEv
  ~CC0x9y10(); // tgen
  CC0x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y10E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y103pqrEv");}
void  ccc::CC0x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x9y103abcEv");}
ccc::CC0x9y10 ::~CC0x9y10(){ note_dtor("_ZN3ccc8CC0x9y10E", this);} // tgen
ccc::CC0x9y10 ::CC0x9y10(){ note_ctor("_ZN3ccc8CC0x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y10E, buf);
    ::ccc::CC0x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y10E);
    dp->::ccc::CC0x9y10::~CC0x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y10E(Test__ZN3ccc8CC0x9y10E, "_ZN3ccc8CC0x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y10C1Ev();
extern void _ZN3ccc8CC0x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y10E[] = {
  NSPAIR(_ZN3ccc8CC0x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y10E[];
extern void _ZN3ccc8CC0x9y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y103pqrEv,_ZThn4_N3ccc8CC0x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x9y103pqrEv,_ZThn4_N3ccc8CC0x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y10E[];
Class_Descriptor cd__ZN3ccc8CC0x9y10E = {  "_ZN3ccc8CC0x9y10E", // class name
  bases__ZN3ccc8CC0x9y10E, 2,
  &(vtc__ZN3ccc8CC0x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y11  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x9y113efgEv
  ~CC0x9y11(); // tgen
  CC0x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y11E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y113pqrEv");}
void  ccc::CC0x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x9y113efgEv");}
ccc::CC0x9y11 ::~CC0x9y11(){ note_dtor("_ZN3ccc8CC0x9y11E", this);} // tgen
ccc::CC0x9y11 ::CC0x9y11(){ note_ctor("_ZN3ccc8CC0x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y11E, buf);
    ::ccc::CC0x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y11E);
    dp->::ccc::CC0x9y11::~CC0x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y11E(Test__ZN3ccc8CC0x9y11E, "_ZN3ccc8CC0x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y11C1Ev();
extern void _ZN3ccc8CC0x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y11E[] = {
  NSPAIR(_ZN3ccc8CC0x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x9y113efgEv();
extern void _ZN3ccc8CC0x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y113efgEv,_ZThn4_N3ccc8CC0x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y113pqrEv,_ZThn4_N3ccc8CC0x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x9y113efgEv,_ZThn4_N3ccc8CC0x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x9y113pqrEv,_ZThn4_N3ccc8CC0x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y11E[];
Class_Descriptor cd__ZN3ccc8CC0x9y11E = {  "_ZN3ccc8CC0x9y11E", // class name
  bases__ZN3ccc8CC0x9y11E, 2,
  &(vtc__ZN3ccc8CC0x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y12  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC0x9y123abcEv
  ~CC0x9y12(); // tgen
  CC0x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x9y123abcEv");}
ccc::CC0x9y12 ::~CC0x9y12(){ note_dtor("_ZN3ccc8CC0x9y12E", this);} // tgen
ccc::CC0x9y12 ::CC0x9y12(){ note_ctor("_ZN3ccc8CC0x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y12E, buf);
    ::ccc::CC0x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y12E);
    dp->::ccc::CC0x9y12::~CC0x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y12E(Test__ZN3ccc8CC0x9y12E, "_ZN3ccc8CC0x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y12C1Ev();
extern void _ZN3ccc8CC0x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y12E[] = {
  NSPAIR(_ZN3ccc8CC0x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y12E[];
extern void _ZN3ccc8CC0x9y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y12E[];
Class_Descriptor cd__ZN3ccc8CC0x9y12E = {  "_ZN3ccc8CC0x9y12E", // class name
  bases__ZN3ccc8CC0x9y12E, 2,
  &(vtc__ZN3ccc8CC0x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y13  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC0x9y133efgEv
  ~CC0x9y13(); // tgen
  CC0x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y13E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x9y133efgEv");}
ccc::CC0x9y13 ::~CC0x9y13(){ note_dtor("_ZN3ccc8CC0x9y13E", this);} // tgen
ccc::CC0x9y13 ::CC0x9y13(){ note_ctor("_ZN3ccc8CC0x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y13E, buf);
    ::ccc::CC0x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y13E);
    dp->::ccc::CC0x9y13::~CC0x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y13E(Test__ZN3ccc8CC0x9y13E, "_ZN3ccc8CC0x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y13C1Ev();
extern void _ZN3ccc8CC0x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y13E[] = {
  NSPAIR(_ZN3ccc8CC0x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x9y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y133efgEv,_ZThn4_N3ccc8CC0x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x9y133efgEv,_ZThn4_N3ccc8CC0x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y13E[];
Class_Descriptor cd__ZN3ccc8CC0x9y13E = {  "_ZN3ccc8CC0x9y13E", // class name
  bases__ZN3ccc8CC0x9y13E, 2,
  &(vtc__ZN3ccc8CC0x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y14  : ::ccc::AA0 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC0x9y143pqrEv
  ~CC0x9y14(); // tgen
  CC0x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x9y143pqrEv");}
ccc::CC0x9y14 ::~CC0x9y14(){ note_dtor("_ZN3ccc8CC0x9y14E", this);} // tgen
ccc::CC0x9y14 ::CC0x9y14(){ note_ctor("_ZN3ccc8CC0x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y14E, buf);
    ::ccc::CC0x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y14E);
    dp->::ccc::CC0x9y14::~CC0x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y14E(Test__ZN3ccc8CC0x9y14E, "_ZN3ccc8CC0x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y14C1Ev();
extern void _ZN3ccc8CC0x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y14E[] = {
  NSPAIR(_ZN3ccc8CC0x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x9y143pqrEv,_ZThn4_N3ccc8CC0x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x9y143pqrEv,_ZThn4_N3ccc8CC0x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y14E[];
Class_Descriptor cd__ZN3ccc8CC0x9y14E = {  "_ZN3ccc8CC0x9y14E", // class name
  bases__ZN3ccc8CC0x9y14E, 2,
  &(vtc__ZN3ccc8CC0x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x9y15  : ::ccc::AA0 , ::ccc::BB9 {
  ~CC0x9y15(); // tgen
  CC0x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC0x9y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x9y15 ::~CC0x9y15(){ note_dtor("_ZN3ccc8CC0x9y15E", this);} // tgen
ccc::CC0x9y15 ::CC0x9y15(){ note_ctor("_ZN3ccc8CC0x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC0x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x9y15E, buf);
    ::ccc::CC0x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x9y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC0x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x9y15E);
    dp->::ccc::CC0x9y15::~CC0x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x9y15E(Test__ZN3ccc8CC0x9y15E, "_ZN3ccc8CC0x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x9y15C1Ev();
extern void _ZN3ccc8CC0x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC0x9y15E[] = {
  NSPAIR(_ZN3ccc8CC0x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC0x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC0x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x9y15E[];
Class_Descriptor cd__ZN3ccc8CC0x9y15E = {  "_ZN3ccc8CC0x9y15E", // class name
  bases__ZN3ccc8CC0x9y15E, 2,
  &(vtc__ZN3ccc8CC0x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y0  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y03pqrEv
  ~CC0x10y0(); // tgen
  CC0x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y0E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y03abcEv");}
void  ccc::CC0x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y03efgEv");}
void  ccc::CC0x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y03pqrEv");}
ccc::CC0x10y0 ::~CC0x10y0(){ note_dtor("_ZN3ccc8CC0x10y0E", this);} // tgen
ccc::CC0x10y0 ::CC0x10y0(){ note_ctor("_ZN3ccc8CC0x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y0E, buf);
    ::ccc::CC0x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y0E);
    dp->::ccc::CC0x10y0::~CC0x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y0E(Test__ZN3ccc8CC0x10y0E, "_ZN3ccc8CC0x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y0C1Ev();
extern void _ZN3ccc8CC0x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y0E[] = {
  NSPAIR(_ZN3ccc8CC0x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y0E[];
extern void _ZN3ccc8CC0x10y03abcEv();
extern void _ZN3ccc8CC0x10y03efgEv();
extern void _ZN3ccc8CC0x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y03pqrEv,_ZThn4_N3ccc8CC0x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y03abcEv,_ZThn4_N3ccc8CC0x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y03pqrEv,_ZThn4_N3ccc8CC0x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y03abcEv,_ZThn4_N3ccc8CC0x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y0E[];
Class_Descriptor cd__ZN3ccc8CC0x10y0E = {  "_ZN3ccc8CC0x10y0E", // class name
  bases__ZN3ccc8CC0x10y0E, 2,
  &(vtc__ZN3ccc8CC0x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y1  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x10y13efgEv
  ~CC0x10y1(); // tgen
  CC0x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y1E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y13abcEv");}
void  ccc::CC0x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y13pqrEv");}
void  ccc::CC0x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y13efgEv");}
ccc::CC0x10y1 ::~CC0x10y1(){ note_dtor("_ZN3ccc8CC0x10y1E", this);} // tgen
ccc::CC0x10y1 ::CC0x10y1(){ note_ctor("_ZN3ccc8CC0x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y1E, buf);
    ::ccc::CC0x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y1E);
    dp->::ccc::CC0x10y1::~CC0x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y1E(Test__ZN3ccc8CC0x10y1E, "_ZN3ccc8CC0x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y1C1Ev();
extern void _ZN3ccc8CC0x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y1E[] = {
  NSPAIR(_ZN3ccc8CC0x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y1E[];
extern void _ZN3ccc8CC0x10y13abcEv();
extern void _ZN3ccc8CC0x10y13efgEv();
extern void _ZN3ccc8CC0x10y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y13pqrEv,_ZThn4_N3ccc8CC0x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y13abcEv,_ZThn4_N3ccc8CC0x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y13pqrEv,_ZThn4_N3ccc8CC0x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y13abcEv,_ZThn4_N3ccc8CC0x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y1E[];
Class_Descriptor cd__ZN3ccc8CC0x10y1E = {  "_ZN3ccc8CC0x10y1E", // class name
  bases__ZN3ccc8CC0x10y1E, 2,
  &(vtc__ZN3ccc8CC0x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y2  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y23pqrEv
  ~CC0x10y2(); // tgen
  CC0x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y2E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y23efgEv");}
void  ccc::CC0x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y23abcEv");}
void  ccc::CC0x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y23pqrEv");}
ccc::CC0x10y2 ::~CC0x10y2(){ note_dtor("_ZN3ccc8CC0x10y2E", this);} // tgen
ccc::CC0x10y2 ::CC0x10y2(){ note_ctor("_ZN3ccc8CC0x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y2E, buf);
    ::ccc::CC0x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y2E);
    dp->::ccc::CC0x10y2::~CC0x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y2E(Test__ZN3ccc8CC0x10y2E, "_ZN3ccc8CC0x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y2C1Ev();
extern void _ZN3ccc8CC0x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y2E[] = {
  NSPAIR(_ZN3ccc8CC0x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y2E[];
extern void _ZN3ccc8CC0x10y23abcEv();
extern void _ZN3ccc8CC0x10y23efgEv();
extern void _ZN3ccc8CC0x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y23pqrEv,_ZThn4_N3ccc8CC0x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y23abcEv,_ZThn4_N3ccc8CC0x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y23pqrEv,_ZThn4_N3ccc8CC0x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y23abcEv,_ZThn4_N3ccc8CC0x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y2E[];
Class_Descriptor cd__ZN3ccc8CC0x10y2E = {  "_ZN3ccc8CC0x10y2E", // class name
  bases__ZN3ccc8CC0x10y2E, 2,
  &(vtc__ZN3ccc8CC0x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y3  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x10y33abcEv
  ~CC0x10y3(); // tgen
  CC0x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y3E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y33efgEv");}
void  ccc::CC0x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y33pqrEv");}
void  ccc::CC0x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y33abcEv");}
ccc::CC0x10y3 ::~CC0x10y3(){ note_dtor("_ZN3ccc8CC0x10y3E", this);} // tgen
ccc::CC0x10y3 ::CC0x10y3(){ note_ctor("_ZN3ccc8CC0x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y3E, buf);
    ::ccc::CC0x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y3E);
    dp->::ccc::CC0x10y3::~CC0x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y3E(Test__ZN3ccc8CC0x10y3E, "_ZN3ccc8CC0x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y3C1Ev();
extern void _ZN3ccc8CC0x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y3E[] = {
  NSPAIR(_ZN3ccc8CC0x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y3E[];
extern void _ZN3ccc8CC0x10y33abcEv();
extern void _ZN3ccc8CC0x10y33efgEv();
extern void _ZN3ccc8CC0x10y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y33pqrEv,_ZThn4_N3ccc8CC0x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y33abcEv,_ZThn4_N3ccc8CC0x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y33pqrEv,_ZThn4_N3ccc8CC0x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y33abcEv,_ZThn4_N3ccc8CC0x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y3E[];
Class_Descriptor cd__ZN3ccc8CC0x10y3E = {  "_ZN3ccc8CC0x10y3E", // class name
  bases__ZN3ccc8CC0x10y3E, 2,
  &(vtc__ZN3ccc8CC0x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y4  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC0x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y43efgEv
  ~CC0x10y4(); // tgen
  CC0x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y4E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y43pqrEv");}
void  ccc::CC0x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y43abcEv");}
void  ccc::CC0x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y43efgEv");}
ccc::CC0x10y4 ::~CC0x10y4(){ note_dtor("_ZN3ccc8CC0x10y4E", this);} // tgen
ccc::CC0x10y4 ::CC0x10y4(){ note_ctor("_ZN3ccc8CC0x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y4E, buf);
    ::ccc::CC0x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y4E);
    dp->::ccc::CC0x10y4::~CC0x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y4E(Test__ZN3ccc8CC0x10y4E, "_ZN3ccc8CC0x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y4C1Ev();
extern void _ZN3ccc8CC0x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y4E[] = {
  NSPAIR(_ZN3ccc8CC0x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y4E[];
extern void _ZN3ccc8CC0x10y43abcEv();
extern void _ZN3ccc8CC0x10y43efgEv();
extern void _ZN3ccc8CC0x10y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y43pqrEv,_ZThn4_N3ccc8CC0x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y43abcEv,_ZThn4_N3ccc8CC0x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y43pqrEv,_ZThn4_N3ccc8CC0x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y43abcEv,_ZThn4_N3ccc8CC0x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y4E[];
Class_Descriptor cd__ZN3ccc8CC0x10y4E = {  "_ZN3ccc8CC0x10y4E", // class name
  bases__ZN3ccc8CC0x10y4E, 2,
  &(vtc__ZN3ccc8CC0x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y5  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC0x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y53abcEv
  ~CC0x10y5(); // tgen
  CC0x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y5E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y53pqrEv");}
void  ccc::CC0x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y53efgEv");}
void  ccc::CC0x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y53abcEv");}
ccc::CC0x10y5 ::~CC0x10y5(){ note_dtor("_ZN3ccc8CC0x10y5E", this);} // tgen
ccc::CC0x10y5 ::CC0x10y5(){ note_ctor("_ZN3ccc8CC0x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y5E, buf);
    ::ccc::CC0x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y5E);
    dp->::ccc::CC0x10y5::~CC0x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y5E(Test__ZN3ccc8CC0x10y5E, "_ZN3ccc8CC0x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y5C1Ev();
extern void _ZN3ccc8CC0x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y5E[] = {
  NSPAIR(_ZN3ccc8CC0x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y5E[];
extern void _ZN3ccc8CC0x10y53abcEv();
extern void _ZN3ccc8CC0x10y53efgEv();
extern void _ZN3ccc8CC0x10y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y53pqrEv,_ZThn4_N3ccc8CC0x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y53abcEv,_ZThn4_N3ccc8CC0x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y53pqrEv,_ZThn4_N3ccc8CC0x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y53abcEv,_ZThn4_N3ccc8CC0x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y5E[];
Class_Descriptor cd__ZN3ccc8CC0x10y5E = {  "_ZN3ccc8CC0x10y5E", // class name
  bases__ZN3ccc8CC0x10y5E, 2,
  &(vtc__ZN3ccc8CC0x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y6  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x10y63efgEv
  ~CC0x10y6(); // tgen
  CC0x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y6E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y63abcEv");}
void  ccc::CC0x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y63efgEv");}
ccc::CC0x10y6 ::~CC0x10y6(){ note_dtor("_ZN3ccc8CC0x10y6E", this);} // tgen
ccc::CC0x10y6 ::CC0x10y6(){ note_ctor("_ZN3ccc8CC0x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y6E, buf);
    ::ccc::CC0x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y6E);
    dp->::ccc::CC0x10y6::~CC0x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y6E(Test__ZN3ccc8CC0x10y6E, "_ZN3ccc8CC0x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y6C1Ev();
extern void _ZN3ccc8CC0x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y6E[] = {
  NSPAIR(_ZN3ccc8CC0x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y6E[];
extern void _ZN3ccc8CC0x10y63abcEv();
extern void _ZN3ccc8CC0x10y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y63abcEv,_ZThn4_N3ccc8CC0x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y63abcEv,_ZThn4_N3ccc8CC0x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y6E[];
Class_Descriptor cd__ZN3ccc8CC0x10y6E = {  "_ZN3ccc8CC0x10y6E", // class name
  bases__ZN3ccc8CC0x10y6E, 2,
  &(vtc__ZN3ccc8CC0x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y7  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC0x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y73pqrEv
  ~CC0x10y7(); // tgen
  CC0x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y7E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y73abcEv");}
void  ccc::CC0x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y73pqrEv");}
ccc::CC0x10y7 ::~CC0x10y7(){ note_dtor("_ZN3ccc8CC0x10y7E", this);} // tgen
ccc::CC0x10y7 ::CC0x10y7(){ note_ctor("_ZN3ccc8CC0x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y7E, buf);
    ::ccc::CC0x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y7E);
    dp->::ccc::CC0x10y7::~CC0x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y7E(Test__ZN3ccc8CC0x10y7E, "_ZN3ccc8CC0x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y7C1Ev();
extern void _ZN3ccc8CC0x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y7E[] = {
  NSPAIR(_ZN3ccc8CC0x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y7E[];
extern void _ZN3ccc8CC0x10y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y73pqrEv,_ZThn4_N3ccc8CC0x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y73abcEv,_ZThn4_N3ccc8CC0x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y73pqrEv,_ZThn4_N3ccc8CC0x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y73abcEv,_ZThn4_N3ccc8CC0x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y7E[];
Class_Descriptor cd__ZN3ccc8CC0x10y7E = {  "_ZN3ccc8CC0x10y7E", // class name
  bases__ZN3ccc8CC0x10y7E, 2,
  &(vtc__ZN3ccc8CC0x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y8  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x10y83abcEv
  ~CC0x10y8(); // tgen
  CC0x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y8E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y83efgEv");}
void  ccc::CC0x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x10y83abcEv");}
ccc::CC0x10y8 ::~CC0x10y8(){ note_dtor("_ZN3ccc8CC0x10y8E", this);} // tgen
ccc::CC0x10y8 ::CC0x10y8(){ note_ctor("_ZN3ccc8CC0x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y8E, buf);
    ::ccc::CC0x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y8E);
    dp->::ccc::CC0x10y8::~CC0x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y8E(Test__ZN3ccc8CC0x10y8E, "_ZN3ccc8CC0x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y8C1Ev();
extern void _ZN3ccc8CC0x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y8E[] = {
  NSPAIR(_ZN3ccc8CC0x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y8E[];
extern void _ZN3ccc8CC0x10y83abcEv();
extern void _ZN3ccc8CC0x10y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y83abcEv,_ZThn4_N3ccc8CC0x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y83abcEv,_ZThn4_N3ccc8CC0x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y8E[];
Class_Descriptor cd__ZN3ccc8CC0x10y8E = {  "_ZN3ccc8CC0x10y8E", // class name
  bases__ZN3ccc8CC0x10y8E, 2,
  &(vtc__ZN3ccc8CC0x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y9  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC0x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x10y93pqrEv
  ~CC0x10y9(); // tgen
  CC0x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x10y9E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x10y93efgEv");}
void  ccc::CC0x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x10y93pqrEv");}
ccc::CC0x10y9 ::~CC0x10y9(){ note_dtor("_ZN3ccc8CC0x10y9E", this);} // tgen
ccc::CC0x10y9 ::CC0x10y9(){ note_ctor("_ZN3ccc8CC0x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x10y9E, buf);
    ::ccc::CC0x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x10y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC0x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x10y9E);
    dp->::ccc::CC0x10y9::~CC0x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x10y9E(Test__ZN3ccc8CC0x10y9E, "_ZN3ccc8CC0x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x10y9C1Ev();
extern void _ZN3ccc8CC0x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x10y9E[] = {
  NSPAIR(_ZN3ccc8CC0x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC0x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x10y93efgEv();
extern void _ZN3ccc8CC0x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x10y93pqrEv,_ZThn4_N3ccc8CC0x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x10y93pqrEv,_ZThn4_N3ccc8CC0x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x10y9E[];
Class_Descriptor cd__ZN3ccc8CC0x10y9E = {  "_ZN3ccc8CC0x10y9E", // class name
  bases__ZN3ccc8CC0x10y9E, 2,
  &(vtc__ZN3ccc8CC0x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y10  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x10y103abcEv
  ~CC0x10y10(); // tgen
  CC0x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y10E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y103pqrEv");}
void  ccc::CC0x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x10y103abcEv");}
ccc::CC0x10y10 ::~CC0x10y10(){ note_dtor("_ZN3ccc9CC0x10y10E", this);} // tgen
ccc::CC0x10y10 ::CC0x10y10(){ note_ctor("_ZN3ccc9CC0x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y10E, buf);
    ::ccc::CC0x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y10E);
    dp->::ccc::CC0x10y10::~CC0x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y10E(Test__ZN3ccc9CC0x10y10E, "_ZN3ccc9CC0x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y10C1Ev();
extern void _ZN3ccc9CC0x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y10E[] = {
  NSPAIR(_ZN3ccc9CC0x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y10E[];
extern void _ZN3ccc9CC0x10y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y103pqrEv,_ZThn4_N3ccc9CC0x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y103abcEv,_ZThn4_N3ccc9CC0x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x10y103pqrEv,_ZThn4_N3ccc9CC0x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x10y103abcEv,_ZThn4_N3ccc9CC0x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y10E[];
Class_Descriptor cd__ZN3ccc9CC0x10y10E = {  "_ZN3ccc9CC0x10y10E", // class name
  bases__ZN3ccc9CC0x10y10E, 2,
  &(vtc__ZN3ccc9CC0x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y11  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x10y113efgEv
  ~CC0x10y11(); // tgen
  CC0x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y11E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y113pqrEv");}
void  ccc::CC0x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x10y113efgEv");}
ccc::CC0x10y11 ::~CC0x10y11(){ note_dtor("_ZN3ccc9CC0x10y11E", this);} // tgen
ccc::CC0x10y11 ::CC0x10y11(){ note_ctor("_ZN3ccc9CC0x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y11E, buf);
    ::ccc::CC0x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y11E);
    dp->::ccc::CC0x10y11::~CC0x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y11E(Test__ZN3ccc9CC0x10y11E, "_ZN3ccc9CC0x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y11C1Ev();
extern void _ZN3ccc9CC0x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y11E[] = {
  NSPAIR(_ZN3ccc9CC0x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x10y113efgEv();
extern void _ZN3ccc9CC0x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y113pqrEv,_ZThn4_N3ccc9CC0x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x10y113pqrEv,_ZThn4_N3ccc9CC0x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y11E[];
Class_Descriptor cd__ZN3ccc9CC0x10y11E = {  "_ZN3ccc9CC0x10y11E", // class name
  bases__ZN3ccc9CC0x10y11E, 2,
  &(vtc__ZN3ccc9CC0x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y12  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC0x10y123abcEv
  ~CC0x10y12(); // tgen
  CC0x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x10y123abcEv");}
ccc::CC0x10y12 ::~CC0x10y12(){ note_dtor("_ZN3ccc9CC0x10y12E", this);} // tgen
ccc::CC0x10y12 ::CC0x10y12(){ note_ctor("_ZN3ccc9CC0x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y12E, buf);
    ::ccc::CC0x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y12E);
    dp->::ccc::CC0x10y12::~CC0x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y12E(Test__ZN3ccc9CC0x10y12E, "_ZN3ccc9CC0x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y12C1Ev();
extern void _ZN3ccc9CC0x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y12E[] = {
  NSPAIR(_ZN3ccc9CC0x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y12E[];
extern void _ZN3ccc9CC0x10y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y123abcEv,_ZThn4_N3ccc9CC0x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x10y123abcEv,_ZThn4_N3ccc9CC0x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y12E[];
Class_Descriptor cd__ZN3ccc9CC0x10y12E = {  "_ZN3ccc9CC0x10y12E", // class name
  bases__ZN3ccc9CC0x10y12E, 2,
  &(vtc__ZN3ccc9CC0x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y13  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC0x10y133efgEv
  ~CC0x10y13(); // tgen
  CC0x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x10y133efgEv");}
ccc::CC0x10y13 ::~CC0x10y13(){ note_dtor("_ZN3ccc9CC0x10y13E", this);} // tgen
ccc::CC0x10y13 ::CC0x10y13(){ note_ctor("_ZN3ccc9CC0x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y13E, buf);
    ::ccc::CC0x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y13E);
    dp->::ccc::CC0x10y13::~CC0x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y13E(Test__ZN3ccc9CC0x10y13E, "_ZN3ccc9CC0x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y13C1Ev();
extern void _ZN3ccc9CC0x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y13E[] = {
  NSPAIR(_ZN3ccc9CC0x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x10y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y13E[];
Class_Descriptor cd__ZN3ccc9CC0x10y13E = {  "_ZN3ccc9CC0x10y13E", // class name
  bases__ZN3ccc9CC0x10y13E, 2,
  &(vtc__ZN3ccc9CC0x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y14  : ::ccc::AA0 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC0x10y143pqrEv
  ~CC0x10y14(); // tgen
  CC0x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x10y143pqrEv");}
ccc::CC0x10y14 ::~CC0x10y14(){ note_dtor("_ZN3ccc9CC0x10y14E", this);} // tgen
ccc::CC0x10y14 ::CC0x10y14(){ note_ctor("_ZN3ccc9CC0x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y14E, buf);
    ::ccc::CC0x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y14E);
    dp->::ccc::CC0x10y14::~CC0x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y14E(Test__ZN3ccc9CC0x10y14E, "_ZN3ccc9CC0x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y14C1Ev();
extern void _ZN3ccc9CC0x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y14E[] = {
  NSPAIR(_ZN3ccc9CC0x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x10y143pqrEv,_ZThn4_N3ccc9CC0x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x10y143pqrEv,_ZThn4_N3ccc9CC0x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y14E[];
Class_Descriptor cd__ZN3ccc9CC0x10y14E = {  "_ZN3ccc9CC0x10y14E", // class name
  bases__ZN3ccc9CC0x10y14E, 2,
  &(vtc__ZN3ccc9CC0x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x10y15  : ::ccc::AA0 , ::ccc::BB10 {
  ~CC0x10y15(); // tgen
  CC0x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x10y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x10y15 ::~CC0x10y15(){ note_dtor("_ZN3ccc9CC0x10y15E", this);} // tgen
ccc::CC0x10y15 ::CC0x10y15(){ note_ctor("_ZN3ccc9CC0x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x10y15E, buf);
    ::ccc::CC0x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x10y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC0x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x10y15E);
    dp->::ccc::CC0x10y15::~CC0x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x10y15E(Test__ZN3ccc9CC0x10y15E, "_ZN3ccc9CC0x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x10y15C1Ev();
extern void _ZN3ccc9CC0x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x10y15E[] = {
  NSPAIR(_ZN3ccc9CC0x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC0x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x10y15E[];
Class_Descriptor cd__ZN3ccc9CC0x10y15E = {  "_ZN3ccc9CC0x10y15E", // class name
  bases__ZN3ccc9CC0x10y15E, 2,
  &(vtc__ZN3ccc9CC0x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y0  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y03pqrEv
  ~CC0x11y0(); // tgen
  CC0x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y0E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y03abcEv");}
void  ccc::CC0x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y03efgEv");}
void  ccc::CC0x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y03pqrEv");}
ccc::CC0x11y0 ::~CC0x11y0(){ note_dtor("_ZN3ccc8CC0x11y0E", this);} // tgen
ccc::CC0x11y0 ::CC0x11y0(){ note_ctor("_ZN3ccc8CC0x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y0E, buf);
    ::ccc::CC0x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y0E);
    dp->::ccc::CC0x11y0::~CC0x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y0E(Test__ZN3ccc8CC0x11y0E, "_ZN3ccc8CC0x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y0C1Ev();
extern void _ZN3ccc8CC0x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y0E[] = {
  NSPAIR(_ZN3ccc8CC0x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y0E[];
extern void _ZN3ccc8CC0x11y03abcEv();
extern void _ZN3ccc8CC0x11y03efgEv();
extern void _ZN3ccc8CC0x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y03pqrEv,_ZThn4_N3ccc8CC0x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y03efgEv,_ZThn4_N3ccc8CC0x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y03pqrEv,_ZThn4_N3ccc8CC0x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y03efgEv,_ZThn4_N3ccc8CC0x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y0E[];
Class_Descriptor cd__ZN3ccc8CC0x11y0E = {  "_ZN3ccc8CC0x11y0E", // class name
  bases__ZN3ccc8CC0x11y0E, 2,
  &(vtc__ZN3ccc8CC0x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y1  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x11y13efgEv
  ~CC0x11y1(); // tgen
  CC0x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y1E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y13abcEv");}
void  ccc::CC0x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y13pqrEv");}
void  ccc::CC0x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y13efgEv");}
ccc::CC0x11y1 ::~CC0x11y1(){ note_dtor("_ZN3ccc8CC0x11y1E", this);} // tgen
ccc::CC0x11y1 ::CC0x11y1(){ note_ctor("_ZN3ccc8CC0x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y1E, buf);
    ::ccc::CC0x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y1E);
    dp->::ccc::CC0x11y1::~CC0x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y1E(Test__ZN3ccc8CC0x11y1E, "_ZN3ccc8CC0x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y1C1Ev();
extern void _ZN3ccc8CC0x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y1E[] = {
  NSPAIR(_ZN3ccc8CC0x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y1E[];
extern void _ZN3ccc8CC0x11y13abcEv();
extern void _ZN3ccc8CC0x11y13efgEv();
extern void _ZN3ccc8CC0x11y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y13pqrEv,_ZThn4_N3ccc8CC0x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y13efgEv,_ZThn4_N3ccc8CC0x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y13pqrEv,_ZThn4_N3ccc8CC0x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y13efgEv,_ZThn4_N3ccc8CC0x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y1E[];
Class_Descriptor cd__ZN3ccc8CC0x11y1E = {  "_ZN3ccc8CC0x11y1E", // class name
  bases__ZN3ccc8CC0x11y1E, 2,
  &(vtc__ZN3ccc8CC0x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y2  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y23pqrEv
  ~CC0x11y2(); // tgen
  CC0x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y2E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y23efgEv");}
void  ccc::CC0x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y23abcEv");}
void  ccc::CC0x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y23pqrEv");}
ccc::CC0x11y2 ::~CC0x11y2(){ note_dtor("_ZN3ccc8CC0x11y2E", this);} // tgen
ccc::CC0x11y2 ::CC0x11y2(){ note_ctor("_ZN3ccc8CC0x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y2E, buf);
    ::ccc::CC0x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y2E);
    dp->::ccc::CC0x11y2::~CC0x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y2E(Test__ZN3ccc8CC0x11y2E, "_ZN3ccc8CC0x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y2C1Ev();
extern void _ZN3ccc8CC0x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y2E[] = {
  NSPAIR(_ZN3ccc8CC0x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y2E[];
extern void _ZN3ccc8CC0x11y23abcEv();
extern void _ZN3ccc8CC0x11y23efgEv();
extern void _ZN3ccc8CC0x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y23pqrEv,_ZThn4_N3ccc8CC0x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y23efgEv,_ZThn4_N3ccc8CC0x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y23pqrEv,_ZThn4_N3ccc8CC0x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y23efgEv,_ZThn4_N3ccc8CC0x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y2E[];
Class_Descriptor cd__ZN3ccc8CC0x11y2E = {  "_ZN3ccc8CC0x11y2E", // class name
  bases__ZN3ccc8CC0x11y2E, 2,
  &(vtc__ZN3ccc8CC0x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y3  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x11y33abcEv
  ~CC0x11y3(); // tgen
  CC0x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y3E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y33efgEv");}
void  ccc::CC0x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y33pqrEv");}
void  ccc::CC0x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y33abcEv");}
ccc::CC0x11y3 ::~CC0x11y3(){ note_dtor("_ZN3ccc8CC0x11y3E", this);} // tgen
ccc::CC0x11y3 ::CC0x11y3(){ note_ctor("_ZN3ccc8CC0x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y3E, buf);
    ::ccc::CC0x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y3E);
    dp->::ccc::CC0x11y3::~CC0x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y3E(Test__ZN3ccc8CC0x11y3E, "_ZN3ccc8CC0x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y3C1Ev();
extern void _ZN3ccc8CC0x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y3E[] = {
  NSPAIR(_ZN3ccc8CC0x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y3E[];
extern void _ZN3ccc8CC0x11y33abcEv();
extern void _ZN3ccc8CC0x11y33efgEv();
extern void _ZN3ccc8CC0x11y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y33pqrEv,_ZThn4_N3ccc8CC0x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y33efgEv,_ZThn4_N3ccc8CC0x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y33pqrEv,_ZThn4_N3ccc8CC0x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y33efgEv,_ZThn4_N3ccc8CC0x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y3E[];
Class_Descriptor cd__ZN3ccc8CC0x11y3E = {  "_ZN3ccc8CC0x11y3E", // class name
  bases__ZN3ccc8CC0x11y3E, 2,
  &(vtc__ZN3ccc8CC0x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y4  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC0x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y43efgEv
  ~CC0x11y4(); // tgen
  CC0x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y4E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y43pqrEv");}
void  ccc::CC0x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y43abcEv");}
void  ccc::CC0x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y43efgEv");}
ccc::CC0x11y4 ::~CC0x11y4(){ note_dtor("_ZN3ccc8CC0x11y4E", this);} // tgen
ccc::CC0x11y4 ::CC0x11y4(){ note_ctor("_ZN3ccc8CC0x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y4E, buf);
    ::ccc::CC0x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y4E);
    dp->::ccc::CC0x11y4::~CC0x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y4E(Test__ZN3ccc8CC0x11y4E, "_ZN3ccc8CC0x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y4C1Ev();
extern void _ZN3ccc8CC0x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y4E[] = {
  NSPAIR(_ZN3ccc8CC0x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y4E[];
extern void _ZN3ccc8CC0x11y43abcEv();
extern void _ZN3ccc8CC0x11y43efgEv();
extern void _ZN3ccc8CC0x11y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y43pqrEv,_ZThn4_N3ccc8CC0x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y43efgEv,_ZThn4_N3ccc8CC0x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y43pqrEv,_ZThn4_N3ccc8CC0x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y43efgEv,_ZThn4_N3ccc8CC0x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y4E[];
Class_Descriptor cd__ZN3ccc8CC0x11y4E = {  "_ZN3ccc8CC0x11y4E", // class name
  bases__ZN3ccc8CC0x11y4E, 2,
  &(vtc__ZN3ccc8CC0x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y5  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC0x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y53abcEv
  ~CC0x11y5(); // tgen
  CC0x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y5E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y53pqrEv");}
void  ccc::CC0x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y53efgEv");}
void  ccc::CC0x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y53abcEv");}
ccc::CC0x11y5 ::~CC0x11y5(){ note_dtor("_ZN3ccc8CC0x11y5E", this);} // tgen
ccc::CC0x11y5 ::CC0x11y5(){ note_ctor("_ZN3ccc8CC0x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y5E, buf);
    ::ccc::CC0x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y5E);
    dp->::ccc::CC0x11y5::~CC0x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y5E(Test__ZN3ccc8CC0x11y5E, "_ZN3ccc8CC0x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y5C1Ev();
extern void _ZN3ccc8CC0x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y5E[] = {
  NSPAIR(_ZN3ccc8CC0x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y5E[];
extern void _ZN3ccc8CC0x11y53abcEv();
extern void _ZN3ccc8CC0x11y53efgEv();
extern void _ZN3ccc8CC0x11y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y53pqrEv,_ZThn4_N3ccc8CC0x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y53efgEv,_ZThn4_N3ccc8CC0x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y53pqrEv,_ZThn4_N3ccc8CC0x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y53efgEv,_ZThn4_N3ccc8CC0x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y5E[];
Class_Descriptor cd__ZN3ccc8CC0x11y5E = {  "_ZN3ccc8CC0x11y5E", // class name
  bases__ZN3ccc8CC0x11y5E, 2,
  &(vtc__ZN3ccc8CC0x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y6  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x11y63efgEv
  ~CC0x11y6(); // tgen
  CC0x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y6E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y63abcEv");}
void  ccc::CC0x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y63efgEv");}
ccc::CC0x11y6 ::~CC0x11y6(){ note_dtor("_ZN3ccc8CC0x11y6E", this);} // tgen
ccc::CC0x11y6 ::CC0x11y6(){ note_ctor("_ZN3ccc8CC0x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y6E, buf);
    ::ccc::CC0x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y6E);
    dp->::ccc::CC0x11y6::~CC0x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y6E(Test__ZN3ccc8CC0x11y6E, "_ZN3ccc8CC0x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y6C1Ev();
extern void _ZN3ccc8CC0x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y6E[] = {
  NSPAIR(_ZN3ccc8CC0x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y6E[];
extern void _ZN3ccc8CC0x11y63abcEv();
extern void _ZN3ccc8CC0x11y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y63efgEv,_ZThn4_N3ccc8CC0x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y63efgEv,_ZThn4_N3ccc8CC0x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y6E[];
Class_Descriptor cd__ZN3ccc8CC0x11y6E = {  "_ZN3ccc8CC0x11y6E", // class name
  bases__ZN3ccc8CC0x11y6E, 2,
  &(vtc__ZN3ccc8CC0x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y7  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC0x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y73pqrEv
  ~CC0x11y7(); // tgen
  CC0x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y7E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y73abcEv");}
void  ccc::CC0x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y73pqrEv");}
ccc::CC0x11y7 ::~CC0x11y7(){ note_dtor("_ZN3ccc8CC0x11y7E", this);} // tgen
ccc::CC0x11y7 ::CC0x11y7(){ note_ctor("_ZN3ccc8CC0x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y7E, buf);
    ::ccc::CC0x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y7E);
    dp->::ccc::CC0x11y7::~CC0x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y7E(Test__ZN3ccc8CC0x11y7E, "_ZN3ccc8CC0x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y7C1Ev();
extern void _ZN3ccc8CC0x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y7E[] = {
  NSPAIR(_ZN3ccc8CC0x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y7E[];
extern void _ZN3ccc8CC0x11y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y73pqrEv,_ZThn4_N3ccc8CC0x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y73pqrEv,_ZThn4_N3ccc8CC0x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y7E[];
Class_Descriptor cd__ZN3ccc8CC0x11y7E = {  "_ZN3ccc8CC0x11y7E", // class name
  bases__ZN3ccc8CC0x11y7E, 2,
  &(vtc__ZN3ccc8CC0x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y8  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x11y83abcEv
  ~CC0x11y8(); // tgen
  CC0x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y8E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y83efgEv");}
void  ccc::CC0x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x11y83abcEv");}
ccc::CC0x11y8 ::~CC0x11y8(){ note_dtor("_ZN3ccc8CC0x11y8E", this);} // tgen
ccc::CC0x11y8 ::CC0x11y8(){ note_ctor("_ZN3ccc8CC0x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y8E, buf);
    ::ccc::CC0x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y8E);
    dp->::ccc::CC0x11y8::~CC0x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y8E(Test__ZN3ccc8CC0x11y8E, "_ZN3ccc8CC0x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y8C1Ev();
extern void _ZN3ccc8CC0x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y8E[] = {
  NSPAIR(_ZN3ccc8CC0x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y8E[];
extern void _ZN3ccc8CC0x11y83abcEv();
extern void _ZN3ccc8CC0x11y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y83efgEv,_ZThn4_N3ccc8CC0x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y83efgEv,_ZThn4_N3ccc8CC0x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y8E[];
Class_Descriptor cd__ZN3ccc8CC0x11y8E = {  "_ZN3ccc8CC0x11y8E", // class name
  bases__ZN3ccc8CC0x11y8E, 2,
  &(vtc__ZN3ccc8CC0x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y9  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC0x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x11y93pqrEv
  ~CC0x11y9(); // tgen
  CC0x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x11y9E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x11y93efgEv");}
void  ccc::CC0x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x11y93pqrEv");}
ccc::CC0x11y9 ::~CC0x11y9(){ note_dtor("_ZN3ccc8CC0x11y9E", this);} // tgen
ccc::CC0x11y9 ::CC0x11y9(){ note_ctor("_ZN3ccc8CC0x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x11y9E, buf);
    ::ccc::CC0x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x11y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC0x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x11y9E);
    dp->::ccc::CC0x11y9::~CC0x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x11y9E(Test__ZN3ccc8CC0x11y9E, "_ZN3ccc8CC0x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x11y9C1Ev();
extern void _ZN3ccc8CC0x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x11y9E[] = {
  NSPAIR(_ZN3ccc8CC0x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC0x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x11y93efgEv();
extern void _ZN3ccc8CC0x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y93pqrEv,_ZThn4_N3ccc8CC0x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC0x11y93efgEv,_ZThn4_N3ccc8CC0x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y93pqrEv,_ZThn4_N3ccc8CC0x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x11y93efgEv,_ZThn4_N3ccc8CC0x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x11y9E[];
Class_Descriptor cd__ZN3ccc8CC0x11y9E = {  "_ZN3ccc8CC0x11y9E", // class name
  bases__ZN3ccc8CC0x11y9E, 2,
  &(vtc__ZN3ccc8CC0x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y10  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x11y103abcEv
  ~CC0x11y10(); // tgen
  CC0x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y10E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y103pqrEv");}
void  ccc::CC0x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x11y103abcEv");}
ccc::CC0x11y10 ::~CC0x11y10(){ note_dtor("_ZN3ccc9CC0x11y10E", this);} // tgen
ccc::CC0x11y10 ::CC0x11y10(){ note_ctor("_ZN3ccc9CC0x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y10E, buf);
    ::ccc::CC0x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y10E);
    dp->::ccc::CC0x11y10::~CC0x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y10E(Test__ZN3ccc9CC0x11y10E, "_ZN3ccc9CC0x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y10C1Ev();
extern void _ZN3ccc9CC0x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y10E[] = {
  NSPAIR(_ZN3ccc9CC0x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y10E[];
extern void _ZN3ccc9CC0x11y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y103pqrEv,_ZThn4_N3ccc9CC0x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x11y103pqrEv,_ZThn4_N3ccc9CC0x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y10E[];
Class_Descriptor cd__ZN3ccc9CC0x11y10E = {  "_ZN3ccc9CC0x11y10E", // class name
  bases__ZN3ccc9CC0x11y10E, 2,
  &(vtc__ZN3ccc9CC0x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y11  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x11y113efgEv
  ~CC0x11y11(); // tgen
  CC0x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y11E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y113pqrEv");}
void  ccc::CC0x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x11y113efgEv");}
ccc::CC0x11y11 ::~CC0x11y11(){ note_dtor("_ZN3ccc9CC0x11y11E", this);} // tgen
ccc::CC0x11y11 ::CC0x11y11(){ note_ctor("_ZN3ccc9CC0x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y11E, buf);
    ::ccc::CC0x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y11E);
    dp->::ccc::CC0x11y11::~CC0x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y11E(Test__ZN3ccc9CC0x11y11E, "_ZN3ccc9CC0x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y11C1Ev();
extern void _ZN3ccc9CC0x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y11E[] = {
  NSPAIR(_ZN3ccc9CC0x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x11y113efgEv();
extern void _ZN3ccc9CC0x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y113pqrEv,_ZThn4_N3ccc9CC0x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y113efgEv,_ZThn4_N3ccc9CC0x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x11y113pqrEv,_ZThn4_N3ccc9CC0x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x11y113efgEv,_ZThn4_N3ccc9CC0x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y11E[];
Class_Descriptor cd__ZN3ccc9CC0x11y11E = {  "_ZN3ccc9CC0x11y11E", // class name
  bases__ZN3ccc9CC0x11y11E, 2,
  &(vtc__ZN3ccc9CC0x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y12  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC0x11y123abcEv
  ~CC0x11y12(); // tgen
  CC0x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC0x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x11y123abcEv");}
ccc::CC0x11y12 ::~CC0x11y12(){ note_dtor("_ZN3ccc9CC0x11y12E", this);} // tgen
ccc::CC0x11y12 ::CC0x11y12(){ note_ctor("_ZN3ccc9CC0x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y12E, buf);
    ::ccc::CC0x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y12E);
    dp->::ccc::CC0x11y12::~CC0x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y12E(Test__ZN3ccc9CC0x11y12E, "_ZN3ccc9CC0x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y12C1Ev();
extern void _ZN3ccc9CC0x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y12E[] = {
  NSPAIR(_ZN3ccc9CC0x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y12E[];
extern void _ZN3ccc9CC0x11y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y12E[];
Class_Descriptor cd__ZN3ccc9CC0x11y12E = {  "_ZN3ccc9CC0x11y12E", // class name
  bases__ZN3ccc9CC0x11y12E, 2,
  &(vtc__ZN3ccc9CC0x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y13  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC0x11y133efgEv
  ~CC0x11y13(); // tgen
  CC0x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC0x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x11y133efgEv");}
ccc::CC0x11y13 ::~CC0x11y13(){ note_dtor("_ZN3ccc9CC0x11y13E", this);} // tgen
ccc::CC0x11y13 ::CC0x11y13(){ note_ctor("_ZN3ccc9CC0x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y13E, buf);
    ::ccc::CC0x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y13E);
    dp->::ccc::CC0x11y13::~CC0x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y13E(Test__ZN3ccc9CC0x11y13E, "_ZN3ccc9CC0x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y13C1Ev();
extern void _ZN3ccc9CC0x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y13E[] = {
  NSPAIR(_ZN3ccc9CC0x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x11y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y133efgEv,_ZThn4_N3ccc9CC0x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x11y133efgEv,_ZThn4_N3ccc9CC0x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y13E[];
Class_Descriptor cd__ZN3ccc9CC0x11y13E = {  "_ZN3ccc9CC0x11y13E", // class name
  bases__ZN3ccc9CC0x11y13E, 2,
  &(vtc__ZN3ccc9CC0x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y14  : ::ccc::AA0 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC0x11y143pqrEv
  ~CC0x11y14(); // tgen
  CC0x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC0x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x11y143pqrEv");}
ccc::CC0x11y14 ::~CC0x11y14(){ note_dtor("_ZN3ccc9CC0x11y14E", this);} // tgen
ccc::CC0x11y14 ::CC0x11y14(){ note_ctor("_ZN3ccc9CC0x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y14E, buf);
    ::ccc::CC0x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y14E);
    dp->::ccc::CC0x11y14::~CC0x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y14E(Test__ZN3ccc9CC0x11y14E, "_ZN3ccc9CC0x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y14C1Ev();
extern void _ZN3ccc9CC0x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y14E[] = {
  NSPAIR(_ZN3ccc9CC0x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x11y143pqrEv,_ZThn4_N3ccc9CC0x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x11y143pqrEv,_ZThn4_N3ccc9CC0x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y14E[];
Class_Descriptor cd__ZN3ccc9CC0x11y14E = {  "_ZN3ccc9CC0x11y14E", // class name
  bases__ZN3ccc9CC0x11y14E, 2,
  &(vtc__ZN3ccc9CC0x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x11y15  : ::ccc::AA0 , ::ccc::BB11 {
  ~CC0x11y15(); // tgen
  CC0x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x11y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC0x11y15 ::~CC0x11y15(){ note_dtor("_ZN3ccc9CC0x11y15E", this);} // tgen
ccc::CC0x11y15 ::CC0x11y15(){ note_ctor("_ZN3ccc9CC0x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x11y15E, buf);
    ::ccc::CC0x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x11y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC0x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x11y15E);
    dp->::ccc::CC0x11y15::~CC0x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x11y15E(Test__ZN3ccc9CC0x11y15E, "_ZN3ccc9CC0x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x11y15C1Ev();
extern void _ZN3ccc9CC0x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x11y15E[] = {
  NSPAIR(_ZN3ccc9CC0x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC0x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x11y15E[];
Class_Descriptor cd__ZN3ccc9CC0x11y15E = {  "_ZN3ccc9CC0x11y15E", // class name
  bases__ZN3ccc9CC0x11y15E, 2,
  &(vtc__ZN3ccc9CC0x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y0  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y03pqrEv
  ~CC0x12y0(); // tgen
  CC0x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y0E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y03abcEv");}
void  ccc::CC0x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y03efgEv");}
void  ccc::CC0x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y03pqrEv");}
ccc::CC0x12y0 ::~CC0x12y0(){ note_dtor("_ZN3ccc8CC0x12y0E", this);} // tgen
ccc::CC0x12y0 ::CC0x12y0(){ note_ctor("_ZN3ccc8CC0x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y0E, buf);
    ::ccc::CC0x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y0E);
    dp->::ccc::CC0x12y0::~CC0x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y0E(Test__ZN3ccc8CC0x12y0E, "_ZN3ccc8CC0x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y0C1Ev();
extern void _ZN3ccc8CC0x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y0E[] = {
  NSPAIR(_ZN3ccc8CC0x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y0E[];
extern void _ZN3ccc8CC0x12y03abcEv();
extern void _ZN3ccc8CC0x12y03efgEv();
extern void _ZN3ccc8CC0x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y03abcEv,_ZThn4_N3ccc8CC0x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y03abcEv,_ZThn4_N3ccc8CC0x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y0E[];
Class_Descriptor cd__ZN3ccc8CC0x12y0E = {  "_ZN3ccc8CC0x12y0E", // class name
  bases__ZN3ccc8CC0x12y0E, 2,
  &(vtc__ZN3ccc8CC0x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y1  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x12y13efgEv
  ~CC0x12y1(); // tgen
  CC0x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y1E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y13abcEv");}
void  ccc::CC0x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y13pqrEv");}
void  ccc::CC0x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y13efgEv");}
ccc::CC0x12y1 ::~CC0x12y1(){ note_dtor("_ZN3ccc8CC0x12y1E", this);} // tgen
ccc::CC0x12y1 ::CC0x12y1(){ note_ctor("_ZN3ccc8CC0x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y1E, buf);
    ::ccc::CC0x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y1E);
    dp->::ccc::CC0x12y1::~CC0x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y1E(Test__ZN3ccc8CC0x12y1E, "_ZN3ccc8CC0x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y1C1Ev();
extern void _ZN3ccc8CC0x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y1E[] = {
  NSPAIR(_ZN3ccc8CC0x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y1E[];
extern void _ZN3ccc8CC0x12y13abcEv();
extern void _ZN3ccc8CC0x12y13efgEv();
extern void _ZN3ccc8CC0x12y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y13abcEv,_ZThn4_N3ccc8CC0x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y13abcEv,_ZThn4_N3ccc8CC0x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y1E[];
Class_Descriptor cd__ZN3ccc8CC0x12y1E = {  "_ZN3ccc8CC0x12y1E", // class name
  bases__ZN3ccc8CC0x12y1E, 2,
  &(vtc__ZN3ccc8CC0x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y2  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y23pqrEv
  ~CC0x12y2(); // tgen
  CC0x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y2E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y23efgEv");}
void  ccc::CC0x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y23abcEv");}
void  ccc::CC0x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y23pqrEv");}
ccc::CC0x12y2 ::~CC0x12y2(){ note_dtor("_ZN3ccc8CC0x12y2E", this);} // tgen
ccc::CC0x12y2 ::CC0x12y2(){ note_ctor("_ZN3ccc8CC0x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y2E, buf);
    ::ccc::CC0x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y2E);
    dp->::ccc::CC0x12y2::~CC0x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y2E(Test__ZN3ccc8CC0x12y2E, "_ZN3ccc8CC0x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y2C1Ev();
extern void _ZN3ccc8CC0x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y2E[] = {
  NSPAIR(_ZN3ccc8CC0x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y2E[];
extern void _ZN3ccc8CC0x12y23abcEv();
extern void _ZN3ccc8CC0x12y23efgEv();
extern void _ZN3ccc8CC0x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y23abcEv,_ZThn4_N3ccc8CC0x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y23abcEv,_ZThn4_N3ccc8CC0x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y2E[];
Class_Descriptor cd__ZN3ccc8CC0x12y2E = {  "_ZN3ccc8CC0x12y2E", // class name
  bases__ZN3ccc8CC0x12y2E, 2,
  &(vtc__ZN3ccc8CC0x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y3  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x12y33abcEv
  ~CC0x12y3(); // tgen
  CC0x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y3E) C1{ BC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y33efgEv");}
void  ccc::CC0x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y33pqrEv");}
void  ccc::CC0x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y33abcEv");}
ccc::CC0x12y3 ::~CC0x12y3(){ note_dtor("_ZN3ccc8CC0x12y3E", this);} // tgen
ccc::CC0x12y3 ::CC0x12y3(){ note_ctor("_ZN3ccc8CC0x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y3E, buf);
    ::ccc::CC0x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y3E);
    dp->::ccc::CC0x12y3::~CC0x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y3E(Test__ZN3ccc8CC0x12y3E, "_ZN3ccc8CC0x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y3C1Ev();
extern void _ZN3ccc8CC0x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y3E[] = {
  NSPAIR(_ZN3ccc8CC0x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y3E[];
extern void _ZN3ccc8CC0x12y33abcEv();
extern void _ZN3ccc8CC0x12y33efgEv();
extern void _ZN3ccc8CC0x12y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y33abcEv,_ZThn4_N3ccc8CC0x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y33abcEv,_ZThn4_N3ccc8CC0x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y3E[];
Class_Descriptor cd__ZN3ccc8CC0x12y3E = {  "_ZN3ccc8CC0x12y3E", // class name
  bases__ZN3ccc8CC0x12y3E, 2,
  &(vtc__ZN3ccc8CC0x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y4  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC0x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y43efgEv
  ~CC0x12y4(); // tgen
  CC0x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y4E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y43pqrEv");}
void  ccc::CC0x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y43abcEv");}
void  ccc::CC0x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y43efgEv");}
ccc::CC0x12y4 ::~CC0x12y4(){ note_dtor("_ZN3ccc8CC0x12y4E", this);} // tgen
ccc::CC0x12y4 ::CC0x12y4(){ note_ctor("_ZN3ccc8CC0x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y4E, buf);
    ::ccc::CC0x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y4E);
    dp->::ccc::CC0x12y4::~CC0x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y4E(Test__ZN3ccc8CC0x12y4E, "_ZN3ccc8CC0x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y4C1Ev();
extern void _ZN3ccc8CC0x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y4E[] = {
  NSPAIR(_ZN3ccc8CC0x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y4E[];
extern void _ZN3ccc8CC0x12y43abcEv();
extern void _ZN3ccc8CC0x12y43efgEv();
extern void _ZN3ccc8CC0x12y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y43abcEv,_ZThn4_N3ccc8CC0x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y43abcEv,_ZThn4_N3ccc8CC0x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y4E[];
Class_Descriptor cd__ZN3ccc8CC0x12y4E = {  "_ZN3ccc8CC0x12y4E", // class name
  bases__ZN3ccc8CC0x12y4E, 2,
  &(vtc__ZN3ccc8CC0x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y5  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC0x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y53abcEv
  ~CC0x12y5(); // tgen
  CC0x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y5E) C1{ BC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y53pqrEv");}
void  ccc::CC0x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y53efgEv");}
void  ccc::CC0x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y53abcEv");}
ccc::CC0x12y5 ::~CC0x12y5(){ note_dtor("_ZN3ccc8CC0x12y5E", this);} // tgen
ccc::CC0x12y5 ::CC0x12y5(){ note_ctor("_ZN3ccc8CC0x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y5E, buf);
    ::ccc::CC0x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y5E);
    dp->::ccc::CC0x12y5::~CC0x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y5E(Test__ZN3ccc8CC0x12y5E, "_ZN3ccc8CC0x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y5C1Ev();
extern void _ZN3ccc8CC0x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y5E[] = {
  NSPAIR(_ZN3ccc8CC0x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y5E[];
extern void _ZN3ccc8CC0x12y53abcEv();
extern void _ZN3ccc8CC0x12y53efgEv();
extern void _ZN3ccc8CC0x12y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y53abcEv,_ZThn4_N3ccc8CC0x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y53abcEv,_ZThn4_N3ccc8CC0x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y5E[];
Class_Descriptor cd__ZN3ccc8CC0x12y5E = {  "_ZN3ccc8CC0x12y5E", // class name
  bases__ZN3ccc8CC0x12y5E, 2,
  &(vtc__ZN3ccc8CC0x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y6  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x12y63efgEv
  ~CC0x12y6(); // tgen
  CC0x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y6E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y63abcEv");}
void  ccc::CC0x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y63efgEv");}
ccc::CC0x12y6 ::~CC0x12y6(){ note_dtor("_ZN3ccc8CC0x12y6E", this);} // tgen
ccc::CC0x12y6 ::CC0x12y6(){ note_ctor("_ZN3ccc8CC0x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y6E, buf);
    ::ccc::CC0x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y6E);
    dp->::ccc::CC0x12y6::~CC0x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y6E(Test__ZN3ccc8CC0x12y6E, "_ZN3ccc8CC0x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y6C1Ev();
extern void _ZN3ccc8CC0x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y6E[] = {
  NSPAIR(_ZN3ccc8CC0x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y6E[];
extern void _ZN3ccc8CC0x12y63abcEv();
extern void _ZN3ccc8CC0x12y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y63abcEv,_ZThn4_N3ccc8CC0x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y63abcEv,_ZThn4_N3ccc8CC0x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y6E[];
Class_Descriptor cd__ZN3ccc8CC0x12y6E = {  "_ZN3ccc8CC0x12y6E", // class name
  bases__ZN3ccc8CC0x12y6E, 2,
  &(vtc__ZN3ccc8CC0x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y7  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC0x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y73pqrEv
  ~CC0x12y7(); // tgen
  CC0x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y7E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y73abcEv");}
void  ccc::CC0x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y73pqrEv");}
ccc::CC0x12y7 ::~CC0x12y7(){ note_dtor("_ZN3ccc8CC0x12y7E", this);} // tgen
ccc::CC0x12y7 ::CC0x12y7(){ note_ctor("_ZN3ccc8CC0x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y7E, buf);
    ::ccc::CC0x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y7E);
    dp->::ccc::CC0x12y7::~CC0x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y7E(Test__ZN3ccc8CC0x12y7E, "_ZN3ccc8CC0x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y7C1Ev();
extern void _ZN3ccc8CC0x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y7E[] = {
  NSPAIR(_ZN3ccc8CC0x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y7E[];
extern void _ZN3ccc8CC0x12y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y73abcEv,_ZThn4_N3ccc8CC0x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y73abcEv,_ZThn4_N3ccc8CC0x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y7E[];
Class_Descriptor cd__ZN3ccc8CC0x12y7E = {  "_ZN3ccc8CC0x12y7E", // class name
  bases__ZN3ccc8CC0x12y7E, 2,
  &(vtc__ZN3ccc8CC0x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y8  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x12y83abcEv
  ~CC0x12y8(); // tgen
  CC0x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y8E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y83efgEv");}
void  ccc::CC0x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x12y83abcEv");}
ccc::CC0x12y8 ::~CC0x12y8(){ note_dtor("_ZN3ccc8CC0x12y8E", this);} // tgen
ccc::CC0x12y8 ::CC0x12y8(){ note_ctor("_ZN3ccc8CC0x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y8E, buf);
    ::ccc::CC0x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y8E);
    dp->::ccc::CC0x12y8::~CC0x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y8E(Test__ZN3ccc8CC0x12y8E, "_ZN3ccc8CC0x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y8C1Ev();
extern void _ZN3ccc8CC0x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y8E[] = {
  NSPAIR(_ZN3ccc8CC0x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y8E[];
extern void _ZN3ccc8CC0x12y83abcEv();
extern void _ZN3ccc8CC0x12y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x12y83abcEv,_ZThn4_N3ccc8CC0x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x12y83abcEv,_ZThn4_N3ccc8CC0x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y8E[];
Class_Descriptor cd__ZN3ccc8CC0x12y8E = {  "_ZN3ccc8CC0x12y8E", // class name
  bases__ZN3ccc8CC0x12y8E, 2,
  &(vtc__ZN3ccc8CC0x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y9  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC0x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x12y93pqrEv
  ~CC0x12y9(); // tgen
  CC0x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x12y9E) C1{ BC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x12y93efgEv");}
void  ccc::CC0x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x12y93pqrEv");}
ccc::CC0x12y9 ::~CC0x12y9(){ note_dtor("_ZN3ccc8CC0x12y9E", this);} // tgen
ccc::CC0x12y9 ::CC0x12y9(){ note_ctor("_ZN3ccc8CC0x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x12y9E, buf);
    ::ccc::CC0x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x12y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC0x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x12y9E);
    dp->::ccc::CC0x12y9::~CC0x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x12y9E(Test__ZN3ccc8CC0x12y9E, "_ZN3ccc8CC0x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x12y9C1Ev();
extern void _ZN3ccc8CC0x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x12y9E[] = {
  NSPAIR(_ZN3ccc8CC0x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC0x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x12y93efgEv();
extern void _ZN3ccc8CC0x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x12y9E[];
Class_Descriptor cd__ZN3ccc8CC0x12y9E = {  "_ZN3ccc8CC0x12y9E", // class name
  bases__ZN3ccc8CC0x12y9E, 2,
  &(vtc__ZN3ccc8CC0x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y10  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x12y103abcEv
  ~CC0x12y10(); // tgen
  CC0x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y10E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y103pqrEv");}
void  ccc::CC0x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x12y103abcEv");}
ccc::CC0x12y10 ::~CC0x12y10(){ note_dtor("_ZN3ccc9CC0x12y10E", this);} // tgen
ccc::CC0x12y10 ::CC0x12y10(){ note_ctor("_ZN3ccc9CC0x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y10E, buf);
    ::ccc::CC0x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y10E);
    dp->::ccc::CC0x12y10::~CC0x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y10E(Test__ZN3ccc9CC0x12y10E, "_ZN3ccc9CC0x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y10C1Ev();
extern void _ZN3ccc9CC0x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y10E[] = {
  NSPAIR(_ZN3ccc9CC0x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y10E[];
extern void _ZN3ccc9CC0x12y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y103abcEv,_ZThn4_N3ccc9CC0x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x12y103abcEv,_ZThn4_N3ccc9CC0x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y10E[];
Class_Descriptor cd__ZN3ccc9CC0x12y10E = {  "_ZN3ccc9CC0x12y10E", // class name
  bases__ZN3ccc9CC0x12y10E, 2,
  &(vtc__ZN3ccc9CC0x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y11  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x12y113efgEv
  ~CC0x12y11(); // tgen
  CC0x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y11E) C1{ BC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y113pqrEv");}
void  ccc::CC0x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x12y113efgEv");}
ccc::CC0x12y11 ::~CC0x12y11(){ note_dtor("_ZN3ccc9CC0x12y11E", this);} // tgen
ccc::CC0x12y11 ::CC0x12y11(){ note_ctor("_ZN3ccc9CC0x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y11E, buf);
    ::ccc::CC0x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y11E);
    dp->::ccc::CC0x12y11::~CC0x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y11E(Test__ZN3ccc9CC0x12y11E, "_ZN3ccc9CC0x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y11C1Ev();
extern void _ZN3ccc9CC0x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y11E[] = {
  NSPAIR(_ZN3ccc9CC0x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x12y113efgEv();
extern void _ZN3ccc9CC0x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y11E[];
Class_Descriptor cd__ZN3ccc9CC0x12y11E = {  "_ZN3ccc9CC0x12y11E", // class name
  bases__ZN3ccc9CC0x12y11E, 2,
  &(vtc__ZN3ccc9CC0x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y12  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC0x12y123abcEv
  ~CC0x12y12(); // tgen
  CC0x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y12E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x12y123abcEv");}
ccc::CC0x12y12 ::~CC0x12y12(){ note_dtor("_ZN3ccc9CC0x12y12E", this);} // tgen
ccc::CC0x12y12 ::CC0x12y12(){ note_ctor("_ZN3ccc9CC0x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y12E, buf);
    ::ccc::CC0x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y12E);
    dp->::ccc::CC0x12y12::~CC0x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y12E(Test__ZN3ccc9CC0x12y12E, "_ZN3ccc9CC0x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y12C1Ev();
extern void _ZN3ccc9CC0x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y12E[] = {
  NSPAIR(_ZN3ccc9CC0x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y12E[];
extern void _ZN3ccc9CC0x12y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x12y123abcEv,_ZThn4_N3ccc9CC0x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x12y123abcEv,_ZThn4_N3ccc9CC0x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y12E[];
Class_Descriptor cd__ZN3ccc9CC0x12y12E = {  "_ZN3ccc9CC0x12y12E", // class name
  bases__ZN3ccc9CC0x12y12E, 2,
  &(vtc__ZN3ccc9CC0x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y13  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC0x12y133efgEv
  ~CC0x12y13(); // tgen
  CC0x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y13E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x12y133efgEv");}
ccc::CC0x12y13 ::~CC0x12y13(){ note_dtor("_ZN3ccc9CC0x12y13E", this);} // tgen
ccc::CC0x12y13 ::CC0x12y13(){ note_ctor("_ZN3ccc9CC0x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y13E, buf);
    ::ccc::CC0x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y13E);
    dp->::ccc::CC0x12y13::~CC0x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y13E(Test__ZN3ccc9CC0x12y13E, "_ZN3ccc9CC0x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y13C1Ev();
extern void _ZN3ccc9CC0x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y13E[] = {
  NSPAIR(_ZN3ccc9CC0x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x12y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y13E[];
Class_Descriptor cd__ZN3ccc9CC0x12y13E = {  "_ZN3ccc9CC0x12y13E", // class name
  bases__ZN3ccc9CC0x12y13E, 2,
  &(vtc__ZN3ccc9CC0x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y14  : ::ccc::AA0 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC0x12y143pqrEv
  ~CC0x12y14(); // tgen
  CC0x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y14E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x12y143pqrEv");}
ccc::CC0x12y14 ::~CC0x12y14(){ note_dtor("_ZN3ccc9CC0x12y14E", this);} // tgen
ccc::CC0x12y14 ::CC0x12y14(){ note_ctor("_ZN3ccc9CC0x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y14E, buf);
    ::ccc::CC0x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y14E);
    dp->::ccc::CC0x12y14::~CC0x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y14E(Test__ZN3ccc9CC0x12y14E, "_ZN3ccc9CC0x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y14C1Ev();
extern void _ZN3ccc9CC0x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y14E[] = {
  NSPAIR(_ZN3ccc9CC0x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y14E[];
Class_Descriptor cd__ZN3ccc9CC0x12y14E = {  "_ZN3ccc9CC0x12y14E", // class name
  bases__ZN3ccc9CC0x12y14E, 2,
  &(vtc__ZN3ccc9CC0x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x12y15  : ::ccc::AA0 , ::ccc::BB12 {
  ~CC0x12y15(); // tgen
  CC0x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x12y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x12y15 ::~CC0x12y15(){ note_dtor("_ZN3ccc9CC0x12y15E", this);} // tgen
ccc::CC0x12y15 ::CC0x12y15(){ note_ctor("_ZN3ccc9CC0x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x12y15E, buf);
    ::ccc::CC0x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x12y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC0x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x12y15E);
    dp->::ccc::CC0x12y15::~CC0x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x12y15E(Test__ZN3ccc9CC0x12y15E, "_ZN3ccc9CC0x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x12y15C1Ev();
extern void _ZN3ccc9CC0x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x12y15E[] = {
  NSPAIR(_ZN3ccc9CC0x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC0x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x12y15E[];
Class_Descriptor cd__ZN3ccc9CC0x12y15E = {  "_ZN3ccc9CC0x12y15E", // class name
  bases__ZN3ccc9CC0x12y15E, 2,
  &(vtc__ZN3ccc9CC0x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y0  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y03pqrEv
  ~CC0x13y0(); // tgen
  CC0x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y0E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y03abcEv");}
void  ccc::CC0x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y03efgEv");}
void  ccc::CC0x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y03pqrEv");}
ccc::CC0x13y0 ::~CC0x13y0(){ note_dtor("_ZN3ccc8CC0x13y0E", this);} // tgen
ccc::CC0x13y0 ::CC0x13y0(){ note_ctor("_ZN3ccc8CC0x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y0E, buf);
    ::ccc::CC0x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y0E);
    dp->::ccc::CC0x13y0::~CC0x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y0E(Test__ZN3ccc8CC0x13y0E, "_ZN3ccc8CC0x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y0C1Ev();
extern void _ZN3ccc8CC0x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y0E[] = {
  NSPAIR(_ZN3ccc8CC0x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y0E[];
extern void _ZN3ccc8CC0x13y03abcEv();
extern void _ZN3ccc8CC0x13y03efgEv();
extern void _ZN3ccc8CC0x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y03efgEv,_ZThn4_N3ccc8CC0x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y03efgEv,_ZThn4_N3ccc8CC0x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y0E[];
Class_Descriptor cd__ZN3ccc8CC0x13y0E = {  "_ZN3ccc8CC0x13y0E", // class name
  bases__ZN3ccc8CC0x13y0E, 2,
  &(vtc__ZN3ccc8CC0x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y1  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x13y13efgEv
  ~CC0x13y1(); // tgen
  CC0x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y1E) C1{ BC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y13abcEv");}
void  ccc::CC0x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y13pqrEv");}
void  ccc::CC0x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y13efgEv");}
ccc::CC0x13y1 ::~CC0x13y1(){ note_dtor("_ZN3ccc8CC0x13y1E", this);} // tgen
ccc::CC0x13y1 ::CC0x13y1(){ note_ctor("_ZN3ccc8CC0x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y1E, buf);
    ::ccc::CC0x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y1E);
    dp->::ccc::CC0x13y1::~CC0x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y1E(Test__ZN3ccc8CC0x13y1E, "_ZN3ccc8CC0x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y1C1Ev();
extern void _ZN3ccc8CC0x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y1E[] = {
  NSPAIR(_ZN3ccc8CC0x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y1E[];
extern void _ZN3ccc8CC0x13y13abcEv();
extern void _ZN3ccc8CC0x13y13efgEv();
extern void _ZN3ccc8CC0x13y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y13efgEv,_ZThn4_N3ccc8CC0x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y13efgEv,_ZThn4_N3ccc8CC0x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y1E[];
Class_Descriptor cd__ZN3ccc8CC0x13y1E = {  "_ZN3ccc8CC0x13y1E", // class name
  bases__ZN3ccc8CC0x13y1E, 2,
  &(vtc__ZN3ccc8CC0x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y2  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y23pqrEv
  ~CC0x13y2(); // tgen
  CC0x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y2E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y23efgEv");}
void  ccc::CC0x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y23abcEv");}
void  ccc::CC0x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y23pqrEv");}
ccc::CC0x13y2 ::~CC0x13y2(){ note_dtor("_ZN3ccc8CC0x13y2E", this);} // tgen
ccc::CC0x13y2 ::CC0x13y2(){ note_ctor("_ZN3ccc8CC0x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y2E, buf);
    ::ccc::CC0x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y2E);
    dp->::ccc::CC0x13y2::~CC0x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y2E(Test__ZN3ccc8CC0x13y2E, "_ZN3ccc8CC0x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y2C1Ev();
extern void _ZN3ccc8CC0x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y2E[] = {
  NSPAIR(_ZN3ccc8CC0x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y2E[];
extern void _ZN3ccc8CC0x13y23abcEv();
extern void _ZN3ccc8CC0x13y23efgEv();
extern void _ZN3ccc8CC0x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y23efgEv,_ZThn4_N3ccc8CC0x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y23efgEv,_ZThn4_N3ccc8CC0x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y2E[];
Class_Descriptor cd__ZN3ccc8CC0x13y2E = {  "_ZN3ccc8CC0x13y2E", // class name
  bases__ZN3ccc8CC0x13y2E, 2,
  &(vtc__ZN3ccc8CC0x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y3  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x13y33abcEv
  ~CC0x13y3(); // tgen
  CC0x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y3E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y33efgEv");}
void  ccc::CC0x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y33pqrEv");}
void  ccc::CC0x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y33abcEv");}
ccc::CC0x13y3 ::~CC0x13y3(){ note_dtor("_ZN3ccc8CC0x13y3E", this);} // tgen
ccc::CC0x13y3 ::CC0x13y3(){ note_ctor("_ZN3ccc8CC0x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y3E, buf);
    ::ccc::CC0x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y3E);
    dp->::ccc::CC0x13y3::~CC0x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y3E(Test__ZN3ccc8CC0x13y3E, "_ZN3ccc8CC0x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y3C1Ev();
extern void _ZN3ccc8CC0x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y3E[] = {
  NSPAIR(_ZN3ccc8CC0x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y3E[];
extern void _ZN3ccc8CC0x13y33abcEv();
extern void _ZN3ccc8CC0x13y33efgEv();
extern void _ZN3ccc8CC0x13y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y33efgEv,_ZThn4_N3ccc8CC0x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y33efgEv,_ZThn4_N3ccc8CC0x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y3E[];
Class_Descriptor cd__ZN3ccc8CC0x13y3E = {  "_ZN3ccc8CC0x13y3E", // class name
  bases__ZN3ccc8CC0x13y3E, 2,
  &(vtc__ZN3ccc8CC0x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y4  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC0x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y43efgEv
  ~CC0x13y4(); // tgen
  CC0x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y4E) C1{ BC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y43pqrEv");}
void  ccc::CC0x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y43abcEv");}
void  ccc::CC0x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y43efgEv");}
ccc::CC0x13y4 ::~CC0x13y4(){ note_dtor("_ZN3ccc8CC0x13y4E", this);} // tgen
ccc::CC0x13y4 ::CC0x13y4(){ note_ctor("_ZN3ccc8CC0x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y4E, buf);
    ::ccc::CC0x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y4E);
    dp->::ccc::CC0x13y4::~CC0x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y4E(Test__ZN3ccc8CC0x13y4E, "_ZN3ccc8CC0x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y4C1Ev();
extern void _ZN3ccc8CC0x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y4E[] = {
  NSPAIR(_ZN3ccc8CC0x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y4E[];
extern void _ZN3ccc8CC0x13y43abcEv();
extern void _ZN3ccc8CC0x13y43efgEv();
extern void _ZN3ccc8CC0x13y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y43efgEv,_ZThn4_N3ccc8CC0x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y43efgEv,_ZThn4_N3ccc8CC0x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y4E[];
Class_Descriptor cd__ZN3ccc8CC0x13y4E = {  "_ZN3ccc8CC0x13y4E", // class name
  bases__ZN3ccc8CC0x13y4E, 2,
  &(vtc__ZN3ccc8CC0x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y5  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC0x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y53abcEv
  ~CC0x13y5(); // tgen
  CC0x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y5E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y53pqrEv");}
void  ccc::CC0x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y53efgEv");}
void  ccc::CC0x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y53abcEv");}
ccc::CC0x13y5 ::~CC0x13y5(){ note_dtor("_ZN3ccc8CC0x13y5E", this);} // tgen
ccc::CC0x13y5 ::CC0x13y5(){ note_ctor("_ZN3ccc8CC0x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y5E, buf);
    ::ccc::CC0x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y5E);
    dp->::ccc::CC0x13y5::~CC0x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y5E(Test__ZN3ccc8CC0x13y5E, "_ZN3ccc8CC0x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y5C1Ev();
extern void _ZN3ccc8CC0x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y5E[] = {
  NSPAIR(_ZN3ccc8CC0x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y5E[];
extern void _ZN3ccc8CC0x13y53abcEv();
extern void _ZN3ccc8CC0x13y53efgEv();
extern void _ZN3ccc8CC0x13y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y53efgEv,_ZThn4_N3ccc8CC0x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y53efgEv,_ZThn4_N3ccc8CC0x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y5E[];
Class_Descriptor cd__ZN3ccc8CC0x13y5E = {  "_ZN3ccc8CC0x13y5E", // class name
  bases__ZN3ccc8CC0x13y5E, 2,
  &(vtc__ZN3ccc8CC0x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y6  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x13y63efgEv
  ~CC0x13y6(); // tgen
  CC0x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y6E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y63abcEv");}
void  ccc::CC0x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y63efgEv");}
ccc::CC0x13y6 ::~CC0x13y6(){ note_dtor("_ZN3ccc8CC0x13y6E", this);} // tgen
ccc::CC0x13y6 ::CC0x13y6(){ note_ctor("_ZN3ccc8CC0x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y6E, buf);
    ::ccc::CC0x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y6E);
    dp->::ccc::CC0x13y6::~CC0x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y6E(Test__ZN3ccc8CC0x13y6E, "_ZN3ccc8CC0x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y6C1Ev();
extern void _ZN3ccc8CC0x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y6E[] = {
  NSPAIR(_ZN3ccc8CC0x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y6E[];
extern void _ZN3ccc8CC0x13y63abcEv();
extern void _ZN3ccc8CC0x13y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y63efgEv,_ZThn4_N3ccc8CC0x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y63efgEv,_ZThn4_N3ccc8CC0x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y6E[];
Class_Descriptor cd__ZN3ccc8CC0x13y6E = {  "_ZN3ccc8CC0x13y6E", // class name
  bases__ZN3ccc8CC0x13y6E, 2,
  &(vtc__ZN3ccc8CC0x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y7  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC0x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y73pqrEv
  ~CC0x13y7(); // tgen
  CC0x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y7E) C1{ BC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y73abcEv");}
void  ccc::CC0x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y73pqrEv");}
ccc::CC0x13y7 ::~CC0x13y7(){ note_dtor("_ZN3ccc8CC0x13y7E", this);} // tgen
ccc::CC0x13y7 ::CC0x13y7(){ note_ctor("_ZN3ccc8CC0x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y7E, buf);
    ::ccc::CC0x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y7E);
    dp->::ccc::CC0x13y7::~CC0x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y7E(Test__ZN3ccc8CC0x13y7E, "_ZN3ccc8CC0x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y7C1Ev();
extern void _ZN3ccc8CC0x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y7E[] = {
  NSPAIR(_ZN3ccc8CC0x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y7E[];
extern void _ZN3ccc8CC0x13y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y7E[];
Class_Descriptor cd__ZN3ccc8CC0x13y7E = {  "_ZN3ccc8CC0x13y7E", // class name
  bases__ZN3ccc8CC0x13y7E, 2,
  &(vtc__ZN3ccc8CC0x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y8  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x13y83abcEv
  ~CC0x13y8(); // tgen
  CC0x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y8E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y83efgEv");}
void  ccc::CC0x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x13y83abcEv");}
ccc::CC0x13y8 ::~CC0x13y8(){ note_dtor("_ZN3ccc8CC0x13y8E", this);} // tgen
ccc::CC0x13y8 ::CC0x13y8(){ note_ctor("_ZN3ccc8CC0x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y8E, buf);
    ::ccc::CC0x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y8E);
    dp->::ccc::CC0x13y8::~CC0x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y8E(Test__ZN3ccc8CC0x13y8E, "_ZN3ccc8CC0x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y8C1Ev();
extern void _ZN3ccc8CC0x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y8E[] = {
  NSPAIR(_ZN3ccc8CC0x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y8E[];
extern void _ZN3ccc8CC0x13y83abcEv();
extern void _ZN3ccc8CC0x13y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y83efgEv,_ZThn4_N3ccc8CC0x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y83efgEv,_ZThn4_N3ccc8CC0x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y8E[];
Class_Descriptor cd__ZN3ccc8CC0x13y8E = {  "_ZN3ccc8CC0x13y8E", // class name
  bases__ZN3ccc8CC0x13y8E, 2,
  &(vtc__ZN3ccc8CC0x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y9  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC0x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x13y93pqrEv
  ~CC0x13y9(); // tgen
  CC0x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x13y9E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x13y93efgEv");}
void  ccc::CC0x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x13y93pqrEv");}
ccc::CC0x13y9 ::~CC0x13y9(){ note_dtor("_ZN3ccc8CC0x13y9E", this);} // tgen
ccc::CC0x13y9 ::CC0x13y9(){ note_ctor("_ZN3ccc8CC0x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x13y9E, buf);
    ::ccc::CC0x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x13y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC0x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x13y9E);
    dp->::ccc::CC0x13y9::~CC0x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x13y9E(Test__ZN3ccc8CC0x13y9E, "_ZN3ccc8CC0x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x13y9C1Ev();
extern void _ZN3ccc8CC0x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x13y9E[] = {
  NSPAIR(_ZN3ccc8CC0x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC0x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x13y93efgEv();
extern void _ZN3ccc8CC0x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x13y93efgEv,_ZThn4_N3ccc8CC0x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x13y93efgEv,_ZThn4_N3ccc8CC0x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x13y9E[];
Class_Descriptor cd__ZN3ccc8CC0x13y9E = {  "_ZN3ccc8CC0x13y9E", // class name
  bases__ZN3ccc8CC0x13y9E, 2,
  &(vtc__ZN3ccc8CC0x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y10  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x13y103abcEv
  ~CC0x13y10(); // tgen
  CC0x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y10E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y103pqrEv");}
void  ccc::CC0x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x13y103abcEv");}
ccc::CC0x13y10 ::~CC0x13y10(){ note_dtor("_ZN3ccc9CC0x13y10E", this);} // tgen
ccc::CC0x13y10 ::CC0x13y10(){ note_ctor("_ZN3ccc9CC0x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y10E, buf);
    ::ccc::CC0x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y10E);
    dp->::ccc::CC0x13y10::~CC0x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y10E(Test__ZN3ccc9CC0x13y10E, "_ZN3ccc9CC0x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y10C1Ev();
extern void _ZN3ccc9CC0x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y10E[] = {
  NSPAIR(_ZN3ccc9CC0x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y10E[];
extern void _ZN3ccc9CC0x13y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y10E[];
Class_Descriptor cd__ZN3ccc9CC0x13y10E = {  "_ZN3ccc9CC0x13y10E", // class name
  bases__ZN3ccc9CC0x13y10E, 2,
  &(vtc__ZN3ccc9CC0x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y11  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x13y113efgEv
  ~CC0x13y11(); // tgen
  CC0x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y11E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y113pqrEv");}
void  ccc::CC0x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x13y113efgEv");}
ccc::CC0x13y11 ::~CC0x13y11(){ note_dtor("_ZN3ccc9CC0x13y11E", this);} // tgen
ccc::CC0x13y11 ::CC0x13y11(){ note_ctor("_ZN3ccc9CC0x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y11E, buf);
    ::ccc::CC0x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y11E);
    dp->::ccc::CC0x13y11::~CC0x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y11E(Test__ZN3ccc9CC0x13y11E, "_ZN3ccc9CC0x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y11C1Ev();
extern void _ZN3ccc9CC0x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y11E[] = {
  NSPAIR(_ZN3ccc9CC0x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x13y113efgEv();
extern void _ZN3ccc9CC0x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y113efgEv,_ZThn4_N3ccc9CC0x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x13y113efgEv,_ZThn4_N3ccc9CC0x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y11E[];
Class_Descriptor cd__ZN3ccc9CC0x13y11E = {  "_ZN3ccc9CC0x13y11E", // class name
  bases__ZN3ccc9CC0x13y11E, 2,
  &(vtc__ZN3ccc9CC0x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y12  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC0x13y123abcEv
  ~CC0x13y12(); // tgen
  CC0x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y12E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x13y123abcEv");}
ccc::CC0x13y12 ::~CC0x13y12(){ note_dtor("_ZN3ccc9CC0x13y12E", this);} // tgen
ccc::CC0x13y12 ::CC0x13y12(){ note_ctor("_ZN3ccc9CC0x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y12E, buf);
    ::ccc::CC0x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y12E);
    dp->::ccc::CC0x13y12::~CC0x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y12E(Test__ZN3ccc9CC0x13y12E, "_ZN3ccc9CC0x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y12C1Ev();
extern void _ZN3ccc9CC0x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y12E[] = {
  NSPAIR(_ZN3ccc9CC0x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y12E[];
extern void _ZN3ccc9CC0x13y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y12E[];
Class_Descriptor cd__ZN3ccc9CC0x13y12E = {  "_ZN3ccc9CC0x13y12E", // class name
  bases__ZN3ccc9CC0x13y12E, 2,
  &(vtc__ZN3ccc9CC0x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y13  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC0x13y133efgEv
  ~CC0x13y13(); // tgen
  CC0x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y13E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x13y133efgEv");}
ccc::CC0x13y13 ::~CC0x13y13(){ note_dtor("_ZN3ccc9CC0x13y13E", this);} // tgen
ccc::CC0x13y13 ::CC0x13y13(){ note_ctor("_ZN3ccc9CC0x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y13E, buf);
    ::ccc::CC0x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y13E);
    dp->::ccc::CC0x13y13::~CC0x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y13E(Test__ZN3ccc9CC0x13y13E, "_ZN3ccc9CC0x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y13C1Ev();
extern void _ZN3ccc9CC0x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y13E[] = {
  NSPAIR(_ZN3ccc9CC0x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x13y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x13y133efgEv,_ZThn4_N3ccc9CC0x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x13y133efgEv,_ZThn4_N3ccc9CC0x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y13E[];
Class_Descriptor cd__ZN3ccc9CC0x13y13E = {  "_ZN3ccc9CC0x13y13E", // class name
  bases__ZN3ccc9CC0x13y13E, 2,
  &(vtc__ZN3ccc9CC0x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y14  : ::ccc::AA0 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC0x13y143pqrEv
  ~CC0x13y14(); // tgen
  CC0x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y14E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x13y143pqrEv");}
ccc::CC0x13y14 ::~CC0x13y14(){ note_dtor("_ZN3ccc9CC0x13y14E", this);} // tgen
ccc::CC0x13y14 ::CC0x13y14(){ note_ctor("_ZN3ccc9CC0x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y14E, buf);
    ::ccc::CC0x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y14E);
    dp->::ccc::CC0x13y14::~CC0x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y14E(Test__ZN3ccc9CC0x13y14E, "_ZN3ccc9CC0x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y14C1Ev();
extern void _ZN3ccc9CC0x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y14E[] = {
  NSPAIR(_ZN3ccc9CC0x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y14E[];
Class_Descriptor cd__ZN3ccc9CC0x13y14E = {  "_ZN3ccc9CC0x13y14E", // class name
  bases__ZN3ccc9CC0x13y14E, 2,
  &(vtc__ZN3ccc9CC0x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x13y15  : ::ccc::AA0 , ::ccc::BB13 {
  ~CC0x13y15(); // tgen
  CC0x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x13y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x13y15 ::~CC0x13y15(){ note_dtor("_ZN3ccc9CC0x13y15E", this);} // tgen
ccc::CC0x13y15 ::CC0x13y15(){ note_ctor("_ZN3ccc9CC0x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x13y15E, buf);
    ::ccc::CC0x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x13y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC0x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x13y15E);
    dp->::ccc::CC0x13y15::~CC0x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x13y15E(Test__ZN3ccc9CC0x13y15E, "_ZN3ccc9CC0x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x13y15C1Ev();
extern void _ZN3ccc9CC0x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x13y15E[] = {
  NSPAIR(_ZN3ccc9CC0x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC0x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x13y15E[];
Class_Descriptor cd__ZN3ccc9CC0x13y15E = {  "_ZN3ccc9CC0x13y15E", // class name
  bases__ZN3ccc9CC0x13y15E, 2,
  &(vtc__ZN3ccc9CC0x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y0  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y03pqrEv
  ~CC0x14y0(); // tgen
  CC0x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y0E) C1{ BC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y03abcEv");}
void  ccc::CC0x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y03efgEv");}
void  ccc::CC0x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y03pqrEv");}
ccc::CC0x14y0 ::~CC0x14y0(){ note_dtor("_ZN3ccc8CC0x14y0E", this);} // tgen
ccc::CC0x14y0 ::CC0x14y0(){ note_ctor("_ZN3ccc8CC0x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y0E, buf);
    ::ccc::CC0x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y0E);
    dp->::ccc::CC0x14y0::~CC0x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y0E(Test__ZN3ccc8CC0x14y0E, "_ZN3ccc8CC0x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y0C1Ev();
extern void _ZN3ccc8CC0x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y0E[] = {
  NSPAIR(_ZN3ccc8CC0x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y0E[];
extern void _ZN3ccc8CC0x14y03abcEv();
extern void _ZN3ccc8CC0x14y03efgEv();
extern void _ZN3ccc8CC0x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y03pqrEv,_ZThn4_N3ccc8CC0x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y03pqrEv,_ZThn4_N3ccc8CC0x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y0E[];
Class_Descriptor cd__ZN3ccc8CC0x14y0E = {  "_ZN3ccc8CC0x14y0E", // class name
  bases__ZN3ccc8CC0x14y0E, 2,
  &(vtc__ZN3ccc8CC0x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y1  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x14y13efgEv
  ~CC0x14y1(); // tgen
  CC0x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y1E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y13abcEv");}
void  ccc::CC0x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y13pqrEv");}
void  ccc::CC0x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y13efgEv");}
ccc::CC0x14y1 ::~CC0x14y1(){ note_dtor("_ZN3ccc8CC0x14y1E", this);} // tgen
ccc::CC0x14y1 ::CC0x14y1(){ note_ctor("_ZN3ccc8CC0x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y1E, buf);
    ::ccc::CC0x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y1E);
    dp->::ccc::CC0x14y1::~CC0x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y1E(Test__ZN3ccc8CC0x14y1E, "_ZN3ccc8CC0x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y1C1Ev();
extern void _ZN3ccc8CC0x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y1E[] = {
  NSPAIR(_ZN3ccc8CC0x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y1E[];
extern void _ZN3ccc8CC0x14y13abcEv();
extern void _ZN3ccc8CC0x14y13efgEv();
extern void _ZN3ccc8CC0x14y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y13pqrEv,_ZThn4_N3ccc8CC0x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y13pqrEv,_ZThn4_N3ccc8CC0x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y1E[];
Class_Descriptor cd__ZN3ccc8CC0x14y1E = {  "_ZN3ccc8CC0x14y1E", // class name
  bases__ZN3ccc8CC0x14y1E, 2,
  &(vtc__ZN3ccc8CC0x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y2  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y23pqrEv
  ~CC0x14y2(); // tgen
  CC0x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y2E) C1{ BC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y23efgEv");}
void  ccc::CC0x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y23abcEv");}
void  ccc::CC0x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y23pqrEv");}
ccc::CC0x14y2 ::~CC0x14y2(){ note_dtor("_ZN3ccc8CC0x14y2E", this);} // tgen
ccc::CC0x14y2 ::CC0x14y2(){ note_ctor("_ZN3ccc8CC0x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y2E, buf);
    ::ccc::CC0x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y2E);
    dp->::ccc::CC0x14y2::~CC0x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y2E(Test__ZN3ccc8CC0x14y2E, "_ZN3ccc8CC0x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y2C1Ev();
extern void _ZN3ccc8CC0x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y2E[] = {
  NSPAIR(_ZN3ccc8CC0x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y2E[];
extern void _ZN3ccc8CC0x14y23abcEv();
extern void _ZN3ccc8CC0x14y23efgEv();
extern void _ZN3ccc8CC0x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y23pqrEv,_ZThn4_N3ccc8CC0x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y23pqrEv,_ZThn4_N3ccc8CC0x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y2E[];
Class_Descriptor cd__ZN3ccc8CC0x14y2E = {  "_ZN3ccc8CC0x14y2E", // class name
  bases__ZN3ccc8CC0x14y2E, 2,
  &(vtc__ZN3ccc8CC0x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y3  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x14y33abcEv
  ~CC0x14y3(); // tgen
  CC0x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y3E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y33efgEv");}
void  ccc::CC0x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y33pqrEv");}
void  ccc::CC0x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y33abcEv");}
ccc::CC0x14y3 ::~CC0x14y3(){ note_dtor("_ZN3ccc8CC0x14y3E", this);} // tgen
ccc::CC0x14y3 ::CC0x14y3(){ note_ctor("_ZN3ccc8CC0x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y3E, buf);
    ::ccc::CC0x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y3E);
    dp->::ccc::CC0x14y3::~CC0x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y3E(Test__ZN3ccc8CC0x14y3E, "_ZN3ccc8CC0x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y3C1Ev();
extern void _ZN3ccc8CC0x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y3E[] = {
  NSPAIR(_ZN3ccc8CC0x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y3E[];
extern void _ZN3ccc8CC0x14y33abcEv();
extern void _ZN3ccc8CC0x14y33efgEv();
extern void _ZN3ccc8CC0x14y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y33pqrEv,_ZThn4_N3ccc8CC0x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y33pqrEv,_ZThn4_N3ccc8CC0x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y3E[];
Class_Descriptor cd__ZN3ccc8CC0x14y3E = {  "_ZN3ccc8CC0x14y3E", // class name
  bases__ZN3ccc8CC0x14y3E, 2,
  &(vtc__ZN3ccc8CC0x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y4  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC0x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y43efgEv
  ~CC0x14y4(); // tgen
  CC0x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y4E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y43pqrEv");}
void  ccc::CC0x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y43abcEv");}
void  ccc::CC0x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y43efgEv");}
ccc::CC0x14y4 ::~CC0x14y4(){ note_dtor("_ZN3ccc8CC0x14y4E", this);} // tgen
ccc::CC0x14y4 ::CC0x14y4(){ note_ctor("_ZN3ccc8CC0x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y4E, buf);
    ::ccc::CC0x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y4E);
    dp->::ccc::CC0x14y4::~CC0x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y4E(Test__ZN3ccc8CC0x14y4E, "_ZN3ccc8CC0x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y4C1Ev();
extern void _ZN3ccc8CC0x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y4E[] = {
  NSPAIR(_ZN3ccc8CC0x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y4E[];
extern void _ZN3ccc8CC0x14y43abcEv();
extern void _ZN3ccc8CC0x14y43efgEv();
extern void _ZN3ccc8CC0x14y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y43pqrEv,_ZThn4_N3ccc8CC0x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y43pqrEv,_ZThn4_N3ccc8CC0x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y4E[];
Class_Descriptor cd__ZN3ccc8CC0x14y4E = {  "_ZN3ccc8CC0x14y4E", // class name
  bases__ZN3ccc8CC0x14y4E, 2,
  &(vtc__ZN3ccc8CC0x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y5  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC0x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y53abcEv
  ~CC0x14y5(); // tgen
  CC0x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y5E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y53pqrEv");}
void  ccc::CC0x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y53efgEv");}
void  ccc::CC0x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y53abcEv");}
ccc::CC0x14y5 ::~CC0x14y5(){ note_dtor("_ZN3ccc8CC0x14y5E", this);} // tgen
ccc::CC0x14y5 ::CC0x14y5(){ note_ctor("_ZN3ccc8CC0x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y5E, buf);
    ::ccc::CC0x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y5E);
    dp->::ccc::CC0x14y5::~CC0x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y5E(Test__ZN3ccc8CC0x14y5E, "_ZN3ccc8CC0x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y5C1Ev();
extern void _ZN3ccc8CC0x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y5E[] = {
  NSPAIR(_ZN3ccc8CC0x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y5E[];
extern void _ZN3ccc8CC0x14y53abcEv();
extern void _ZN3ccc8CC0x14y53efgEv();
extern void _ZN3ccc8CC0x14y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y53pqrEv,_ZThn4_N3ccc8CC0x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y53pqrEv,_ZThn4_N3ccc8CC0x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y5E[];
Class_Descriptor cd__ZN3ccc8CC0x14y5E = {  "_ZN3ccc8CC0x14y5E", // class name
  bases__ZN3ccc8CC0x14y5E, 2,
  &(vtc__ZN3ccc8CC0x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y6  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x14y63efgEv
  ~CC0x14y6(); // tgen
  CC0x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y6E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y63abcEv");}
void  ccc::CC0x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y63efgEv");}
ccc::CC0x14y6 ::~CC0x14y6(){ note_dtor("_ZN3ccc8CC0x14y6E", this);} // tgen
ccc::CC0x14y6 ::CC0x14y6(){ note_ctor("_ZN3ccc8CC0x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y6E, buf);
    ::ccc::CC0x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y6E);
    dp->::ccc::CC0x14y6::~CC0x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y6E(Test__ZN3ccc8CC0x14y6E, "_ZN3ccc8CC0x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y6C1Ev();
extern void _ZN3ccc8CC0x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y6E[] = {
  NSPAIR(_ZN3ccc8CC0x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y6E[];
extern void _ZN3ccc8CC0x14y63abcEv();
extern void _ZN3ccc8CC0x14y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y6E[];
Class_Descriptor cd__ZN3ccc8CC0x14y6E = {  "_ZN3ccc8CC0x14y6E", // class name
  bases__ZN3ccc8CC0x14y6E, 2,
  &(vtc__ZN3ccc8CC0x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y7  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC0x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y73pqrEv
  ~CC0x14y7(); // tgen
  CC0x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y7E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y73abcEv");}
void  ccc::CC0x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y73pqrEv");}
ccc::CC0x14y7 ::~CC0x14y7(){ note_dtor("_ZN3ccc8CC0x14y7E", this);} // tgen
ccc::CC0x14y7 ::CC0x14y7(){ note_ctor("_ZN3ccc8CC0x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y7E, buf);
    ::ccc::CC0x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y7E);
    dp->::ccc::CC0x14y7::~CC0x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y7E(Test__ZN3ccc8CC0x14y7E, "_ZN3ccc8CC0x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y7C1Ev();
extern void _ZN3ccc8CC0x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y7E[] = {
  NSPAIR(_ZN3ccc8CC0x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y7E[];
extern void _ZN3ccc8CC0x14y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y73pqrEv,_ZThn4_N3ccc8CC0x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y73pqrEv,_ZThn4_N3ccc8CC0x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y7E[];
Class_Descriptor cd__ZN3ccc8CC0x14y7E = {  "_ZN3ccc8CC0x14y7E", // class name
  bases__ZN3ccc8CC0x14y7E, 2,
  &(vtc__ZN3ccc8CC0x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y8  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x14y83abcEv
  ~CC0x14y8(); // tgen
  CC0x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y8E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y83efgEv");}
void  ccc::CC0x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x14y83abcEv");}
ccc::CC0x14y8 ::~CC0x14y8(){ note_dtor("_ZN3ccc8CC0x14y8E", this);} // tgen
ccc::CC0x14y8 ::CC0x14y8(){ note_ctor("_ZN3ccc8CC0x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y8E, buf);
    ::ccc::CC0x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y8E);
    dp->::ccc::CC0x14y8::~CC0x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y8E(Test__ZN3ccc8CC0x14y8E, "_ZN3ccc8CC0x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y8C1Ev();
extern void _ZN3ccc8CC0x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y8E[] = {
  NSPAIR(_ZN3ccc8CC0x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y8E[];
extern void _ZN3ccc8CC0x14y83abcEv();
extern void _ZN3ccc8CC0x14y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y8E[];
Class_Descriptor cd__ZN3ccc8CC0x14y8E = {  "_ZN3ccc8CC0x14y8E", // class name
  bases__ZN3ccc8CC0x14y8E, 2,
  &(vtc__ZN3ccc8CC0x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y9  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC0x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x14y93pqrEv
  ~CC0x14y9(); // tgen
  CC0x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x14y9E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x14y93efgEv");}
void  ccc::CC0x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x14y93pqrEv");}
ccc::CC0x14y9 ::~CC0x14y9(){ note_dtor("_ZN3ccc8CC0x14y9E", this);} // tgen
ccc::CC0x14y9 ::CC0x14y9(){ note_ctor("_ZN3ccc8CC0x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC0x14y9E, buf);
    ::ccc::CC0x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC0x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x14y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC0x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x14y9E);
    dp->::ccc::CC0x14y9::~CC0x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x14y9E(Test__ZN3ccc8CC0x14y9E, "_ZN3ccc8CC0x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC0x14y9C1Ev();
extern void _ZN3ccc8CC0x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x14y9E[] = {
  NSPAIR(_ZN3ccc8CC0x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC0x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x14y93efgEv();
extern void _ZN3ccc8CC0x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC0x14y93pqrEv,_ZThn4_N3ccc8CC0x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC0x14y93pqrEv,_ZThn4_N3ccc8CC0x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x14y9E[];
Class_Descriptor cd__ZN3ccc8CC0x14y9E = {  "_ZN3ccc8CC0x14y9E", // class name
  bases__ZN3ccc8CC0x14y9E, 2,
  &(vtc__ZN3ccc8CC0x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC0x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y10  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x14y103abcEv
  ~CC0x14y10(); // tgen
  CC0x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y10E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y103pqrEv");}
void  ccc::CC0x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x14y103abcEv");}
ccc::CC0x14y10 ::~CC0x14y10(){ note_dtor("_ZN3ccc9CC0x14y10E", this);} // tgen
ccc::CC0x14y10 ::CC0x14y10(){ note_ctor("_ZN3ccc9CC0x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y10E, buf);
    ::ccc::CC0x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y10E);
    dp->::ccc::CC0x14y10::~CC0x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y10E(Test__ZN3ccc9CC0x14y10E, "_ZN3ccc9CC0x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y10C1Ev();
extern void _ZN3ccc9CC0x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y10E[] = {
  NSPAIR(_ZN3ccc9CC0x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y10E[];
extern void _ZN3ccc9CC0x14y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y103pqrEv,_ZThn4_N3ccc9CC0x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x14y103pqrEv,_ZThn4_N3ccc9CC0x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y10E[];
Class_Descriptor cd__ZN3ccc9CC0x14y10E = {  "_ZN3ccc9CC0x14y10E", // class name
  bases__ZN3ccc9CC0x14y10E, 2,
  &(vtc__ZN3ccc9CC0x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y11  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x14y113efgEv
  ~CC0x14y11(); // tgen
  CC0x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y11E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC0x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y113pqrEv");}
void  ccc::CC0x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x14y113efgEv");}
ccc::CC0x14y11 ::~CC0x14y11(){ note_dtor("_ZN3ccc9CC0x14y11E", this);} // tgen
ccc::CC0x14y11 ::CC0x14y11(){ note_ctor("_ZN3ccc9CC0x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y11E, buf);
    ::ccc::CC0x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y11E);
    dp->::ccc::CC0x14y11::~CC0x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y11E(Test__ZN3ccc9CC0x14y11E, "_ZN3ccc9CC0x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y11C1Ev();
extern void _ZN3ccc9CC0x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y11E[] = {
  NSPAIR(_ZN3ccc9CC0x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x14y113efgEv();
extern void _ZN3ccc9CC0x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y113pqrEv,_ZThn4_N3ccc9CC0x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x14y113pqrEv,_ZThn4_N3ccc9CC0x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y11E[];
Class_Descriptor cd__ZN3ccc9CC0x14y11E = {  "_ZN3ccc9CC0x14y11E", // class name
  bases__ZN3ccc9CC0x14y11E, 2,
  &(vtc__ZN3ccc9CC0x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y12  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC0x14y123abcEv
  ~CC0x14y12(); // tgen
  CC0x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y12E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x14y123abcEv");}
ccc::CC0x14y12 ::~CC0x14y12(){ note_dtor("_ZN3ccc9CC0x14y12E", this);} // tgen
ccc::CC0x14y12 ::CC0x14y12(){ note_ctor("_ZN3ccc9CC0x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y12E, buf);
    ::ccc::CC0x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y12E);
    dp->::ccc::CC0x14y12::~CC0x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y12E(Test__ZN3ccc9CC0x14y12E, "_ZN3ccc9CC0x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y12C1Ev();
extern void _ZN3ccc9CC0x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y12E[] = {
  NSPAIR(_ZN3ccc9CC0x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y12E[];
extern void _ZN3ccc9CC0x14y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y12E[];
Class_Descriptor cd__ZN3ccc9CC0x14y12E = {  "_ZN3ccc9CC0x14y12E", // class name
  bases__ZN3ccc9CC0x14y12E, 2,
  &(vtc__ZN3ccc9CC0x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y13  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC0x14y133efgEv
  ~CC0x14y13(); // tgen
  CC0x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y13E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC0x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x14y133efgEv");}
ccc::CC0x14y13 ::~CC0x14y13(){ note_dtor("_ZN3ccc9CC0x14y13E", this);} // tgen
ccc::CC0x14y13 ::CC0x14y13(){ note_ctor("_ZN3ccc9CC0x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y13E, buf);
    ::ccc::CC0x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y13E);
    dp->::ccc::CC0x14y13::~CC0x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y13E(Test__ZN3ccc9CC0x14y13E, "_ZN3ccc9CC0x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y13C1Ev();
extern void _ZN3ccc9CC0x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y13E[] = {
  NSPAIR(_ZN3ccc9CC0x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x14y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y13E[];
Class_Descriptor cd__ZN3ccc9CC0x14y13E = {  "_ZN3ccc9CC0x14y13E", // class name
  bases__ZN3ccc9CC0x14y13E, 2,
  &(vtc__ZN3ccc9CC0x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y14  : ::ccc::AA0 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC0x14y143pqrEv
  ~CC0x14y14(); // tgen
  CC0x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y14E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC0x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x14y143pqrEv");}
ccc::CC0x14y14 ::~CC0x14y14(){ note_dtor("_ZN3ccc9CC0x14y14E", this);} // tgen
ccc::CC0x14y14 ::CC0x14y14(){ note_ctor("_ZN3ccc9CC0x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y14E, buf);
    ::ccc::CC0x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y14E);
    dp->::ccc::CC0x14y14::~CC0x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y14E(Test__ZN3ccc9CC0x14y14E, "_ZN3ccc9CC0x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y14C1Ev();
extern void _ZN3ccc9CC0x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y14E[] = {
  NSPAIR(_ZN3ccc9CC0x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC0x14y143pqrEv,_ZThn4_N3ccc9CC0x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC0x14y143pqrEv,_ZThn4_N3ccc9CC0x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y14E[];
Class_Descriptor cd__ZN3ccc9CC0x14y14E = {  "_ZN3ccc9CC0x14y14E", // class name
  bases__ZN3ccc9CC0x14y14E, 2,
  &(vtc__ZN3ccc9CC0x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x14y15  : ::ccc::AA0 , ::ccc::BB14 {
  ~CC0x14y15(); // tgen
  CC0x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x14y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC0x14y15 ::~CC0x14y15(){ note_dtor("_ZN3ccc9CC0x14y15E", this);} // tgen
ccc::CC0x14y15 ::CC0x14y15(){ note_ctor("_ZN3ccc9CC0x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC0x14y15E, buf);
    ::ccc::CC0x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC0x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x14y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC0x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x14y15E);
    dp->::ccc::CC0x14y15::~CC0x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x14y15E(Test__ZN3ccc9CC0x14y15E, "_ZN3ccc9CC0x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC0x14y15C1Ev();
extern void _ZN3ccc9CC0x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x14y15E[] = {
  NSPAIR(_ZN3ccc9CC0x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC0x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x14y15E[];
Class_Descriptor cd__ZN3ccc9CC0x14y15E = {  "_ZN3ccc9CC0x14y15E", // class name
  bases__ZN3ccc9CC0x14y15E, 2,
  &(vtc__ZN3ccc9CC0x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC0x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y0  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y03pqrEv
  ~CC0x15y0(); // tgen
  CC0x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y0E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y03abcEv");}
void  ccc::CC0x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y03efgEv");}
void  ccc::CC0x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y03pqrEv");}
ccc::CC0x15y0 ::~CC0x15y0(){ note_dtor("_ZN3ccc8CC0x15y0E", this);} // tgen
ccc::CC0x15y0 ::CC0x15y0(){ note_ctor("_ZN3ccc8CC0x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y0E, buf);
    ::ccc::CC0x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y0E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y0E);
    dp->::ccc::CC0x15y0::~CC0x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y0E(Test__ZN3ccc8CC0x15y0E, "_ZN3ccc8CC0x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y0C1Ev();
extern void _ZN3ccc8CC0x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y0E[] = {
  NSPAIR(_ZN3ccc8CC0x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y0E[];
extern void _ZN3ccc8CC0x15y03abcEv();
extern void _ZN3ccc8CC0x15y03efgEv();
extern void _ZN3ccc8CC0x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y0E[];
Class_Descriptor cd__ZN3ccc8CC0x15y0E = {  "_ZN3ccc8CC0x15y0E", // class name
  bases__ZN3ccc8CC0x15y0E, 2,
  &(vtc__ZN3ccc8CC0x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y1  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x15y13efgEv
  ~CC0x15y1(); // tgen
  CC0x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y1E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y13abcEv");}
void  ccc::CC0x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y13pqrEv");}
void  ccc::CC0x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y13efgEv");}
ccc::CC0x15y1 ::~CC0x15y1(){ note_dtor("_ZN3ccc8CC0x15y1E", this);} // tgen
ccc::CC0x15y1 ::CC0x15y1(){ note_ctor("_ZN3ccc8CC0x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y1E, buf);
    ::ccc::CC0x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y1E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y1E);
    dp->::ccc::CC0x15y1::~CC0x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y1E(Test__ZN3ccc8CC0x15y1E, "_ZN3ccc8CC0x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y1C1Ev();
extern void _ZN3ccc8CC0x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y1E[] = {
  NSPAIR(_ZN3ccc8CC0x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y1E[];
extern void _ZN3ccc8CC0x15y13abcEv();
extern void _ZN3ccc8CC0x15y13efgEv();
extern void _ZN3ccc8CC0x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y1E[];
Class_Descriptor cd__ZN3ccc8CC0x15y1E = {  "_ZN3ccc8CC0x15y1E", // class name
  bases__ZN3ccc8CC0x15y1E, 2,
  &(vtc__ZN3ccc8CC0x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y2  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y23pqrEv
  ~CC0x15y2(); // tgen
  CC0x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y2E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y23efgEv");}
void  ccc::CC0x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y23abcEv");}
void  ccc::CC0x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y23pqrEv");}
ccc::CC0x15y2 ::~CC0x15y2(){ note_dtor("_ZN3ccc8CC0x15y2E", this);} // tgen
ccc::CC0x15y2 ::CC0x15y2(){ note_ctor("_ZN3ccc8CC0x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y2E, buf);
    ::ccc::CC0x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y2E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y2E);
    dp->::ccc::CC0x15y2::~CC0x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y2E(Test__ZN3ccc8CC0x15y2E, "_ZN3ccc8CC0x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y2C1Ev();
extern void _ZN3ccc8CC0x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y2E[] = {
  NSPAIR(_ZN3ccc8CC0x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y2E[];
extern void _ZN3ccc8CC0x15y23abcEv();
extern void _ZN3ccc8CC0x15y23efgEv();
extern void _ZN3ccc8CC0x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y2E[];
Class_Descriptor cd__ZN3ccc8CC0x15y2E = {  "_ZN3ccc8CC0x15y2E", // class name
  bases__ZN3ccc8CC0x15y2E, 2,
  &(vtc__ZN3ccc8CC0x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y3  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x15y33abcEv
  ~CC0x15y3(); // tgen
  CC0x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y3E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y33efgEv");}
void  ccc::CC0x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y33pqrEv");}
void  ccc::CC0x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y33abcEv");}
ccc::CC0x15y3 ::~CC0x15y3(){ note_dtor("_ZN3ccc8CC0x15y3E", this);} // tgen
ccc::CC0x15y3 ::CC0x15y3(){ note_ctor("_ZN3ccc8CC0x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y3E, buf);
    ::ccc::CC0x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y3E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y3E);
    dp->::ccc::CC0x15y3::~CC0x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y3E(Test__ZN3ccc8CC0x15y3E, "_ZN3ccc8CC0x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y3C1Ev();
extern void _ZN3ccc8CC0x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y3E[] = {
  NSPAIR(_ZN3ccc8CC0x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y3E[];
extern void _ZN3ccc8CC0x15y33abcEv();
extern void _ZN3ccc8CC0x15y33efgEv();
extern void _ZN3ccc8CC0x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y3E[];
Class_Descriptor cd__ZN3ccc8CC0x15y3E = {  "_ZN3ccc8CC0x15y3E", // class name
  bases__ZN3ccc8CC0x15y3E, 2,
  &(vtc__ZN3ccc8CC0x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y4  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC0x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC0x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y43efgEv
  ~CC0x15y4(); // tgen
  CC0x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y4E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y43pqrEv");}
void  ccc::CC0x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y43abcEv");}
void  ccc::CC0x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y43efgEv");}
ccc::CC0x15y4 ::~CC0x15y4(){ note_dtor("_ZN3ccc8CC0x15y4E", this);} // tgen
ccc::CC0x15y4 ::CC0x15y4(){ note_ctor("_ZN3ccc8CC0x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y4E, buf);
    ::ccc::CC0x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y4E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y4E);
    dp->::ccc::CC0x15y4::~CC0x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y4E(Test__ZN3ccc8CC0x15y4E, "_ZN3ccc8CC0x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y4C1Ev();
extern void _ZN3ccc8CC0x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y4E[] = {
  NSPAIR(_ZN3ccc8CC0x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y4E[];
extern void _ZN3ccc8CC0x15y43abcEv();
extern void _ZN3ccc8CC0x15y43efgEv();
extern void _ZN3ccc8CC0x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y4E[];
Class_Descriptor cd__ZN3ccc8CC0x15y4E = {  "_ZN3ccc8CC0x15y4E", // class name
  bases__ZN3ccc8CC0x15y4E, 2,
  &(vtc__ZN3ccc8CC0x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y5  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC0x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC0x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y53abcEv
  ~CC0x15y5(); // tgen
  CC0x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y5E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC0x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y53pqrEv");}
void  ccc::CC0x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y53efgEv");}
void  ccc::CC0x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y53abcEv");}
ccc::CC0x15y5 ::~CC0x15y5(){ note_dtor("_ZN3ccc8CC0x15y5E", this);} // tgen
ccc::CC0x15y5 ::CC0x15y5(){ note_ctor("_ZN3ccc8CC0x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y5E, buf);
    ::ccc::CC0x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y5E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y5E);
    dp->::ccc::CC0x15y5::~CC0x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y5E(Test__ZN3ccc8CC0x15y5E, "_ZN3ccc8CC0x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y5C1Ev();
extern void _ZN3ccc8CC0x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y5E[] = {
  NSPAIR(_ZN3ccc8CC0x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y5E[];
extern void _ZN3ccc8CC0x15y53abcEv();
extern void _ZN3ccc8CC0x15y53efgEv();
extern void _ZN3ccc8CC0x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y5E[];
Class_Descriptor cd__ZN3ccc8CC0x15y5E = {  "_ZN3ccc8CC0x15y5E", // class name
  bases__ZN3ccc8CC0x15y5E, 2,
  &(vtc__ZN3ccc8CC0x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y6  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC0x15y63efgEv
  ~CC0x15y6(); // tgen
  CC0x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y6E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y63abcEv");}
void  ccc::CC0x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y63efgEv");}
ccc::CC0x15y6 ::~CC0x15y6(){ note_dtor("_ZN3ccc8CC0x15y6E", this);} // tgen
ccc::CC0x15y6 ::CC0x15y6(){ note_ctor("_ZN3ccc8CC0x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y6E, buf);
    ::ccc::CC0x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y6E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y6E);
    dp->::ccc::CC0x15y6::~CC0x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y6E(Test__ZN3ccc8CC0x15y6E, "_ZN3ccc8CC0x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y6C1Ev();
extern void _ZN3ccc8CC0x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y6E[] = {
  NSPAIR(_ZN3ccc8CC0x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y6E[];
extern void _ZN3ccc8CC0x15y63abcEv();
extern void _ZN3ccc8CC0x15y63efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y6E[];
Class_Descriptor cd__ZN3ccc8CC0x15y6E = {  "_ZN3ccc8CC0x15y6E", // class name
  bases__ZN3ccc8CC0x15y6E, 2,
  &(vtc__ZN3ccc8CC0x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y7  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC0x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y73pqrEv
  ~CC0x15y7(); // tgen
  CC0x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y7E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y73abcEv");}
void  ccc::CC0x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y73pqrEv");}
ccc::CC0x15y7 ::~CC0x15y7(){ note_dtor("_ZN3ccc8CC0x15y7E", this);} // tgen
ccc::CC0x15y7 ::CC0x15y7(){ note_ctor("_ZN3ccc8CC0x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y7E, buf);
    ::ccc::CC0x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y7E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y7E);
    dp->::ccc::CC0x15y7::~CC0x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y7E(Test__ZN3ccc8CC0x15y7E, "_ZN3ccc8CC0x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y7C1Ev();
extern void _ZN3ccc8CC0x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y7E[] = {
  NSPAIR(_ZN3ccc8CC0x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y7E[];
extern void _ZN3ccc8CC0x15y73abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc8CC0x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y7E[];
Class_Descriptor cd__ZN3ccc8CC0x15y7E = {  "_ZN3ccc8CC0x15y7E", // class name
  bases__ZN3ccc8CC0x15y7E, 2,
  &(vtc__ZN3ccc8CC0x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y8  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC0x15y83abcEv
  ~CC0x15y8(); // tgen
  CC0x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y8E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y83efgEv");}
void  ccc::CC0x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC0x15y83abcEv");}
ccc::CC0x15y8 ::~CC0x15y8(){ note_dtor("_ZN3ccc8CC0x15y8E", this);} // tgen
ccc::CC0x15y8 ::CC0x15y8(){ note_ctor("_ZN3ccc8CC0x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y8E, buf);
    ::ccc::CC0x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y8E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y8E);
    dp->::ccc::CC0x15y8::~CC0x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y8E(Test__ZN3ccc8CC0x15y8E, "_ZN3ccc8CC0x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y8C1Ev();
extern void _ZN3ccc8CC0x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y8E[] = {
  NSPAIR(_ZN3ccc8CC0x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y8E[];
extern void _ZN3ccc8CC0x15y83abcEv();
extern void _ZN3ccc8CC0x15y83efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y8E[];
Class_Descriptor cd__ZN3ccc8CC0x15y8E = {  "_ZN3ccc8CC0x15y8E", // class name
  bases__ZN3ccc8CC0x15y8E, 2,
  &(vtc__ZN3ccc8CC0x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y9  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC0x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC0x15y93pqrEv
  ~CC0x15y9(); // tgen
  CC0x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC0x15y9E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC0x15y93efgEv");}
void  ccc::CC0x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC0x15y93pqrEv");}
ccc::CC0x15y9 ::~CC0x15y9(){ note_dtor("_ZN3ccc8CC0x15y9E", this);} // tgen
ccc::CC0x15y9 ::CC0x15y9(){ note_ctor("_ZN3ccc8CC0x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC0x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC0x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC0x15y9E, buf);
    ::ccc::CC0x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC0x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC0x15y9E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc8CC0x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC0x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC0x15y9E);
    dp->::ccc::CC0x15y9::~CC0x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC0x15y9E(Test__ZN3ccc8CC0x15y9E, "_ZN3ccc8CC0x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC0x15y9C1Ev();
extern void _ZN3ccc8CC0x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC0x15y9E[] = {
  NSPAIR(_ZN3ccc8CC0x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC0x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC0x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y9E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc8CC0x15y93efgEv();
extern void _ZN3ccc8CC0x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC0x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC0x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC0x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC0x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC0x15y9E[];
Class_Descriptor cd__ZN3ccc8CC0x15y9E = {  "_ZN3ccc8CC0x15y9E", // class name
  bases__ZN3ccc8CC0x15y9E, 2,
  &(vtc__ZN3ccc8CC0x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC0x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC0x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y10  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC0x15y103abcEv
  ~CC0x15y10(); // tgen
  CC0x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y10E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y103pqrEv");}
void  ccc::CC0x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x15y103abcEv");}
ccc::CC0x15y10 ::~CC0x15y10(){ note_dtor("_ZN3ccc9CC0x15y10E", this);} // tgen
ccc::CC0x15y10 ::CC0x15y10(){ note_ctor("_ZN3ccc9CC0x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y10E, buf);
    ::ccc::CC0x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y10E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y10E);
    dp->::ccc::CC0x15y10::~CC0x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y10E(Test__ZN3ccc9CC0x15y10E, "_ZN3ccc9CC0x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y10C1Ev();
extern void _ZN3ccc9CC0x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y10E[] = {
  NSPAIR(_ZN3ccc9CC0x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y10E[];
extern void _ZN3ccc9CC0x15y103abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y10E[];
Class_Descriptor cd__ZN3ccc9CC0x15y10E = {  "_ZN3ccc9CC0x15y10E", // class name
  bases__ZN3ccc9CC0x15y10E, 2,
  &(vtc__ZN3ccc9CC0x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y11  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC0x15y113efgEv
  ~CC0x15y11(); // tgen
  CC0x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y11E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC0x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y113pqrEv");}
void  ccc::CC0x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x15y113efgEv");}
ccc::CC0x15y11 ::~CC0x15y11(){ note_dtor("_ZN3ccc9CC0x15y11E", this);} // tgen
ccc::CC0x15y11 ::CC0x15y11(){ note_ctor("_ZN3ccc9CC0x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y11E, buf);
    ::ccc::CC0x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y11E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y11E);
    dp->::ccc::CC0x15y11::~CC0x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y11E(Test__ZN3ccc9CC0x15y11E, "_ZN3ccc9CC0x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y11C1Ev();
extern void _ZN3ccc9CC0x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y11E[] = {
  NSPAIR(_ZN3ccc9CC0x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y11E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x15y113efgEv();
extern void _ZN3ccc9CC0x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y11E[];
Class_Descriptor cd__ZN3ccc9CC0x15y11E = {  "_ZN3ccc9CC0x15y11E", // class name
  bases__ZN3ccc9CC0x15y11E, 2,
  &(vtc__ZN3ccc9CC0x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y12  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC0x15y123abcEv
  ~CC0x15y12(); // tgen
  CC0x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y12E) C1{ BC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC0x15y123abcEv");}
ccc::CC0x15y12 ::~CC0x15y12(){ note_dtor("_ZN3ccc9CC0x15y12E", this);} // tgen
ccc::CC0x15y12 ::CC0x15y12(){ note_ctor("_ZN3ccc9CC0x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y12E, buf);
    ::ccc::CC0x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y12E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y12E);
    dp->::ccc::CC0x15y12::~CC0x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y12E(Test__ZN3ccc9CC0x15y12E, "_ZN3ccc9CC0x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y12C1Ev();
extern void _ZN3ccc9CC0x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y12E[] = {
  NSPAIR(_ZN3ccc9CC0x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y12E[];
extern void _ZN3ccc9CC0x15y123abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y12E[];
Class_Descriptor cd__ZN3ccc9CC0x15y12E = {  "_ZN3ccc9CC0x15y12E", // class name
  bases__ZN3ccc9CC0x15y12E, 2,
  &(vtc__ZN3ccc9CC0x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y13  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC0x15y133efgEv
  ~CC0x15y13(); // tgen
  CC0x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y13E) C1{ BC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC0x15y133efgEv");}
ccc::CC0x15y13 ::~CC0x15y13(){ note_dtor("_ZN3ccc9CC0x15y13E", this);} // tgen
ccc::CC0x15y13 ::CC0x15y13(){ note_ctor("_ZN3ccc9CC0x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y13E, buf);
    ::ccc::CC0x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y13E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y13E);
    dp->::ccc::CC0x15y13::~CC0x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y13E(Test__ZN3ccc9CC0x15y13E, "_ZN3ccc9CC0x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y13C1Ev();
extern void _ZN3ccc9CC0x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y13E[] = {
  NSPAIR(_ZN3ccc9CC0x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y13E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc9CC0x15y133efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y13E[];
Class_Descriptor cd__ZN3ccc9CC0x15y13E = {  "_ZN3ccc9CC0x15y13E", // class name
  bases__ZN3ccc9CC0x15y13E, 2,
  &(vtc__ZN3ccc9CC0x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y14  : ::ccc::AA0 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC0x15y143pqrEv
  ~CC0x15y14(); // tgen
  CC0x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y14E) C1{ BC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC0x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC0x15y143pqrEv");}
ccc::CC0x15y14 ::~CC0x15y14(){ note_dtor("_ZN3ccc9CC0x15y14E", this);} // tgen
ccc::CC0x15y14 ::CC0x15y14(){ note_ctor("_ZN3ccc9CC0x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y14E, buf);
    ::ccc::CC0x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y14E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y14E);
    dp->::ccc::CC0x15y14::~CC0x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y14E(Test__ZN3ccc9CC0x15y14E, "_ZN3ccc9CC0x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y14C1Ev();
extern void _ZN3ccc9CC0x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y14E[] = {
  NSPAIR(_ZN3ccc9CC0x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y14E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc9CC0x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC0x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y14E[];
Class_Descriptor cd__ZN3ccc9CC0x15y14E = {  "_ZN3ccc9CC0x15y14E", // class name
  bases__ZN3ccc9CC0x15y14E, 2,
  &(vtc__ZN3ccc9CC0x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC0x15y15  : ::ccc::AA0 , ::ccc::BB15 {
  ~CC0x15y15(); // tgen
  CC0x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC0x15y15E) C1{ BC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC0x15y15 ::~CC0x15y15(){ note_dtor("_ZN3ccc9CC0x15y15E", this);} // tgen
ccc::CC0x15y15 ::CC0x15y15(){ note_ctor("_ZN3ccc9CC0x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC0x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC0x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC0x15y15E, buf);
    ::ccc::CC0x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC0x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC0x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC0x15y15E)");
    check_base_class_offset(lv, (::ccc::AA0*), 0, "_ZN3ccc9CC0x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC0x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC0x15y15E);
    dp->::ccc::CC0x15y15::~CC0x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC0x15y15E(Test__ZN3ccc9CC0x15y15E, "_ZN3ccc9CC0x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC0x15y15C1Ev();
extern void _ZN3ccc9CC0x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC0x15y15E[] = {
  NSPAIR(_ZN3ccc9CC0x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC0x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA0E;
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC0x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y15E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC0x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC0x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC0x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC0x15y15E[];
Class_Descriptor cd__ZN3ccc9CC0x15y15E = {  "_ZN3ccc9CC0x15y15E", // class name
  bases__ZN3ccc9CC0x15y15E, 2,
  &(vtc__ZN3ccc9CC0x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC0x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC0x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y0  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y03pqrEv
  ~CC1x0y0(); // tgen
  CC1x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y0E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y03abcEv");}
void  ccc::CC1x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y03efgEv");}
void  ccc::CC1x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y03pqrEv");}
ccc::CC1x0y0 ::~CC1x0y0(){ note_dtor("_ZN3ccc7CC1x0y0E", this);} // tgen
ccc::CC1x0y0 ::CC1x0y0(){ note_ctor("_ZN3ccc7CC1x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y0E, buf);
    ::ccc::CC1x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y0E);
    dp->::ccc::CC1x0y0::~CC1x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y0E(Test__ZN3ccc7CC1x0y0E, "_ZN3ccc7CC1x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y0C1Ev();
extern void _ZN3ccc7CC1x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y0E[] = {
  NSPAIR(_ZN3ccc7CC1x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y0E[];
extern void _ZN3ccc7CC1x0y03abcEv();
extern void _ZN3ccc7CC1x0y03pqrEv();
extern void _ZN3ccc7CC1x0y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03abcEv,_ZThn4_N3ccc7CC1x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03efgEv,_ZThn4_N3ccc7CC1x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y03pqrEv,_ZThn4_N3ccc7CC1x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y03abcEv,_ZThn4_N3ccc7CC1x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y03efgEv,_ZThn4_N3ccc7CC1x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y03pqrEv,_ZThn4_N3ccc7CC1x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y0E[];
Class_Descriptor cd__ZN3ccc7CC1x0y0E = {  "_ZN3ccc7CC1x0y0E", // class name
  bases__ZN3ccc7CC1x0y0E, 2,
  &(vtc__ZN3ccc7CC1x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y1  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x0y13efgEv
  ~CC1x0y1(); // tgen
  CC1x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y1E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y13abcEv");}
void  ccc::CC1x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y13pqrEv");}
void  ccc::CC1x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y13efgEv");}
ccc::CC1x0y1 ::~CC1x0y1(){ note_dtor("_ZN3ccc7CC1x0y1E", this);} // tgen
ccc::CC1x0y1 ::CC1x0y1(){ note_ctor("_ZN3ccc7CC1x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y1E, buf);
    ::ccc::CC1x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y1E);
    dp->::ccc::CC1x0y1::~CC1x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y1E(Test__ZN3ccc7CC1x0y1E, "_ZN3ccc7CC1x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y1C1Ev();
extern void _ZN3ccc7CC1x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y1E[] = {
  NSPAIR(_ZN3ccc7CC1x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y1E[];
extern void _ZN3ccc7CC1x0y13abcEv();
extern void _ZN3ccc7CC1x0y13pqrEv();
extern void _ZN3ccc7CC1x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13abcEv,_ZThn4_N3ccc7CC1x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13efgEv,_ZThn4_N3ccc7CC1x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y13pqrEv,_ZThn4_N3ccc7CC1x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y13abcEv,_ZThn4_N3ccc7CC1x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y13efgEv,_ZThn4_N3ccc7CC1x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y13pqrEv,_ZThn4_N3ccc7CC1x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y1E[];
Class_Descriptor cd__ZN3ccc7CC1x0y1E = {  "_ZN3ccc7CC1x0y1E", // class name
  bases__ZN3ccc7CC1x0y1E, 2,
  &(vtc__ZN3ccc7CC1x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y2  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y23pqrEv
  ~CC1x0y2(); // tgen
  CC1x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y2E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y23efgEv");}
void  ccc::CC1x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y23abcEv");}
void  ccc::CC1x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y23pqrEv");}
ccc::CC1x0y2 ::~CC1x0y2(){ note_dtor("_ZN3ccc7CC1x0y2E", this);} // tgen
ccc::CC1x0y2 ::CC1x0y2(){ note_ctor("_ZN3ccc7CC1x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y2E, buf);
    ::ccc::CC1x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y2E);
    dp->::ccc::CC1x0y2::~CC1x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y2E(Test__ZN3ccc7CC1x0y2E, "_ZN3ccc7CC1x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y2C1Ev();
extern void _ZN3ccc7CC1x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y2E[] = {
  NSPAIR(_ZN3ccc7CC1x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y2E[];
extern void _ZN3ccc7CC1x0y23abcEv();
extern void _ZN3ccc7CC1x0y23pqrEv();
extern void _ZN3ccc7CC1x0y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23abcEv,_ZThn4_N3ccc7CC1x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23efgEv,_ZThn4_N3ccc7CC1x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y23pqrEv,_ZThn4_N3ccc7CC1x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y23abcEv,_ZThn4_N3ccc7CC1x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y23efgEv,_ZThn4_N3ccc7CC1x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y23pqrEv,_ZThn4_N3ccc7CC1x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y2E[];
Class_Descriptor cd__ZN3ccc7CC1x0y2E = {  "_ZN3ccc7CC1x0y2E", // class name
  bases__ZN3ccc7CC1x0y2E, 2,
  &(vtc__ZN3ccc7CC1x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y3  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x0y33abcEv
  ~CC1x0y3(); // tgen
  CC1x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y3E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y33efgEv");}
void  ccc::CC1x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y33pqrEv");}
void  ccc::CC1x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y33abcEv");}
ccc::CC1x0y3 ::~CC1x0y3(){ note_dtor("_ZN3ccc7CC1x0y3E", this);} // tgen
ccc::CC1x0y3 ::CC1x0y3(){ note_ctor("_ZN3ccc7CC1x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y3E, buf);
    ::ccc::CC1x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y3E);
    dp->::ccc::CC1x0y3::~CC1x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y3E(Test__ZN3ccc7CC1x0y3E, "_ZN3ccc7CC1x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y3C1Ev();
extern void _ZN3ccc7CC1x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y3E[] = {
  NSPAIR(_ZN3ccc7CC1x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y3E[];
extern void _ZN3ccc7CC1x0y33abcEv();
extern void _ZN3ccc7CC1x0y33pqrEv();
extern void _ZN3ccc7CC1x0y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33abcEv,_ZThn4_N3ccc7CC1x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33efgEv,_ZThn4_N3ccc7CC1x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y33pqrEv,_ZThn4_N3ccc7CC1x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y33abcEv,_ZThn4_N3ccc7CC1x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y33efgEv,_ZThn4_N3ccc7CC1x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y33pqrEv,_ZThn4_N3ccc7CC1x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y3E[];
Class_Descriptor cd__ZN3ccc7CC1x0y3E = {  "_ZN3ccc7CC1x0y3E", // class name
  bases__ZN3ccc7CC1x0y3E, 2,
  &(vtc__ZN3ccc7CC1x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y4  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC1x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y43efgEv
  ~CC1x0y4(); // tgen
  CC1x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y4E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y43pqrEv");}
void  ccc::CC1x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y43abcEv");}
void  ccc::CC1x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y43efgEv");}
ccc::CC1x0y4 ::~CC1x0y4(){ note_dtor("_ZN3ccc7CC1x0y4E", this);} // tgen
ccc::CC1x0y4 ::CC1x0y4(){ note_ctor("_ZN3ccc7CC1x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y4E, buf);
    ::ccc::CC1x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y4E);
    dp->::ccc::CC1x0y4::~CC1x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y4E(Test__ZN3ccc7CC1x0y4E, "_ZN3ccc7CC1x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y4C1Ev();
extern void _ZN3ccc7CC1x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y4E[] = {
  NSPAIR(_ZN3ccc7CC1x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y4E[];
extern void _ZN3ccc7CC1x0y43abcEv();
extern void _ZN3ccc7CC1x0y43pqrEv();
extern void _ZN3ccc7CC1x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43abcEv,_ZThn4_N3ccc7CC1x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43efgEv,_ZThn4_N3ccc7CC1x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y43pqrEv,_ZThn4_N3ccc7CC1x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y43abcEv,_ZThn4_N3ccc7CC1x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y43efgEv,_ZThn4_N3ccc7CC1x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y43pqrEv,_ZThn4_N3ccc7CC1x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y4E[];
Class_Descriptor cd__ZN3ccc7CC1x0y4E = {  "_ZN3ccc7CC1x0y4E", // class name
  bases__ZN3ccc7CC1x0y4E, 2,
  &(vtc__ZN3ccc7CC1x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y5  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC1x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y53abcEv
  ~CC1x0y5(); // tgen
  CC1x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y5E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y53pqrEv");}
void  ccc::CC1x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y53efgEv");}
void  ccc::CC1x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y53abcEv");}
ccc::CC1x0y5 ::~CC1x0y5(){ note_dtor("_ZN3ccc7CC1x0y5E", this);} // tgen
ccc::CC1x0y5 ::CC1x0y5(){ note_ctor("_ZN3ccc7CC1x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y5E, buf);
    ::ccc::CC1x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y5E);
    dp->::ccc::CC1x0y5::~CC1x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y5E(Test__ZN3ccc7CC1x0y5E, "_ZN3ccc7CC1x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y5C1Ev();
extern void _ZN3ccc7CC1x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y5E[] = {
  NSPAIR(_ZN3ccc7CC1x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y5E[];
extern void _ZN3ccc7CC1x0y53abcEv();
extern void _ZN3ccc7CC1x0y53pqrEv();
extern void _ZN3ccc7CC1x0y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53abcEv,_ZThn4_N3ccc7CC1x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53efgEv,_ZThn4_N3ccc7CC1x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y53pqrEv,_ZThn4_N3ccc7CC1x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y53abcEv,_ZThn4_N3ccc7CC1x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y53efgEv,_ZThn4_N3ccc7CC1x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y53pqrEv,_ZThn4_N3ccc7CC1x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y5E[];
Class_Descriptor cd__ZN3ccc7CC1x0y5E = {  "_ZN3ccc7CC1x0y5E", // class name
  bases__ZN3ccc7CC1x0y5E, 2,
  &(vtc__ZN3ccc7CC1x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y6  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x0y63efgEv
  ~CC1x0y6(); // tgen
  CC1x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y6E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y63abcEv");}
void  ccc::CC1x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y63efgEv");}
ccc::CC1x0y6 ::~CC1x0y6(){ note_dtor("_ZN3ccc7CC1x0y6E", this);} // tgen
ccc::CC1x0y6 ::CC1x0y6(){ note_ctor("_ZN3ccc7CC1x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y6E, buf);
    ::ccc::CC1x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y6E);
    dp->::ccc::CC1x0y6::~CC1x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y6E(Test__ZN3ccc7CC1x0y6E, "_ZN3ccc7CC1x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y6C1Ev();
extern void _ZN3ccc7CC1x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y6E[] = {
  NSPAIR(_ZN3ccc7CC1x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y6E[];
extern void _ZN3ccc7CC1x0y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y63abcEv,_ZThn4_N3ccc7CC1x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y63efgEv,_ZThn4_N3ccc7CC1x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y63abcEv,_ZThn4_N3ccc7CC1x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y63efgEv,_ZThn4_N3ccc7CC1x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y6E[];
Class_Descriptor cd__ZN3ccc7CC1x0y6E = {  "_ZN3ccc7CC1x0y6E", // class name
  bases__ZN3ccc7CC1x0y6E, 2,
  &(vtc__ZN3ccc7CC1x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y7  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC1x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y73pqrEv
  ~CC1x0y7(); // tgen
  CC1x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y7E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y73abcEv");}
void  ccc::CC1x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y73pqrEv");}
ccc::CC1x0y7 ::~CC1x0y7(){ note_dtor("_ZN3ccc7CC1x0y7E", this);} // tgen
ccc::CC1x0y7 ::CC1x0y7(){ note_ctor("_ZN3ccc7CC1x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y7E, buf);
    ::ccc::CC1x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y7E);
    dp->::ccc::CC1x0y7::~CC1x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y7E(Test__ZN3ccc7CC1x0y7E, "_ZN3ccc7CC1x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y7C1Ev();
extern void _ZN3ccc7CC1x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y7E[] = {
  NSPAIR(_ZN3ccc7CC1x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y7E[];
extern void _ZN3ccc7CC1x0y73abcEv();
extern void _ZN3ccc7CC1x0y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y73abcEv,_ZThn4_N3ccc7CC1x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y73pqrEv,_ZThn4_N3ccc7CC1x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y73abcEv,_ZThn4_N3ccc7CC1x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y73pqrEv,_ZThn4_N3ccc7CC1x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y7E[];
Class_Descriptor cd__ZN3ccc7CC1x0y7E = {  "_ZN3ccc7CC1x0y7E", // class name
  bases__ZN3ccc7CC1x0y7E, 2,
  &(vtc__ZN3ccc7CC1x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y8  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x0y83abcEv
  ~CC1x0y8(); // tgen
  CC1x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y8E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y83efgEv");}
void  ccc::CC1x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x0y83abcEv");}
ccc::CC1x0y8 ::~CC1x0y8(){ note_dtor("_ZN3ccc7CC1x0y8E", this);} // tgen
ccc::CC1x0y8 ::CC1x0y8(){ note_ctor("_ZN3ccc7CC1x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y8E, buf);
    ::ccc::CC1x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y8E);
    dp->::ccc::CC1x0y8::~CC1x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y8E(Test__ZN3ccc7CC1x0y8E, "_ZN3ccc7CC1x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y8C1Ev();
extern void _ZN3ccc7CC1x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y8E[] = {
  NSPAIR(_ZN3ccc7CC1x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y8E[];
extern void _ZN3ccc7CC1x0y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y83abcEv,_ZThn4_N3ccc7CC1x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y83efgEv,_ZThn4_N3ccc7CC1x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y83abcEv,_ZThn4_N3ccc7CC1x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y83efgEv,_ZThn4_N3ccc7CC1x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y8E[];
Class_Descriptor cd__ZN3ccc7CC1x0y8E = {  "_ZN3ccc7CC1x0y8E", // class name
  bases__ZN3ccc7CC1x0y8E, 2,
  &(vtc__ZN3ccc7CC1x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y9  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC1x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x0y93pqrEv
  ~CC1x0y9(); // tgen
  CC1x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x0y9E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x0y93efgEv");}
void  ccc::CC1x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x0y93pqrEv");}
ccc::CC1x0y9 ::~CC1x0y9(){ note_dtor("_ZN3ccc7CC1x0y9E", this);} // tgen
ccc::CC1x0y9 ::CC1x0y9(){ note_ctor("_ZN3ccc7CC1x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x0y9E, buf);
    ::ccc::CC1x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x0y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC1x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x0y9E);
    dp->::ccc::CC1x0y9::~CC1x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x0y9E(Test__ZN3ccc7CC1x0y9E, "_ZN3ccc7CC1x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x0y9C1Ev();
extern void _ZN3ccc7CC1x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x0y9E[] = {
  NSPAIR(_ZN3ccc7CC1x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC1x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x0y93pqrEv();
extern void _ZN3ccc7CC1x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y93efgEv,_ZThn4_N3ccc7CC1x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x0y93pqrEv,_ZThn4_N3ccc7CC1x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y93efgEv,_ZThn4_N3ccc7CC1x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x0y93pqrEv,_ZThn4_N3ccc7CC1x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x0y9E[];
Class_Descriptor cd__ZN3ccc7CC1x0y9E = {  "_ZN3ccc7CC1x0y9E", // class name
  bases__ZN3ccc7CC1x0y9E, 2,
  &(vtc__ZN3ccc7CC1x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y10  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x0y103abcEv
  ~CC1x0y10(); // tgen
  CC1x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y10E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y103pqrEv");}
void  ccc::CC1x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x0y103abcEv");}
ccc::CC1x0y10 ::~CC1x0y10(){ note_dtor("_ZN3ccc8CC1x0y10E", this);} // tgen
ccc::CC1x0y10 ::CC1x0y10(){ note_ctor("_ZN3ccc8CC1x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y10E, buf);
    ::ccc::CC1x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y10E);
    dp->::ccc::CC1x0y10::~CC1x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y10E(Test__ZN3ccc8CC1x0y10E, "_ZN3ccc8CC1x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y10C1Ev();
extern void _ZN3ccc8CC1x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y10E[] = {
  NSPAIR(_ZN3ccc8CC1x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y10E[];
extern void _ZN3ccc8CC1x0y103abcEv();
extern void _ZN3ccc8CC1x0y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y103abcEv,_ZThn4_N3ccc8CC1x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y103pqrEv,_ZThn4_N3ccc8CC1x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y103abcEv,_ZThn4_N3ccc8CC1x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y103pqrEv,_ZThn4_N3ccc8CC1x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y10E[];
Class_Descriptor cd__ZN3ccc8CC1x0y10E = {  "_ZN3ccc8CC1x0y10E", // class name
  bases__ZN3ccc8CC1x0y10E, 2,
  &(vtc__ZN3ccc8CC1x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y11  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x0y113efgEv
  ~CC1x0y11(); // tgen
  CC1x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y11E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y113pqrEv");}
void  ccc::CC1x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x0y113efgEv");}
ccc::CC1x0y11 ::~CC1x0y11(){ note_dtor("_ZN3ccc8CC1x0y11E", this);} // tgen
ccc::CC1x0y11 ::CC1x0y11(){ note_ctor("_ZN3ccc8CC1x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y11E, buf);
    ::ccc::CC1x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y11E);
    dp->::ccc::CC1x0y11::~CC1x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y11E(Test__ZN3ccc8CC1x0y11E, "_ZN3ccc8CC1x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y11C1Ev();
extern void _ZN3ccc8CC1x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y11E[] = {
  NSPAIR(_ZN3ccc8CC1x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x0y113pqrEv();
extern void _ZN3ccc8CC1x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y113efgEv,_ZThn4_N3ccc8CC1x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y113pqrEv,_ZThn4_N3ccc8CC1x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y113efgEv,_ZThn4_N3ccc8CC1x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y113pqrEv,_ZThn4_N3ccc8CC1x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y11E[];
Class_Descriptor cd__ZN3ccc8CC1x0y11E = {  "_ZN3ccc8CC1x0y11E", // class name
  bases__ZN3ccc8CC1x0y11E, 2,
  &(vtc__ZN3ccc8CC1x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y12  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC1x0y123abcEv
  ~CC1x0y12(); // tgen
  CC1x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x0y123abcEv");}
ccc::CC1x0y12 ::~CC1x0y12(){ note_dtor("_ZN3ccc8CC1x0y12E", this);} // tgen
ccc::CC1x0y12 ::CC1x0y12(){ note_ctor("_ZN3ccc8CC1x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y12E, buf);
    ::ccc::CC1x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y12E);
    dp->::ccc::CC1x0y12::~CC1x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y12E(Test__ZN3ccc8CC1x0y12E, "_ZN3ccc8CC1x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y12C1Ev();
extern void _ZN3ccc8CC1x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y12E[] = {
  NSPAIR(_ZN3ccc8CC1x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y12E[];
extern void _ZN3ccc8CC1x0y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y123abcEv,_ZThn4_N3ccc8CC1x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y123abcEv,_ZThn4_N3ccc8CC1x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y12E[];
Class_Descriptor cd__ZN3ccc8CC1x0y12E = {  "_ZN3ccc8CC1x0y12E", // class name
  bases__ZN3ccc8CC1x0y12E, 2,
  &(vtc__ZN3ccc8CC1x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y13  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC1x0y133efgEv
  ~CC1x0y13(); // tgen
  CC1x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x0y133efgEv");}
ccc::CC1x0y13 ::~CC1x0y13(){ note_dtor("_ZN3ccc8CC1x0y13E", this);} // tgen
ccc::CC1x0y13 ::CC1x0y13(){ note_ctor("_ZN3ccc8CC1x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y13E, buf);
    ::ccc::CC1x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y13E);
    dp->::ccc::CC1x0y13::~CC1x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y13E(Test__ZN3ccc8CC1x0y13E, "_ZN3ccc8CC1x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y13C1Ev();
extern void _ZN3ccc8CC1x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y13E[] = {
  NSPAIR(_ZN3ccc8CC1x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y133efgEv,_ZThn4_N3ccc8CC1x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y133efgEv,_ZThn4_N3ccc8CC1x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y13E[];
Class_Descriptor cd__ZN3ccc8CC1x0y13E = {  "_ZN3ccc8CC1x0y13E", // class name
  bases__ZN3ccc8CC1x0y13E, 2,
  &(vtc__ZN3ccc8CC1x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y14  : ::ccc::AA1 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC1x0y143pqrEv
  ~CC1x0y14(); // tgen
  CC1x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x0y143pqrEv");}
ccc::CC1x0y14 ::~CC1x0y14(){ note_dtor("_ZN3ccc8CC1x0y14E", this);} // tgen
ccc::CC1x0y14 ::CC1x0y14(){ note_ctor("_ZN3ccc8CC1x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y14E, buf);
    ::ccc::CC1x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y14E);
    dp->::ccc::CC1x0y14::~CC1x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y14E(Test__ZN3ccc8CC1x0y14E, "_ZN3ccc8CC1x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y14C1Ev();
extern void _ZN3ccc8CC1x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y14E[] = {
  NSPAIR(_ZN3ccc8CC1x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x0y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x0y143pqrEv,_ZThn4_N3ccc8CC1x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x0y143pqrEv,_ZThn4_N3ccc8CC1x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y14E[];
Class_Descriptor cd__ZN3ccc8CC1x0y14E = {  "_ZN3ccc8CC1x0y14E", // class name
  bases__ZN3ccc8CC1x0y14E, 2,
  &(vtc__ZN3ccc8CC1x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x0y15  : ::ccc::AA1 , ::ccc::BB0 {
  ~CC1x0y15(); // tgen
  CC1x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x0y15 ::~CC1x0y15(){ note_dtor("_ZN3ccc8CC1x0y15E", this);} // tgen
ccc::CC1x0y15 ::CC1x0y15(){ note_ctor("_ZN3ccc8CC1x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x0y15E, buf);
    ::ccc::CC1x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x0y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC1x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x0y15E);
    dp->::ccc::CC1x0y15::~CC1x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x0y15E(Test__ZN3ccc8CC1x0y15E, "_ZN3ccc8CC1x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x0y15C1Ev();
extern void _ZN3ccc8CC1x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x0y15E[] = {
  NSPAIR(_ZN3ccc8CC1x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC1x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x0y15E[];
Class_Descriptor cd__ZN3ccc8CC1x0y15E = {  "_ZN3ccc8CC1x0y15E", // class name
  bases__ZN3ccc8CC1x0y15E, 2,
  &(vtc__ZN3ccc8CC1x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y0  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y03pqrEv
  ~CC1x1y0(); // tgen
  CC1x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y0E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y03abcEv");}
void  ccc::CC1x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y03efgEv");}
void  ccc::CC1x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y03pqrEv");}
ccc::CC1x1y0 ::~CC1x1y0(){ note_dtor("_ZN3ccc7CC1x1y0E", this);} // tgen
ccc::CC1x1y0 ::CC1x1y0(){ note_ctor("_ZN3ccc7CC1x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y0E, buf);
    ::ccc::CC1x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y0E);
    dp->::ccc::CC1x1y0::~CC1x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y0E(Test__ZN3ccc7CC1x1y0E, "_ZN3ccc7CC1x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y0C1Ev();
extern void _ZN3ccc7CC1x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y0E[] = {
  NSPAIR(_ZN3ccc7CC1x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y0E[];
extern void _ZN3ccc7CC1x1y03abcEv();
extern void _ZN3ccc7CC1x1y03pqrEv();
extern void _ZN3ccc7CC1x1y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03abcEv,_ZThn4_N3ccc7CC1x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03pqrEv,_ZThn4_N3ccc7CC1x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y03efgEv,_ZThn4_N3ccc7CC1x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y03abcEv,_ZThn4_N3ccc7CC1x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y03pqrEv,_ZThn4_N3ccc7CC1x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y03efgEv,_ZThn4_N3ccc7CC1x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y0E[];
Class_Descriptor cd__ZN3ccc7CC1x1y0E = {  "_ZN3ccc7CC1x1y0E", // class name
  bases__ZN3ccc7CC1x1y0E, 2,
  &(vtc__ZN3ccc7CC1x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y1  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x1y13efgEv
  ~CC1x1y1(); // tgen
  CC1x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y1E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y13abcEv");}
void  ccc::CC1x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y13pqrEv");}
void  ccc::CC1x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y13efgEv");}
ccc::CC1x1y1 ::~CC1x1y1(){ note_dtor("_ZN3ccc7CC1x1y1E", this);} // tgen
ccc::CC1x1y1 ::CC1x1y1(){ note_ctor("_ZN3ccc7CC1x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y1E, buf);
    ::ccc::CC1x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y1E);
    dp->::ccc::CC1x1y1::~CC1x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y1E(Test__ZN3ccc7CC1x1y1E, "_ZN3ccc7CC1x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y1C1Ev();
extern void _ZN3ccc7CC1x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y1E[] = {
  NSPAIR(_ZN3ccc7CC1x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y1E[];
extern void _ZN3ccc7CC1x1y13abcEv();
extern void _ZN3ccc7CC1x1y13pqrEv();
extern void _ZN3ccc7CC1x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13abcEv,_ZThn4_N3ccc7CC1x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13pqrEv,_ZThn4_N3ccc7CC1x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y13efgEv,_ZThn4_N3ccc7CC1x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y13abcEv,_ZThn4_N3ccc7CC1x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y13pqrEv,_ZThn4_N3ccc7CC1x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y13efgEv,_ZThn4_N3ccc7CC1x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y1E[];
Class_Descriptor cd__ZN3ccc7CC1x1y1E = {  "_ZN3ccc7CC1x1y1E", // class name
  bases__ZN3ccc7CC1x1y1E, 2,
  &(vtc__ZN3ccc7CC1x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y2  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y23pqrEv
  ~CC1x1y2(); // tgen
  CC1x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y2E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y23efgEv");}
void  ccc::CC1x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y23abcEv");}
void  ccc::CC1x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y23pqrEv");}
ccc::CC1x1y2 ::~CC1x1y2(){ note_dtor("_ZN3ccc7CC1x1y2E", this);} // tgen
ccc::CC1x1y2 ::CC1x1y2(){ note_ctor("_ZN3ccc7CC1x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y2E, buf);
    ::ccc::CC1x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y2E);
    dp->::ccc::CC1x1y2::~CC1x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y2E(Test__ZN3ccc7CC1x1y2E, "_ZN3ccc7CC1x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y2C1Ev();
extern void _ZN3ccc7CC1x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y2E[] = {
  NSPAIR(_ZN3ccc7CC1x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y2E[];
extern void _ZN3ccc7CC1x1y23abcEv();
extern void _ZN3ccc7CC1x1y23pqrEv();
extern void _ZN3ccc7CC1x1y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23abcEv,_ZThn4_N3ccc7CC1x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23pqrEv,_ZThn4_N3ccc7CC1x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y23efgEv,_ZThn4_N3ccc7CC1x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y23abcEv,_ZThn4_N3ccc7CC1x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y23pqrEv,_ZThn4_N3ccc7CC1x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y23efgEv,_ZThn4_N3ccc7CC1x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y2E[];
Class_Descriptor cd__ZN3ccc7CC1x1y2E = {  "_ZN3ccc7CC1x1y2E", // class name
  bases__ZN3ccc7CC1x1y2E, 2,
  &(vtc__ZN3ccc7CC1x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y3  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x1y33abcEv
  ~CC1x1y3(); // tgen
  CC1x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y3E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y33efgEv");}
void  ccc::CC1x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y33pqrEv");}
void  ccc::CC1x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y33abcEv");}
ccc::CC1x1y3 ::~CC1x1y3(){ note_dtor("_ZN3ccc7CC1x1y3E", this);} // tgen
ccc::CC1x1y3 ::CC1x1y3(){ note_ctor("_ZN3ccc7CC1x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y3E, buf);
    ::ccc::CC1x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y3E);
    dp->::ccc::CC1x1y3::~CC1x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y3E(Test__ZN3ccc7CC1x1y3E, "_ZN3ccc7CC1x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y3C1Ev();
extern void _ZN3ccc7CC1x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y3E[] = {
  NSPAIR(_ZN3ccc7CC1x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y3E[];
extern void _ZN3ccc7CC1x1y33abcEv();
extern void _ZN3ccc7CC1x1y33pqrEv();
extern void _ZN3ccc7CC1x1y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33abcEv,_ZThn4_N3ccc7CC1x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33pqrEv,_ZThn4_N3ccc7CC1x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y33efgEv,_ZThn4_N3ccc7CC1x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y33abcEv,_ZThn4_N3ccc7CC1x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y33pqrEv,_ZThn4_N3ccc7CC1x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y33efgEv,_ZThn4_N3ccc7CC1x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y3E[];
Class_Descriptor cd__ZN3ccc7CC1x1y3E = {  "_ZN3ccc7CC1x1y3E", // class name
  bases__ZN3ccc7CC1x1y3E, 2,
  &(vtc__ZN3ccc7CC1x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y4  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC1x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y43efgEv
  ~CC1x1y4(); // tgen
  CC1x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y4E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y43pqrEv");}
void  ccc::CC1x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y43abcEv");}
void  ccc::CC1x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y43efgEv");}
ccc::CC1x1y4 ::~CC1x1y4(){ note_dtor("_ZN3ccc7CC1x1y4E", this);} // tgen
ccc::CC1x1y4 ::CC1x1y4(){ note_ctor("_ZN3ccc7CC1x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y4E, buf);
    ::ccc::CC1x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y4E);
    dp->::ccc::CC1x1y4::~CC1x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y4E(Test__ZN3ccc7CC1x1y4E, "_ZN3ccc7CC1x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y4C1Ev();
extern void _ZN3ccc7CC1x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y4E[] = {
  NSPAIR(_ZN3ccc7CC1x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y4E[];
extern void _ZN3ccc7CC1x1y43abcEv();
extern void _ZN3ccc7CC1x1y43pqrEv();
extern void _ZN3ccc7CC1x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43abcEv,_ZThn4_N3ccc7CC1x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43pqrEv,_ZThn4_N3ccc7CC1x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y43efgEv,_ZThn4_N3ccc7CC1x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y43abcEv,_ZThn4_N3ccc7CC1x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y43pqrEv,_ZThn4_N3ccc7CC1x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y43efgEv,_ZThn4_N3ccc7CC1x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y4E[];
Class_Descriptor cd__ZN3ccc7CC1x1y4E = {  "_ZN3ccc7CC1x1y4E", // class name
  bases__ZN3ccc7CC1x1y4E, 2,
  &(vtc__ZN3ccc7CC1x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y5  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC1x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y53abcEv
  ~CC1x1y5(); // tgen
  CC1x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y5E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y53pqrEv");}
void  ccc::CC1x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y53efgEv");}
void  ccc::CC1x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y53abcEv");}
ccc::CC1x1y5 ::~CC1x1y5(){ note_dtor("_ZN3ccc7CC1x1y5E", this);} // tgen
ccc::CC1x1y5 ::CC1x1y5(){ note_ctor("_ZN3ccc7CC1x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y5E, buf);
    ::ccc::CC1x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y5E);
    dp->::ccc::CC1x1y5::~CC1x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y5E(Test__ZN3ccc7CC1x1y5E, "_ZN3ccc7CC1x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y5C1Ev();
extern void _ZN3ccc7CC1x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y5E[] = {
  NSPAIR(_ZN3ccc7CC1x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y5E[];
extern void _ZN3ccc7CC1x1y53abcEv();
extern void _ZN3ccc7CC1x1y53pqrEv();
extern void _ZN3ccc7CC1x1y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53abcEv,_ZThn4_N3ccc7CC1x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53pqrEv,_ZThn4_N3ccc7CC1x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y53efgEv,_ZThn4_N3ccc7CC1x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y53abcEv,_ZThn4_N3ccc7CC1x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y53pqrEv,_ZThn4_N3ccc7CC1x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y53efgEv,_ZThn4_N3ccc7CC1x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y5E[];
Class_Descriptor cd__ZN3ccc7CC1x1y5E = {  "_ZN3ccc7CC1x1y5E", // class name
  bases__ZN3ccc7CC1x1y5E, 2,
  &(vtc__ZN3ccc7CC1x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y6  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x1y63efgEv
  ~CC1x1y6(); // tgen
  CC1x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y6E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y63abcEv");}
void  ccc::CC1x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y63efgEv");}
ccc::CC1x1y6 ::~CC1x1y6(){ note_dtor("_ZN3ccc7CC1x1y6E", this);} // tgen
ccc::CC1x1y6 ::CC1x1y6(){ note_ctor("_ZN3ccc7CC1x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y6E, buf);
    ::ccc::CC1x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y6E);
    dp->::ccc::CC1x1y6::~CC1x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y6E(Test__ZN3ccc7CC1x1y6E, "_ZN3ccc7CC1x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y6C1Ev();
extern void _ZN3ccc7CC1x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y6E[] = {
  NSPAIR(_ZN3ccc7CC1x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y6E[];
extern void _ZN3ccc7CC1x1y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y63abcEv,_ZThn4_N3ccc7CC1x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y63efgEv,_ZThn4_N3ccc7CC1x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y63abcEv,_ZThn4_N3ccc7CC1x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y63efgEv,_ZThn4_N3ccc7CC1x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y6E[];
Class_Descriptor cd__ZN3ccc7CC1x1y6E = {  "_ZN3ccc7CC1x1y6E", // class name
  bases__ZN3ccc7CC1x1y6E, 2,
  &(vtc__ZN3ccc7CC1x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y7  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC1x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y73pqrEv
  ~CC1x1y7(); // tgen
  CC1x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y7E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y73abcEv");}
void  ccc::CC1x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y73pqrEv");}
ccc::CC1x1y7 ::~CC1x1y7(){ note_dtor("_ZN3ccc7CC1x1y7E", this);} // tgen
ccc::CC1x1y7 ::CC1x1y7(){ note_ctor("_ZN3ccc7CC1x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y7E, buf);
    ::ccc::CC1x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y7E);
    dp->::ccc::CC1x1y7::~CC1x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y7E(Test__ZN3ccc7CC1x1y7E, "_ZN3ccc7CC1x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y7C1Ev();
extern void _ZN3ccc7CC1x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y7E[] = {
  NSPAIR(_ZN3ccc7CC1x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y7E[];
extern void _ZN3ccc7CC1x1y73abcEv();
extern void _ZN3ccc7CC1x1y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y73abcEv,_ZThn4_N3ccc7CC1x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y73pqrEv,_ZThn4_N3ccc7CC1x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y73abcEv,_ZThn4_N3ccc7CC1x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y73pqrEv,_ZThn4_N3ccc7CC1x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y7E[];
Class_Descriptor cd__ZN3ccc7CC1x1y7E = {  "_ZN3ccc7CC1x1y7E", // class name
  bases__ZN3ccc7CC1x1y7E, 2,
  &(vtc__ZN3ccc7CC1x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y8  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x1y83abcEv
  ~CC1x1y8(); // tgen
  CC1x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y8E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y83efgEv");}
void  ccc::CC1x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x1y83abcEv");}
ccc::CC1x1y8 ::~CC1x1y8(){ note_dtor("_ZN3ccc7CC1x1y8E", this);} // tgen
ccc::CC1x1y8 ::CC1x1y8(){ note_ctor("_ZN3ccc7CC1x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y8E, buf);
    ::ccc::CC1x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y8E);
    dp->::ccc::CC1x1y8::~CC1x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y8E(Test__ZN3ccc7CC1x1y8E, "_ZN3ccc7CC1x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y8C1Ev();
extern void _ZN3ccc7CC1x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y8E[] = {
  NSPAIR(_ZN3ccc7CC1x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y8E[];
extern void _ZN3ccc7CC1x1y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y83abcEv,_ZThn4_N3ccc7CC1x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y83efgEv,_ZThn4_N3ccc7CC1x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y83abcEv,_ZThn4_N3ccc7CC1x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y83efgEv,_ZThn4_N3ccc7CC1x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y8E[];
Class_Descriptor cd__ZN3ccc7CC1x1y8E = {  "_ZN3ccc7CC1x1y8E", // class name
  bases__ZN3ccc7CC1x1y8E, 2,
  &(vtc__ZN3ccc7CC1x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y9  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC1x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x1y93pqrEv
  ~CC1x1y9(); // tgen
  CC1x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x1y9E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x1y93efgEv");}
void  ccc::CC1x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x1y93pqrEv");}
ccc::CC1x1y9 ::~CC1x1y9(){ note_dtor("_ZN3ccc7CC1x1y9E", this);} // tgen
ccc::CC1x1y9 ::CC1x1y9(){ note_ctor("_ZN3ccc7CC1x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x1y9E, buf);
    ::ccc::CC1x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x1y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC1x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x1y9E);
    dp->::ccc::CC1x1y9::~CC1x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x1y9E(Test__ZN3ccc7CC1x1y9E, "_ZN3ccc7CC1x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x1y9C1Ev();
extern void _ZN3ccc7CC1x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x1y9E[] = {
  NSPAIR(_ZN3ccc7CC1x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC1x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x1y93pqrEv();
extern void _ZN3ccc7CC1x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y93pqrEv,_ZThn4_N3ccc7CC1x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x1y93efgEv,_ZThn4_N3ccc7CC1x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y93pqrEv,_ZThn4_N3ccc7CC1x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x1y93efgEv,_ZThn4_N3ccc7CC1x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x1y9E[];
Class_Descriptor cd__ZN3ccc7CC1x1y9E = {  "_ZN3ccc7CC1x1y9E", // class name
  bases__ZN3ccc7CC1x1y9E, 2,
  &(vtc__ZN3ccc7CC1x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y10  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x1y103abcEv
  ~CC1x1y10(); // tgen
  CC1x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y10E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y103pqrEv");}
void  ccc::CC1x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x1y103abcEv");}
ccc::CC1x1y10 ::~CC1x1y10(){ note_dtor("_ZN3ccc8CC1x1y10E", this);} // tgen
ccc::CC1x1y10 ::CC1x1y10(){ note_ctor("_ZN3ccc8CC1x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y10E, buf);
    ::ccc::CC1x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y10E);
    dp->::ccc::CC1x1y10::~CC1x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y10E(Test__ZN3ccc8CC1x1y10E, "_ZN3ccc8CC1x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y10C1Ev();
extern void _ZN3ccc8CC1x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y10E[] = {
  NSPAIR(_ZN3ccc8CC1x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y10E[];
extern void _ZN3ccc8CC1x1y103abcEv();
extern void _ZN3ccc8CC1x1y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y103abcEv,_ZThn4_N3ccc8CC1x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y103pqrEv,_ZThn4_N3ccc8CC1x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y103abcEv,_ZThn4_N3ccc8CC1x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y103pqrEv,_ZThn4_N3ccc8CC1x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y10E[];
Class_Descriptor cd__ZN3ccc8CC1x1y10E = {  "_ZN3ccc8CC1x1y10E", // class name
  bases__ZN3ccc8CC1x1y10E, 2,
  &(vtc__ZN3ccc8CC1x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y11  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x1y113efgEv
  ~CC1x1y11(); // tgen
  CC1x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y11E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y113pqrEv");}
void  ccc::CC1x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x1y113efgEv");}
ccc::CC1x1y11 ::~CC1x1y11(){ note_dtor("_ZN3ccc8CC1x1y11E", this);} // tgen
ccc::CC1x1y11 ::CC1x1y11(){ note_ctor("_ZN3ccc8CC1x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y11E, buf);
    ::ccc::CC1x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y11E);
    dp->::ccc::CC1x1y11::~CC1x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y11E(Test__ZN3ccc8CC1x1y11E, "_ZN3ccc8CC1x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y11C1Ev();
extern void _ZN3ccc8CC1x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y11E[] = {
  NSPAIR(_ZN3ccc8CC1x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x1y113pqrEv();
extern void _ZN3ccc8CC1x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y113pqrEv,_ZThn4_N3ccc8CC1x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y113efgEv,_ZThn4_N3ccc8CC1x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y113pqrEv,_ZThn4_N3ccc8CC1x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y113efgEv,_ZThn4_N3ccc8CC1x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y11E[];
Class_Descriptor cd__ZN3ccc8CC1x1y11E = {  "_ZN3ccc8CC1x1y11E", // class name
  bases__ZN3ccc8CC1x1y11E, 2,
  &(vtc__ZN3ccc8CC1x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y12  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC1x1y123abcEv
  ~CC1x1y12(); // tgen
  CC1x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x1y123abcEv");}
ccc::CC1x1y12 ::~CC1x1y12(){ note_dtor("_ZN3ccc8CC1x1y12E", this);} // tgen
ccc::CC1x1y12 ::CC1x1y12(){ note_ctor("_ZN3ccc8CC1x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y12E, buf);
    ::ccc::CC1x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y12E);
    dp->::ccc::CC1x1y12::~CC1x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y12E(Test__ZN3ccc8CC1x1y12E, "_ZN3ccc8CC1x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y12C1Ev();
extern void _ZN3ccc8CC1x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y12E[] = {
  NSPAIR(_ZN3ccc8CC1x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y12E[];
extern void _ZN3ccc8CC1x1y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y123abcEv,_ZThn4_N3ccc8CC1x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y123abcEv,_ZThn4_N3ccc8CC1x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y12E[];
Class_Descriptor cd__ZN3ccc8CC1x1y12E = {  "_ZN3ccc8CC1x1y12E", // class name
  bases__ZN3ccc8CC1x1y12E, 2,
  &(vtc__ZN3ccc8CC1x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y13  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC1x1y133efgEv
  ~CC1x1y13(); // tgen
  CC1x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x1y133efgEv");}
ccc::CC1x1y13 ::~CC1x1y13(){ note_dtor("_ZN3ccc8CC1x1y13E", this);} // tgen
ccc::CC1x1y13 ::CC1x1y13(){ note_ctor("_ZN3ccc8CC1x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y13E, buf);
    ::ccc::CC1x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y13E);
    dp->::ccc::CC1x1y13::~CC1x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y13E(Test__ZN3ccc8CC1x1y13E, "_ZN3ccc8CC1x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y13C1Ev();
extern void _ZN3ccc8CC1x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y13E[] = {
  NSPAIR(_ZN3ccc8CC1x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y133efgEv,_ZThn4_N3ccc8CC1x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y133efgEv,_ZThn4_N3ccc8CC1x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y13E[];
Class_Descriptor cd__ZN3ccc8CC1x1y13E = {  "_ZN3ccc8CC1x1y13E", // class name
  bases__ZN3ccc8CC1x1y13E, 2,
  &(vtc__ZN3ccc8CC1x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y14  : ::ccc::AA1 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC1x1y143pqrEv
  ~CC1x1y14(); // tgen
  CC1x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x1y143pqrEv");}
ccc::CC1x1y14 ::~CC1x1y14(){ note_dtor("_ZN3ccc8CC1x1y14E", this);} // tgen
ccc::CC1x1y14 ::CC1x1y14(){ note_ctor("_ZN3ccc8CC1x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y14E, buf);
    ::ccc::CC1x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y14E);
    dp->::ccc::CC1x1y14::~CC1x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y14E(Test__ZN3ccc8CC1x1y14E, "_ZN3ccc8CC1x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y14C1Ev();
extern void _ZN3ccc8CC1x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y14E[] = {
  NSPAIR(_ZN3ccc8CC1x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x1y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x1y143pqrEv,_ZThn4_N3ccc8CC1x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x1y143pqrEv,_ZThn4_N3ccc8CC1x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y14E[];
Class_Descriptor cd__ZN3ccc8CC1x1y14E = {  "_ZN3ccc8CC1x1y14E", // class name
  bases__ZN3ccc8CC1x1y14E, 2,
  &(vtc__ZN3ccc8CC1x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x1y15  : ::ccc::AA1 , ::ccc::BB1 {
  ~CC1x1y15(); // tgen
  CC1x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x1y15 ::~CC1x1y15(){ note_dtor("_ZN3ccc8CC1x1y15E", this);} // tgen
ccc::CC1x1y15 ::CC1x1y15(){ note_ctor("_ZN3ccc8CC1x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x1y15E, buf);
    ::ccc::CC1x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x1y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC1x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x1y15E);
    dp->::ccc::CC1x1y15::~CC1x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x1y15E(Test__ZN3ccc8CC1x1y15E, "_ZN3ccc8CC1x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x1y15C1Ev();
extern void _ZN3ccc8CC1x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x1y15E[] = {
  NSPAIR(_ZN3ccc8CC1x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC1x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x1y15E[];
Class_Descriptor cd__ZN3ccc8CC1x1y15E = {  "_ZN3ccc8CC1x1y15E", // class name
  bases__ZN3ccc8CC1x1y15E, 2,
  &(vtc__ZN3ccc8CC1x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y0  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y03pqrEv
  ~CC1x2y0(); // tgen
  CC1x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y0E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y03abcEv");}
void  ccc::CC1x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y03efgEv");}
void  ccc::CC1x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y03pqrEv");}
ccc::CC1x2y0 ::~CC1x2y0(){ note_dtor("_ZN3ccc7CC1x2y0E", this);} // tgen
ccc::CC1x2y0 ::CC1x2y0(){ note_ctor("_ZN3ccc7CC1x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y0E, buf);
    ::ccc::CC1x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y0E);
    dp->::ccc::CC1x2y0::~CC1x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y0E(Test__ZN3ccc7CC1x2y0E, "_ZN3ccc7CC1x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y0C1Ev();
extern void _ZN3ccc7CC1x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y0E[] = {
  NSPAIR(_ZN3ccc7CC1x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y0E[];
extern void _ZN3ccc7CC1x2y03abcEv();
extern void _ZN3ccc7CC1x2y03pqrEv();
extern void _ZN3ccc7CC1x2y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03efgEv,_ZThn4_N3ccc7CC1x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03abcEv,_ZThn4_N3ccc7CC1x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y03pqrEv,_ZThn4_N3ccc7CC1x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y03efgEv,_ZThn4_N3ccc7CC1x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y03abcEv,_ZThn4_N3ccc7CC1x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y03pqrEv,_ZThn4_N3ccc7CC1x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y0E[];
Class_Descriptor cd__ZN3ccc7CC1x2y0E = {  "_ZN3ccc7CC1x2y0E", // class name
  bases__ZN3ccc7CC1x2y0E, 2,
  &(vtc__ZN3ccc7CC1x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y1  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x2y13efgEv
  ~CC1x2y1(); // tgen
  CC1x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y1E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y13abcEv");}
void  ccc::CC1x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y13pqrEv");}
void  ccc::CC1x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y13efgEv");}
ccc::CC1x2y1 ::~CC1x2y1(){ note_dtor("_ZN3ccc7CC1x2y1E", this);} // tgen
ccc::CC1x2y1 ::CC1x2y1(){ note_ctor("_ZN3ccc7CC1x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y1E, buf);
    ::ccc::CC1x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y1E);
    dp->::ccc::CC1x2y1::~CC1x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y1E(Test__ZN3ccc7CC1x2y1E, "_ZN3ccc7CC1x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y1C1Ev();
extern void _ZN3ccc7CC1x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y1E[] = {
  NSPAIR(_ZN3ccc7CC1x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y1E[];
extern void _ZN3ccc7CC1x2y13abcEv();
extern void _ZN3ccc7CC1x2y13pqrEv();
extern void _ZN3ccc7CC1x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13efgEv,_ZThn4_N3ccc7CC1x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13abcEv,_ZThn4_N3ccc7CC1x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y13pqrEv,_ZThn4_N3ccc7CC1x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y13efgEv,_ZThn4_N3ccc7CC1x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y13abcEv,_ZThn4_N3ccc7CC1x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y13pqrEv,_ZThn4_N3ccc7CC1x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y1E[];
Class_Descriptor cd__ZN3ccc7CC1x2y1E = {  "_ZN3ccc7CC1x2y1E", // class name
  bases__ZN3ccc7CC1x2y1E, 2,
  &(vtc__ZN3ccc7CC1x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y2  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y23pqrEv
  ~CC1x2y2(); // tgen
  CC1x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y2E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y23efgEv");}
void  ccc::CC1x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y23abcEv");}
void  ccc::CC1x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y23pqrEv");}
ccc::CC1x2y2 ::~CC1x2y2(){ note_dtor("_ZN3ccc7CC1x2y2E", this);} // tgen
ccc::CC1x2y2 ::CC1x2y2(){ note_ctor("_ZN3ccc7CC1x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y2E, buf);
    ::ccc::CC1x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y2E);
    dp->::ccc::CC1x2y2::~CC1x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y2E(Test__ZN3ccc7CC1x2y2E, "_ZN3ccc7CC1x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y2C1Ev();
extern void _ZN3ccc7CC1x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y2E[] = {
  NSPAIR(_ZN3ccc7CC1x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y2E[];
extern void _ZN3ccc7CC1x2y23abcEv();
extern void _ZN3ccc7CC1x2y23pqrEv();
extern void _ZN3ccc7CC1x2y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23efgEv,_ZThn4_N3ccc7CC1x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23abcEv,_ZThn4_N3ccc7CC1x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y23pqrEv,_ZThn4_N3ccc7CC1x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y23efgEv,_ZThn4_N3ccc7CC1x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y23abcEv,_ZThn4_N3ccc7CC1x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y23pqrEv,_ZThn4_N3ccc7CC1x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y2E[];
Class_Descriptor cd__ZN3ccc7CC1x2y2E = {  "_ZN3ccc7CC1x2y2E", // class name
  bases__ZN3ccc7CC1x2y2E, 2,
  &(vtc__ZN3ccc7CC1x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y3  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x2y33abcEv
  ~CC1x2y3(); // tgen
  CC1x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y3E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y33efgEv");}
void  ccc::CC1x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y33pqrEv");}
void  ccc::CC1x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y33abcEv");}
ccc::CC1x2y3 ::~CC1x2y3(){ note_dtor("_ZN3ccc7CC1x2y3E", this);} // tgen
ccc::CC1x2y3 ::CC1x2y3(){ note_ctor("_ZN3ccc7CC1x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y3E, buf);
    ::ccc::CC1x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y3E);
    dp->::ccc::CC1x2y3::~CC1x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y3E(Test__ZN3ccc7CC1x2y3E, "_ZN3ccc7CC1x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y3C1Ev();
extern void _ZN3ccc7CC1x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y3E[] = {
  NSPAIR(_ZN3ccc7CC1x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y3E[];
extern void _ZN3ccc7CC1x2y33abcEv();
extern void _ZN3ccc7CC1x2y33pqrEv();
extern void _ZN3ccc7CC1x2y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33efgEv,_ZThn4_N3ccc7CC1x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33abcEv,_ZThn4_N3ccc7CC1x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y33pqrEv,_ZThn4_N3ccc7CC1x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y33efgEv,_ZThn4_N3ccc7CC1x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y33abcEv,_ZThn4_N3ccc7CC1x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y33pqrEv,_ZThn4_N3ccc7CC1x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y3E[];
Class_Descriptor cd__ZN3ccc7CC1x2y3E = {  "_ZN3ccc7CC1x2y3E", // class name
  bases__ZN3ccc7CC1x2y3E, 2,
  &(vtc__ZN3ccc7CC1x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y4  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC1x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y43efgEv
  ~CC1x2y4(); // tgen
  CC1x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y4E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y43pqrEv");}
void  ccc::CC1x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y43abcEv");}
void  ccc::CC1x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y43efgEv");}
ccc::CC1x2y4 ::~CC1x2y4(){ note_dtor("_ZN3ccc7CC1x2y4E", this);} // tgen
ccc::CC1x2y4 ::CC1x2y4(){ note_ctor("_ZN3ccc7CC1x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y4E, buf);
    ::ccc::CC1x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y4E);
    dp->::ccc::CC1x2y4::~CC1x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y4E(Test__ZN3ccc7CC1x2y4E, "_ZN3ccc7CC1x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y4C1Ev();
extern void _ZN3ccc7CC1x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y4E[] = {
  NSPAIR(_ZN3ccc7CC1x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y4E[];
extern void _ZN3ccc7CC1x2y43abcEv();
extern void _ZN3ccc7CC1x2y43pqrEv();
extern void _ZN3ccc7CC1x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43efgEv,_ZThn4_N3ccc7CC1x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43abcEv,_ZThn4_N3ccc7CC1x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y43pqrEv,_ZThn4_N3ccc7CC1x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y43efgEv,_ZThn4_N3ccc7CC1x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y43abcEv,_ZThn4_N3ccc7CC1x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y43pqrEv,_ZThn4_N3ccc7CC1x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y4E[];
Class_Descriptor cd__ZN3ccc7CC1x2y4E = {  "_ZN3ccc7CC1x2y4E", // class name
  bases__ZN3ccc7CC1x2y4E, 2,
  &(vtc__ZN3ccc7CC1x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y5  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC1x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y53abcEv
  ~CC1x2y5(); // tgen
  CC1x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y5E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y53pqrEv");}
void  ccc::CC1x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y53efgEv");}
void  ccc::CC1x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y53abcEv");}
ccc::CC1x2y5 ::~CC1x2y5(){ note_dtor("_ZN3ccc7CC1x2y5E", this);} // tgen
ccc::CC1x2y5 ::CC1x2y5(){ note_ctor("_ZN3ccc7CC1x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y5E, buf);
    ::ccc::CC1x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y5E);
    dp->::ccc::CC1x2y5::~CC1x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y5E(Test__ZN3ccc7CC1x2y5E, "_ZN3ccc7CC1x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y5C1Ev();
extern void _ZN3ccc7CC1x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y5E[] = {
  NSPAIR(_ZN3ccc7CC1x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y5E[];
extern void _ZN3ccc7CC1x2y53abcEv();
extern void _ZN3ccc7CC1x2y53pqrEv();
extern void _ZN3ccc7CC1x2y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53efgEv,_ZThn4_N3ccc7CC1x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53abcEv,_ZThn4_N3ccc7CC1x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y53pqrEv,_ZThn4_N3ccc7CC1x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y53efgEv,_ZThn4_N3ccc7CC1x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y53abcEv,_ZThn4_N3ccc7CC1x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y53pqrEv,_ZThn4_N3ccc7CC1x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y5E[];
Class_Descriptor cd__ZN3ccc7CC1x2y5E = {  "_ZN3ccc7CC1x2y5E", // class name
  bases__ZN3ccc7CC1x2y5E, 2,
  &(vtc__ZN3ccc7CC1x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y6  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x2y63efgEv
  ~CC1x2y6(); // tgen
  CC1x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y6E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y63abcEv");}
void  ccc::CC1x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y63efgEv");}
ccc::CC1x2y6 ::~CC1x2y6(){ note_dtor("_ZN3ccc7CC1x2y6E", this);} // tgen
ccc::CC1x2y6 ::CC1x2y6(){ note_ctor("_ZN3ccc7CC1x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y6E, buf);
    ::ccc::CC1x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y6E);
    dp->::ccc::CC1x2y6::~CC1x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y6E(Test__ZN3ccc7CC1x2y6E, "_ZN3ccc7CC1x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y6C1Ev();
extern void _ZN3ccc7CC1x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y6E[] = {
  NSPAIR(_ZN3ccc7CC1x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y6E[];
extern void _ZN3ccc7CC1x2y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y63efgEv,_ZThn4_N3ccc7CC1x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y63abcEv,_ZThn4_N3ccc7CC1x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y63efgEv,_ZThn4_N3ccc7CC1x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y63abcEv,_ZThn4_N3ccc7CC1x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y6E[];
Class_Descriptor cd__ZN3ccc7CC1x2y6E = {  "_ZN3ccc7CC1x2y6E", // class name
  bases__ZN3ccc7CC1x2y6E, 2,
  &(vtc__ZN3ccc7CC1x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y7  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC1x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y73pqrEv
  ~CC1x2y7(); // tgen
  CC1x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y7E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y73abcEv");}
void  ccc::CC1x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y73pqrEv");}
ccc::CC1x2y7 ::~CC1x2y7(){ note_dtor("_ZN3ccc7CC1x2y7E", this);} // tgen
ccc::CC1x2y7 ::CC1x2y7(){ note_ctor("_ZN3ccc7CC1x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y7E, buf);
    ::ccc::CC1x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y7E);
    dp->::ccc::CC1x2y7::~CC1x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y7E(Test__ZN3ccc7CC1x2y7E, "_ZN3ccc7CC1x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y7C1Ev();
extern void _ZN3ccc7CC1x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y7E[] = {
  NSPAIR(_ZN3ccc7CC1x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y7E[];
extern void _ZN3ccc7CC1x2y73abcEv();
extern void _ZN3ccc7CC1x2y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y73abcEv,_ZThn4_N3ccc7CC1x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y73pqrEv,_ZThn4_N3ccc7CC1x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y73abcEv,_ZThn4_N3ccc7CC1x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y73pqrEv,_ZThn4_N3ccc7CC1x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y7E[];
Class_Descriptor cd__ZN3ccc7CC1x2y7E = {  "_ZN3ccc7CC1x2y7E", // class name
  bases__ZN3ccc7CC1x2y7E, 2,
  &(vtc__ZN3ccc7CC1x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y8  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x2y83abcEv
  ~CC1x2y8(); // tgen
  CC1x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y8E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y83efgEv");}
void  ccc::CC1x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x2y83abcEv");}
ccc::CC1x2y8 ::~CC1x2y8(){ note_dtor("_ZN3ccc7CC1x2y8E", this);} // tgen
ccc::CC1x2y8 ::CC1x2y8(){ note_ctor("_ZN3ccc7CC1x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y8E, buf);
    ::ccc::CC1x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y8E);
    dp->::ccc::CC1x2y8::~CC1x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y8E(Test__ZN3ccc7CC1x2y8E, "_ZN3ccc7CC1x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y8C1Ev();
extern void _ZN3ccc7CC1x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y8E[] = {
  NSPAIR(_ZN3ccc7CC1x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y8E[];
extern void _ZN3ccc7CC1x2y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y83efgEv,_ZThn4_N3ccc7CC1x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y83abcEv,_ZThn4_N3ccc7CC1x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y83efgEv,_ZThn4_N3ccc7CC1x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y83abcEv,_ZThn4_N3ccc7CC1x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y8E[];
Class_Descriptor cd__ZN3ccc7CC1x2y8E = {  "_ZN3ccc7CC1x2y8E", // class name
  bases__ZN3ccc7CC1x2y8E, 2,
  &(vtc__ZN3ccc7CC1x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y9  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC1x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x2y93pqrEv
  ~CC1x2y9(); // tgen
  CC1x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x2y9E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x2y93efgEv");}
void  ccc::CC1x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x2y93pqrEv");}
ccc::CC1x2y9 ::~CC1x2y9(){ note_dtor("_ZN3ccc7CC1x2y9E", this);} // tgen
ccc::CC1x2y9 ::CC1x2y9(){ note_ctor("_ZN3ccc7CC1x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x2y9E, buf);
    ::ccc::CC1x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x2y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC1x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x2y9E);
    dp->::ccc::CC1x2y9::~CC1x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x2y9E(Test__ZN3ccc7CC1x2y9E, "_ZN3ccc7CC1x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x2y9C1Ev();
extern void _ZN3ccc7CC1x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x2y9E[] = {
  NSPAIR(_ZN3ccc7CC1x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC1x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x2y93pqrEv();
extern void _ZN3ccc7CC1x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y93efgEv,_ZThn4_N3ccc7CC1x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x2y93pqrEv,_ZThn4_N3ccc7CC1x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y93efgEv,_ZThn4_N3ccc7CC1x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x2y93pqrEv,_ZThn4_N3ccc7CC1x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x2y9E[];
Class_Descriptor cd__ZN3ccc7CC1x2y9E = {  "_ZN3ccc7CC1x2y9E", // class name
  bases__ZN3ccc7CC1x2y9E, 2,
  &(vtc__ZN3ccc7CC1x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y10  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x2y103abcEv
  ~CC1x2y10(); // tgen
  CC1x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y10E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y103pqrEv");}
void  ccc::CC1x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x2y103abcEv");}
ccc::CC1x2y10 ::~CC1x2y10(){ note_dtor("_ZN3ccc8CC1x2y10E", this);} // tgen
ccc::CC1x2y10 ::CC1x2y10(){ note_ctor("_ZN3ccc8CC1x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y10E, buf);
    ::ccc::CC1x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y10E);
    dp->::ccc::CC1x2y10::~CC1x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y10E(Test__ZN3ccc8CC1x2y10E, "_ZN3ccc8CC1x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y10C1Ev();
extern void _ZN3ccc8CC1x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y10E[] = {
  NSPAIR(_ZN3ccc8CC1x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y10E[];
extern void _ZN3ccc8CC1x2y103abcEv();
extern void _ZN3ccc8CC1x2y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y103abcEv,_ZThn4_N3ccc8CC1x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y103pqrEv,_ZThn4_N3ccc8CC1x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y103abcEv,_ZThn4_N3ccc8CC1x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y103pqrEv,_ZThn4_N3ccc8CC1x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y10E[];
Class_Descriptor cd__ZN3ccc8CC1x2y10E = {  "_ZN3ccc8CC1x2y10E", // class name
  bases__ZN3ccc8CC1x2y10E, 2,
  &(vtc__ZN3ccc8CC1x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y11  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x2y113efgEv
  ~CC1x2y11(); // tgen
  CC1x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y11E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y113pqrEv");}
void  ccc::CC1x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x2y113efgEv");}
ccc::CC1x2y11 ::~CC1x2y11(){ note_dtor("_ZN3ccc8CC1x2y11E", this);} // tgen
ccc::CC1x2y11 ::CC1x2y11(){ note_ctor("_ZN3ccc8CC1x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y11E, buf);
    ::ccc::CC1x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y11E);
    dp->::ccc::CC1x2y11::~CC1x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y11E(Test__ZN3ccc8CC1x2y11E, "_ZN3ccc8CC1x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y11C1Ev();
extern void _ZN3ccc8CC1x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y11E[] = {
  NSPAIR(_ZN3ccc8CC1x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x2y113pqrEv();
extern void _ZN3ccc8CC1x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y113efgEv,_ZThn4_N3ccc8CC1x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y113pqrEv,_ZThn4_N3ccc8CC1x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y113efgEv,_ZThn4_N3ccc8CC1x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y113pqrEv,_ZThn4_N3ccc8CC1x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y11E[];
Class_Descriptor cd__ZN3ccc8CC1x2y11E = {  "_ZN3ccc8CC1x2y11E", // class name
  bases__ZN3ccc8CC1x2y11E, 2,
  &(vtc__ZN3ccc8CC1x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y12  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC1x2y123abcEv
  ~CC1x2y12(); // tgen
  CC1x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x2y123abcEv");}
ccc::CC1x2y12 ::~CC1x2y12(){ note_dtor("_ZN3ccc8CC1x2y12E", this);} // tgen
ccc::CC1x2y12 ::CC1x2y12(){ note_ctor("_ZN3ccc8CC1x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y12E, buf);
    ::ccc::CC1x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y12E);
    dp->::ccc::CC1x2y12::~CC1x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y12E(Test__ZN3ccc8CC1x2y12E, "_ZN3ccc8CC1x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y12C1Ev();
extern void _ZN3ccc8CC1x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y12E[] = {
  NSPAIR(_ZN3ccc8CC1x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y12E[];
extern void _ZN3ccc8CC1x2y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y123abcEv,_ZThn4_N3ccc8CC1x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y123abcEv,_ZThn4_N3ccc8CC1x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y12E[];
Class_Descriptor cd__ZN3ccc8CC1x2y12E = {  "_ZN3ccc8CC1x2y12E", // class name
  bases__ZN3ccc8CC1x2y12E, 2,
  &(vtc__ZN3ccc8CC1x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y13  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC1x2y133efgEv
  ~CC1x2y13(); // tgen
  CC1x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x2y133efgEv");}
ccc::CC1x2y13 ::~CC1x2y13(){ note_dtor("_ZN3ccc8CC1x2y13E", this);} // tgen
ccc::CC1x2y13 ::CC1x2y13(){ note_ctor("_ZN3ccc8CC1x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y13E, buf);
    ::ccc::CC1x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y13E);
    dp->::ccc::CC1x2y13::~CC1x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y13E(Test__ZN3ccc8CC1x2y13E, "_ZN3ccc8CC1x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y13C1Ev();
extern void _ZN3ccc8CC1x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y13E[] = {
  NSPAIR(_ZN3ccc8CC1x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y133efgEv,_ZThn4_N3ccc8CC1x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y133efgEv,_ZThn4_N3ccc8CC1x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y13E[];
Class_Descriptor cd__ZN3ccc8CC1x2y13E = {  "_ZN3ccc8CC1x2y13E", // class name
  bases__ZN3ccc8CC1x2y13E, 2,
  &(vtc__ZN3ccc8CC1x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y14  : ::ccc::AA1 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC1x2y143pqrEv
  ~CC1x2y14(); // tgen
  CC1x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x2y143pqrEv");}
ccc::CC1x2y14 ::~CC1x2y14(){ note_dtor("_ZN3ccc8CC1x2y14E", this);} // tgen
ccc::CC1x2y14 ::CC1x2y14(){ note_ctor("_ZN3ccc8CC1x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y14E, buf);
    ::ccc::CC1x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y14E);
    dp->::ccc::CC1x2y14::~CC1x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y14E(Test__ZN3ccc8CC1x2y14E, "_ZN3ccc8CC1x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y14C1Ev();
extern void _ZN3ccc8CC1x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y14E[] = {
  NSPAIR(_ZN3ccc8CC1x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x2y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x2y143pqrEv,_ZThn4_N3ccc8CC1x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x2y143pqrEv,_ZThn4_N3ccc8CC1x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y14E[];
Class_Descriptor cd__ZN3ccc8CC1x2y14E = {  "_ZN3ccc8CC1x2y14E", // class name
  bases__ZN3ccc8CC1x2y14E, 2,
  &(vtc__ZN3ccc8CC1x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x2y15  : ::ccc::AA1 , ::ccc::BB2 {
  ~CC1x2y15(); // tgen
  CC1x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x2y15 ::~CC1x2y15(){ note_dtor("_ZN3ccc8CC1x2y15E", this);} // tgen
ccc::CC1x2y15 ::CC1x2y15(){ note_ctor("_ZN3ccc8CC1x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x2y15E, buf);
    ::ccc::CC1x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x2y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC1x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x2y15E);
    dp->::ccc::CC1x2y15::~CC1x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x2y15E(Test__ZN3ccc8CC1x2y15E, "_ZN3ccc8CC1x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x2y15C1Ev();
extern void _ZN3ccc8CC1x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x2y15E[] = {
  NSPAIR(_ZN3ccc8CC1x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC1x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x2y15E[];
Class_Descriptor cd__ZN3ccc8CC1x2y15E = {  "_ZN3ccc8CC1x2y15E", // class name
  bases__ZN3ccc8CC1x2y15E, 2,
  &(vtc__ZN3ccc8CC1x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y0  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y03pqrEv
  ~CC1x3y0(); // tgen
  CC1x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y0E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y03abcEv");}
void  ccc::CC1x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y03efgEv");}
void  ccc::CC1x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y03pqrEv");}
ccc::CC1x3y0 ::~CC1x3y0(){ note_dtor("_ZN3ccc7CC1x3y0E", this);} // tgen
ccc::CC1x3y0 ::CC1x3y0(){ note_ctor("_ZN3ccc7CC1x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y0E, buf);
    ::ccc::CC1x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y0E);
    dp->::ccc::CC1x3y0::~CC1x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y0E(Test__ZN3ccc7CC1x3y0E, "_ZN3ccc7CC1x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y0C1Ev();
extern void _ZN3ccc7CC1x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y0E[] = {
  NSPAIR(_ZN3ccc7CC1x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y0E[];
extern void _ZN3ccc7CC1x3y03abcEv();
extern void _ZN3ccc7CC1x3y03pqrEv();
extern void _ZN3ccc7CC1x3y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03efgEv,_ZThn4_N3ccc7CC1x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03pqrEv,_ZThn4_N3ccc7CC1x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y03abcEv,_ZThn4_N3ccc7CC1x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y03efgEv,_ZThn4_N3ccc7CC1x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y03pqrEv,_ZThn4_N3ccc7CC1x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y03abcEv,_ZThn4_N3ccc7CC1x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y0E[];
Class_Descriptor cd__ZN3ccc7CC1x3y0E = {  "_ZN3ccc7CC1x3y0E", // class name
  bases__ZN3ccc7CC1x3y0E, 2,
  &(vtc__ZN3ccc7CC1x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y1  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x3y13efgEv
  ~CC1x3y1(); // tgen
  CC1x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y1E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y13abcEv");}
void  ccc::CC1x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y13pqrEv");}
void  ccc::CC1x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y13efgEv");}
ccc::CC1x3y1 ::~CC1x3y1(){ note_dtor("_ZN3ccc7CC1x3y1E", this);} // tgen
ccc::CC1x3y1 ::CC1x3y1(){ note_ctor("_ZN3ccc7CC1x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y1E, buf);
    ::ccc::CC1x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y1E);
    dp->::ccc::CC1x3y1::~CC1x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y1E(Test__ZN3ccc7CC1x3y1E, "_ZN3ccc7CC1x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y1C1Ev();
extern void _ZN3ccc7CC1x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y1E[] = {
  NSPAIR(_ZN3ccc7CC1x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y1E[];
extern void _ZN3ccc7CC1x3y13abcEv();
extern void _ZN3ccc7CC1x3y13pqrEv();
extern void _ZN3ccc7CC1x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13efgEv,_ZThn4_N3ccc7CC1x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13pqrEv,_ZThn4_N3ccc7CC1x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y13abcEv,_ZThn4_N3ccc7CC1x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y13efgEv,_ZThn4_N3ccc7CC1x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y13pqrEv,_ZThn4_N3ccc7CC1x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y13abcEv,_ZThn4_N3ccc7CC1x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y1E[];
Class_Descriptor cd__ZN3ccc7CC1x3y1E = {  "_ZN3ccc7CC1x3y1E", // class name
  bases__ZN3ccc7CC1x3y1E, 2,
  &(vtc__ZN3ccc7CC1x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y2  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y23pqrEv
  ~CC1x3y2(); // tgen
  CC1x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y2E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y23efgEv");}
void  ccc::CC1x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y23abcEv");}
void  ccc::CC1x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y23pqrEv");}
ccc::CC1x3y2 ::~CC1x3y2(){ note_dtor("_ZN3ccc7CC1x3y2E", this);} // tgen
ccc::CC1x3y2 ::CC1x3y2(){ note_ctor("_ZN3ccc7CC1x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y2E, buf);
    ::ccc::CC1x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y2E);
    dp->::ccc::CC1x3y2::~CC1x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y2E(Test__ZN3ccc7CC1x3y2E, "_ZN3ccc7CC1x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y2C1Ev();
extern void _ZN3ccc7CC1x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y2E[] = {
  NSPAIR(_ZN3ccc7CC1x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y2E[];
extern void _ZN3ccc7CC1x3y23abcEv();
extern void _ZN3ccc7CC1x3y23pqrEv();
extern void _ZN3ccc7CC1x3y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23efgEv,_ZThn4_N3ccc7CC1x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23pqrEv,_ZThn4_N3ccc7CC1x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y23abcEv,_ZThn4_N3ccc7CC1x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y23efgEv,_ZThn4_N3ccc7CC1x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y23pqrEv,_ZThn4_N3ccc7CC1x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y23abcEv,_ZThn4_N3ccc7CC1x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y2E[];
Class_Descriptor cd__ZN3ccc7CC1x3y2E = {  "_ZN3ccc7CC1x3y2E", // class name
  bases__ZN3ccc7CC1x3y2E, 2,
  &(vtc__ZN3ccc7CC1x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y3  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x3y33abcEv
  ~CC1x3y3(); // tgen
  CC1x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y3E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y33efgEv");}
void  ccc::CC1x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y33pqrEv");}
void  ccc::CC1x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y33abcEv");}
ccc::CC1x3y3 ::~CC1x3y3(){ note_dtor("_ZN3ccc7CC1x3y3E", this);} // tgen
ccc::CC1x3y3 ::CC1x3y3(){ note_ctor("_ZN3ccc7CC1x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y3E, buf);
    ::ccc::CC1x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y3E);
    dp->::ccc::CC1x3y3::~CC1x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y3E(Test__ZN3ccc7CC1x3y3E, "_ZN3ccc7CC1x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y3C1Ev();
extern void _ZN3ccc7CC1x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y3E[] = {
  NSPAIR(_ZN3ccc7CC1x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y3E[];
extern void _ZN3ccc7CC1x3y33abcEv();
extern void _ZN3ccc7CC1x3y33pqrEv();
extern void _ZN3ccc7CC1x3y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33efgEv,_ZThn4_N3ccc7CC1x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33pqrEv,_ZThn4_N3ccc7CC1x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y33abcEv,_ZThn4_N3ccc7CC1x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y33efgEv,_ZThn4_N3ccc7CC1x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y33pqrEv,_ZThn4_N3ccc7CC1x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y33abcEv,_ZThn4_N3ccc7CC1x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y3E[];
Class_Descriptor cd__ZN3ccc7CC1x3y3E = {  "_ZN3ccc7CC1x3y3E", // class name
  bases__ZN3ccc7CC1x3y3E, 2,
  &(vtc__ZN3ccc7CC1x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y4  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC1x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y43efgEv
  ~CC1x3y4(); // tgen
  CC1x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y4E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y43pqrEv");}
void  ccc::CC1x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y43abcEv");}
void  ccc::CC1x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y43efgEv");}
ccc::CC1x3y4 ::~CC1x3y4(){ note_dtor("_ZN3ccc7CC1x3y4E", this);} // tgen
ccc::CC1x3y4 ::CC1x3y4(){ note_ctor("_ZN3ccc7CC1x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y4E, buf);
    ::ccc::CC1x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y4E);
    dp->::ccc::CC1x3y4::~CC1x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y4E(Test__ZN3ccc7CC1x3y4E, "_ZN3ccc7CC1x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y4C1Ev();
extern void _ZN3ccc7CC1x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y4E[] = {
  NSPAIR(_ZN3ccc7CC1x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y4E[];
extern void _ZN3ccc7CC1x3y43abcEv();
extern void _ZN3ccc7CC1x3y43pqrEv();
extern void _ZN3ccc7CC1x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43efgEv,_ZThn4_N3ccc7CC1x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43pqrEv,_ZThn4_N3ccc7CC1x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y43abcEv,_ZThn4_N3ccc7CC1x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y43efgEv,_ZThn4_N3ccc7CC1x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y43pqrEv,_ZThn4_N3ccc7CC1x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y43abcEv,_ZThn4_N3ccc7CC1x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y4E[];
Class_Descriptor cd__ZN3ccc7CC1x3y4E = {  "_ZN3ccc7CC1x3y4E", // class name
  bases__ZN3ccc7CC1x3y4E, 2,
  &(vtc__ZN3ccc7CC1x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y5  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC1x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y53abcEv
  ~CC1x3y5(); // tgen
  CC1x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y5E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y53pqrEv");}
void  ccc::CC1x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y53efgEv");}
void  ccc::CC1x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y53abcEv");}
ccc::CC1x3y5 ::~CC1x3y5(){ note_dtor("_ZN3ccc7CC1x3y5E", this);} // tgen
ccc::CC1x3y5 ::CC1x3y5(){ note_ctor("_ZN3ccc7CC1x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y5E, buf);
    ::ccc::CC1x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y5E);
    dp->::ccc::CC1x3y5::~CC1x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y5E(Test__ZN3ccc7CC1x3y5E, "_ZN3ccc7CC1x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y5C1Ev();
extern void _ZN3ccc7CC1x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y5E[] = {
  NSPAIR(_ZN3ccc7CC1x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y5E[];
extern void _ZN3ccc7CC1x3y53abcEv();
extern void _ZN3ccc7CC1x3y53pqrEv();
extern void _ZN3ccc7CC1x3y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53efgEv,_ZThn4_N3ccc7CC1x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53pqrEv,_ZThn4_N3ccc7CC1x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y53abcEv,_ZThn4_N3ccc7CC1x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y53efgEv,_ZThn4_N3ccc7CC1x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y53pqrEv,_ZThn4_N3ccc7CC1x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y53abcEv,_ZThn4_N3ccc7CC1x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y5E[];
Class_Descriptor cd__ZN3ccc7CC1x3y5E = {  "_ZN3ccc7CC1x3y5E", // class name
  bases__ZN3ccc7CC1x3y5E, 2,
  &(vtc__ZN3ccc7CC1x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y6  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x3y63efgEv
  ~CC1x3y6(); // tgen
  CC1x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y6E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y63abcEv");}
void  ccc::CC1x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y63efgEv");}
ccc::CC1x3y6 ::~CC1x3y6(){ note_dtor("_ZN3ccc7CC1x3y6E", this);} // tgen
ccc::CC1x3y6 ::CC1x3y6(){ note_ctor("_ZN3ccc7CC1x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y6E, buf);
    ::ccc::CC1x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y6E);
    dp->::ccc::CC1x3y6::~CC1x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y6E(Test__ZN3ccc7CC1x3y6E, "_ZN3ccc7CC1x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y6C1Ev();
extern void _ZN3ccc7CC1x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y6E[] = {
  NSPAIR(_ZN3ccc7CC1x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y6E[];
extern void _ZN3ccc7CC1x3y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y63efgEv,_ZThn4_N3ccc7CC1x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y63abcEv,_ZThn4_N3ccc7CC1x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y63efgEv,_ZThn4_N3ccc7CC1x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y63abcEv,_ZThn4_N3ccc7CC1x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y6E[];
Class_Descriptor cd__ZN3ccc7CC1x3y6E = {  "_ZN3ccc7CC1x3y6E", // class name
  bases__ZN3ccc7CC1x3y6E, 2,
  &(vtc__ZN3ccc7CC1x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y7  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC1x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y73pqrEv
  ~CC1x3y7(); // tgen
  CC1x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y7E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y73abcEv");}
void  ccc::CC1x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y73pqrEv");}
ccc::CC1x3y7 ::~CC1x3y7(){ note_dtor("_ZN3ccc7CC1x3y7E", this);} // tgen
ccc::CC1x3y7 ::CC1x3y7(){ note_ctor("_ZN3ccc7CC1x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y7E, buf);
    ::ccc::CC1x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y7E);
    dp->::ccc::CC1x3y7::~CC1x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y7E(Test__ZN3ccc7CC1x3y7E, "_ZN3ccc7CC1x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y7C1Ev();
extern void _ZN3ccc7CC1x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y7E[] = {
  NSPAIR(_ZN3ccc7CC1x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y7E[];
extern void _ZN3ccc7CC1x3y73abcEv();
extern void _ZN3ccc7CC1x3y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y73pqrEv,_ZThn4_N3ccc7CC1x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y73abcEv,_ZThn4_N3ccc7CC1x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y73pqrEv,_ZThn4_N3ccc7CC1x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y73abcEv,_ZThn4_N3ccc7CC1x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y7E[];
Class_Descriptor cd__ZN3ccc7CC1x3y7E = {  "_ZN3ccc7CC1x3y7E", // class name
  bases__ZN3ccc7CC1x3y7E, 2,
  &(vtc__ZN3ccc7CC1x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y8  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x3y83abcEv
  ~CC1x3y8(); // tgen
  CC1x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y8E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y83efgEv");}
void  ccc::CC1x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x3y83abcEv");}
ccc::CC1x3y8 ::~CC1x3y8(){ note_dtor("_ZN3ccc7CC1x3y8E", this);} // tgen
ccc::CC1x3y8 ::CC1x3y8(){ note_ctor("_ZN3ccc7CC1x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y8E, buf);
    ::ccc::CC1x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y8E);
    dp->::ccc::CC1x3y8::~CC1x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y8E(Test__ZN3ccc7CC1x3y8E, "_ZN3ccc7CC1x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y8C1Ev();
extern void _ZN3ccc7CC1x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y8E[] = {
  NSPAIR(_ZN3ccc7CC1x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y8E[];
extern void _ZN3ccc7CC1x3y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y83efgEv,_ZThn4_N3ccc7CC1x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y83abcEv,_ZThn4_N3ccc7CC1x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y83efgEv,_ZThn4_N3ccc7CC1x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y83abcEv,_ZThn4_N3ccc7CC1x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y8E[];
Class_Descriptor cd__ZN3ccc7CC1x3y8E = {  "_ZN3ccc7CC1x3y8E", // class name
  bases__ZN3ccc7CC1x3y8E, 2,
  &(vtc__ZN3ccc7CC1x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y9  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC1x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x3y93pqrEv
  ~CC1x3y9(); // tgen
  CC1x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x3y9E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x3y93efgEv");}
void  ccc::CC1x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x3y93pqrEv");}
ccc::CC1x3y9 ::~CC1x3y9(){ note_dtor("_ZN3ccc7CC1x3y9E", this);} // tgen
ccc::CC1x3y9 ::CC1x3y9(){ note_ctor("_ZN3ccc7CC1x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x3y9E, buf);
    ::ccc::CC1x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x3y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC1x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x3y9E);
    dp->::ccc::CC1x3y9::~CC1x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x3y9E(Test__ZN3ccc7CC1x3y9E, "_ZN3ccc7CC1x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x3y9C1Ev();
extern void _ZN3ccc7CC1x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x3y9E[] = {
  NSPAIR(_ZN3ccc7CC1x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC1x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x3y93pqrEv();
extern void _ZN3ccc7CC1x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y93efgEv,_ZThn4_N3ccc7CC1x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x3y93pqrEv,_ZThn4_N3ccc7CC1x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y93efgEv,_ZThn4_N3ccc7CC1x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x3y93pqrEv,_ZThn4_N3ccc7CC1x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x3y9E[];
Class_Descriptor cd__ZN3ccc7CC1x3y9E = {  "_ZN3ccc7CC1x3y9E", // class name
  bases__ZN3ccc7CC1x3y9E, 2,
  &(vtc__ZN3ccc7CC1x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y10  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x3y103abcEv
  ~CC1x3y10(); // tgen
  CC1x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y10E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y103pqrEv");}
void  ccc::CC1x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x3y103abcEv");}
ccc::CC1x3y10 ::~CC1x3y10(){ note_dtor("_ZN3ccc8CC1x3y10E", this);} // tgen
ccc::CC1x3y10 ::CC1x3y10(){ note_ctor("_ZN3ccc8CC1x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y10E, buf);
    ::ccc::CC1x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y10E);
    dp->::ccc::CC1x3y10::~CC1x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y10E(Test__ZN3ccc8CC1x3y10E, "_ZN3ccc8CC1x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y10C1Ev();
extern void _ZN3ccc8CC1x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y10E[] = {
  NSPAIR(_ZN3ccc8CC1x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y10E[];
extern void _ZN3ccc8CC1x3y103abcEv();
extern void _ZN3ccc8CC1x3y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y103pqrEv,_ZThn4_N3ccc8CC1x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y103abcEv,_ZThn4_N3ccc8CC1x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y103pqrEv,_ZThn4_N3ccc8CC1x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y103abcEv,_ZThn4_N3ccc8CC1x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y10E[];
Class_Descriptor cd__ZN3ccc8CC1x3y10E = {  "_ZN3ccc8CC1x3y10E", // class name
  bases__ZN3ccc8CC1x3y10E, 2,
  &(vtc__ZN3ccc8CC1x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y11  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x3y113efgEv
  ~CC1x3y11(); // tgen
  CC1x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y11E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y113pqrEv");}
void  ccc::CC1x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x3y113efgEv");}
ccc::CC1x3y11 ::~CC1x3y11(){ note_dtor("_ZN3ccc8CC1x3y11E", this);} // tgen
ccc::CC1x3y11 ::CC1x3y11(){ note_ctor("_ZN3ccc8CC1x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y11E, buf);
    ::ccc::CC1x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y11E);
    dp->::ccc::CC1x3y11::~CC1x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y11E(Test__ZN3ccc8CC1x3y11E, "_ZN3ccc8CC1x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y11C1Ev();
extern void _ZN3ccc8CC1x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y11E[] = {
  NSPAIR(_ZN3ccc8CC1x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x3y113pqrEv();
extern void _ZN3ccc8CC1x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y113efgEv,_ZThn4_N3ccc8CC1x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y113pqrEv,_ZThn4_N3ccc8CC1x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y113efgEv,_ZThn4_N3ccc8CC1x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y113pqrEv,_ZThn4_N3ccc8CC1x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y11E[];
Class_Descriptor cd__ZN3ccc8CC1x3y11E = {  "_ZN3ccc8CC1x3y11E", // class name
  bases__ZN3ccc8CC1x3y11E, 2,
  &(vtc__ZN3ccc8CC1x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y12  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC1x3y123abcEv
  ~CC1x3y12(); // tgen
  CC1x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x3y123abcEv");}
ccc::CC1x3y12 ::~CC1x3y12(){ note_dtor("_ZN3ccc8CC1x3y12E", this);} // tgen
ccc::CC1x3y12 ::CC1x3y12(){ note_ctor("_ZN3ccc8CC1x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y12E, buf);
    ::ccc::CC1x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y12E);
    dp->::ccc::CC1x3y12::~CC1x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y12E(Test__ZN3ccc8CC1x3y12E, "_ZN3ccc8CC1x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y12C1Ev();
extern void _ZN3ccc8CC1x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y12E[] = {
  NSPAIR(_ZN3ccc8CC1x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y12E[];
extern void _ZN3ccc8CC1x3y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y123abcEv,_ZThn4_N3ccc8CC1x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y123abcEv,_ZThn4_N3ccc8CC1x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y12E[];
Class_Descriptor cd__ZN3ccc8CC1x3y12E = {  "_ZN3ccc8CC1x3y12E", // class name
  bases__ZN3ccc8CC1x3y12E, 2,
  &(vtc__ZN3ccc8CC1x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y13  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC1x3y133efgEv
  ~CC1x3y13(); // tgen
  CC1x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x3y133efgEv");}
ccc::CC1x3y13 ::~CC1x3y13(){ note_dtor("_ZN3ccc8CC1x3y13E", this);} // tgen
ccc::CC1x3y13 ::CC1x3y13(){ note_ctor("_ZN3ccc8CC1x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y13E, buf);
    ::ccc::CC1x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y13E);
    dp->::ccc::CC1x3y13::~CC1x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y13E(Test__ZN3ccc8CC1x3y13E, "_ZN3ccc8CC1x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y13C1Ev();
extern void _ZN3ccc8CC1x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y13E[] = {
  NSPAIR(_ZN3ccc8CC1x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y133efgEv,_ZThn4_N3ccc8CC1x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y133efgEv,_ZThn4_N3ccc8CC1x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y13E[];
Class_Descriptor cd__ZN3ccc8CC1x3y13E = {  "_ZN3ccc8CC1x3y13E", // class name
  bases__ZN3ccc8CC1x3y13E, 2,
  &(vtc__ZN3ccc8CC1x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y14  : ::ccc::AA1 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC1x3y143pqrEv
  ~CC1x3y14(); // tgen
  CC1x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x3y143pqrEv");}
ccc::CC1x3y14 ::~CC1x3y14(){ note_dtor("_ZN3ccc8CC1x3y14E", this);} // tgen
ccc::CC1x3y14 ::CC1x3y14(){ note_ctor("_ZN3ccc8CC1x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y14E, buf);
    ::ccc::CC1x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y14E);
    dp->::ccc::CC1x3y14::~CC1x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y14E(Test__ZN3ccc8CC1x3y14E, "_ZN3ccc8CC1x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y14C1Ev();
extern void _ZN3ccc8CC1x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y14E[] = {
  NSPAIR(_ZN3ccc8CC1x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x3y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x3y143pqrEv,_ZThn4_N3ccc8CC1x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x3y143pqrEv,_ZThn4_N3ccc8CC1x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y14E[];
Class_Descriptor cd__ZN3ccc8CC1x3y14E = {  "_ZN3ccc8CC1x3y14E", // class name
  bases__ZN3ccc8CC1x3y14E, 2,
  &(vtc__ZN3ccc8CC1x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x3y15  : ::ccc::AA1 , ::ccc::BB3 {
  ~CC1x3y15(); // tgen
  CC1x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x3y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x3y15 ::~CC1x3y15(){ note_dtor("_ZN3ccc8CC1x3y15E", this);} // tgen
ccc::CC1x3y15 ::CC1x3y15(){ note_ctor("_ZN3ccc8CC1x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x3y15E, buf);
    ::ccc::CC1x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x3y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC1x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x3y15E);
    dp->::ccc::CC1x3y15::~CC1x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x3y15E(Test__ZN3ccc8CC1x3y15E, "_ZN3ccc8CC1x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x3y15C1Ev();
extern void _ZN3ccc8CC1x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x3y15E[] = {
  NSPAIR(_ZN3ccc8CC1x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC1x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x3y15E[];
Class_Descriptor cd__ZN3ccc8CC1x3y15E = {  "_ZN3ccc8CC1x3y15E", // class name
  bases__ZN3ccc8CC1x3y15E, 2,
  &(vtc__ZN3ccc8CC1x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y0  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y03pqrEv
  ~CC1x4y0(); // tgen
  CC1x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y0E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y03abcEv");}
void  ccc::CC1x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y03efgEv");}
void  ccc::CC1x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y03pqrEv");}
ccc::CC1x4y0 ::~CC1x4y0(){ note_dtor("_ZN3ccc7CC1x4y0E", this);} // tgen
ccc::CC1x4y0 ::CC1x4y0(){ note_ctor("_ZN3ccc7CC1x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y0E, buf);
    ::ccc::CC1x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y0E);
    dp->::ccc::CC1x4y0::~CC1x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y0E(Test__ZN3ccc7CC1x4y0E, "_ZN3ccc7CC1x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y0C1Ev();
extern void _ZN3ccc7CC1x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y0E[] = {
  NSPAIR(_ZN3ccc7CC1x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y0E[];
extern void _ZN3ccc7CC1x4y03abcEv();
extern void _ZN3ccc7CC1x4y03pqrEv();
extern void _ZN3ccc7CC1x4y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03pqrEv,_ZThn4_N3ccc7CC1x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03abcEv,_ZThn4_N3ccc7CC1x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y03efgEv,_ZThn4_N3ccc7CC1x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y03pqrEv,_ZThn4_N3ccc7CC1x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y03abcEv,_ZThn4_N3ccc7CC1x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y03efgEv,_ZThn4_N3ccc7CC1x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y0E[];
Class_Descriptor cd__ZN3ccc7CC1x4y0E = {  "_ZN3ccc7CC1x4y0E", // class name
  bases__ZN3ccc7CC1x4y0E, 2,
  &(vtc__ZN3ccc7CC1x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y1  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x4y13efgEv
  ~CC1x4y1(); // tgen
  CC1x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y1E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y13abcEv");}
void  ccc::CC1x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y13pqrEv");}
void  ccc::CC1x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y13efgEv");}
ccc::CC1x4y1 ::~CC1x4y1(){ note_dtor("_ZN3ccc7CC1x4y1E", this);} // tgen
ccc::CC1x4y1 ::CC1x4y1(){ note_ctor("_ZN3ccc7CC1x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y1E, buf);
    ::ccc::CC1x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y1E);
    dp->::ccc::CC1x4y1::~CC1x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y1E(Test__ZN3ccc7CC1x4y1E, "_ZN3ccc7CC1x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y1C1Ev();
extern void _ZN3ccc7CC1x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y1E[] = {
  NSPAIR(_ZN3ccc7CC1x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y1E[];
extern void _ZN3ccc7CC1x4y13abcEv();
extern void _ZN3ccc7CC1x4y13pqrEv();
extern void _ZN3ccc7CC1x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13pqrEv,_ZThn4_N3ccc7CC1x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13abcEv,_ZThn4_N3ccc7CC1x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y13efgEv,_ZThn4_N3ccc7CC1x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y13pqrEv,_ZThn4_N3ccc7CC1x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y13abcEv,_ZThn4_N3ccc7CC1x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y13efgEv,_ZThn4_N3ccc7CC1x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y1E[];
Class_Descriptor cd__ZN3ccc7CC1x4y1E = {  "_ZN3ccc7CC1x4y1E", // class name
  bases__ZN3ccc7CC1x4y1E, 2,
  &(vtc__ZN3ccc7CC1x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y2  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y23pqrEv
  ~CC1x4y2(); // tgen
  CC1x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y2E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y23efgEv");}
void  ccc::CC1x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y23abcEv");}
void  ccc::CC1x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y23pqrEv");}
ccc::CC1x4y2 ::~CC1x4y2(){ note_dtor("_ZN3ccc7CC1x4y2E", this);} // tgen
ccc::CC1x4y2 ::CC1x4y2(){ note_ctor("_ZN3ccc7CC1x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y2E, buf);
    ::ccc::CC1x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y2E);
    dp->::ccc::CC1x4y2::~CC1x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y2E(Test__ZN3ccc7CC1x4y2E, "_ZN3ccc7CC1x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y2C1Ev();
extern void _ZN3ccc7CC1x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y2E[] = {
  NSPAIR(_ZN3ccc7CC1x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y2E[];
extern void _ZN3ccc7CC1x4y23abcEv();
extern void _ZN3ccc7CC1x4y23pqrEv();
extern void _ZN3ccc7CC1x4y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23pqrEv,_ZThn4_N3ccc7CC1x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23abcEv,_ZThn4_N3ccc7CC1x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y23efgEv,_ZThn4_N3ccc7CC1x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y23pqrEv,_ZThn4_N3ccc7CC1x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y23abcEv,_ZThn4_N3ccc7CC1x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y23efgEv,_ZThn4_N3ccc7CC1x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y2E[];
Class_Descriptor cd__ZN3ccc7CC1x4y2E = {  "_ZN3ccc7CC1x4y2E", // class name
  bases__ZN3ccc7CC1x4y2E, 2,
  &(vtc__ZN3ccc7CC1x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y3  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x4y33abcEv
  ~CC1x4y3(); // tgen
  CC1x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y3E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y33efgEv");}
void  ccc::CC1x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y33pqrEv");}
void  ccc::CC1x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y33abcEv");}
ccc::CC1x4y3 ::~CC1x4y3(){ note_dtor("_ZN3ccc7CC1x4y3E", this);} // tgen
ccc::CC1x4y3 ::CC1x4y3(){ note_ctor("_ZN3ccc7CC1x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y3E, buf);
    ::ccc::CC1x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y3E);
    dp->::ccc::CC1x4y3::~CC1x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y3E(Test__ZN3ccc7CC1x4y3E, "_ZN3ccc7CC1x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y3C1Ev();
extern void _ZN3ccc7CC1x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y3E[] = {
  NSPAIR(_ZN3ccc7CC1x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y3E[];
extern void _ZN3ccc7CC1x4y33abcEv();
extern void _ZN3ccc7CC1x4y33pqrEv();
extern void _ZN3ccc7CC1x4y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33pqrEv,_ZThn4_N3ccc7CC1x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33abcEv,_ZThn4_N3ccc7CC1x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y33efgEv,_ZThn4_N3ccc7CC1x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y33pqrEv,_ZThn4_N3ccc7CC1x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y33abcEv,_ZThn4_N3ccc7CC1x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y33efgEv,_ZThn4_N3ccc7CC1x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y3E[];
Class_Descriptor cd__ZN3ccc7CC1x4y3E = {  "_ZN3ccc7CC1x4y3E", // class name
  bases__ZN3ccc7CC1x4y3E, 2,
  &(vtc__ZN3ccc7CC1x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y4  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC1x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y43efgEv
  ~CC1x4y4(); // tgen
  CC1x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y4E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y43pqrEv");}
void  ccc::CC1x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y43abcEv");}
void  ccc::CC1x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y43efgEv");}
ccc::CC1x4y4 ::~CC1x4y4(){ note_dtor("_ZN3ccc7CC1x4y4E", this);} // tgen
ccc::CC1x4y4 ::CC1x4y4(){ note_ctor("_ZN3ccc7CC1x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y4E, buf);
    ::ccc::CC1x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y4E);
    dp->::ccc::CC1x4y4::~CC1x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y4E(Test__ZN3ccc7CC1x4y4E, "_ZN3ccc7CC1x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y4C1Ev();
extern void _ZN3ccc7CC1x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y4E[] = {
  NSPAIR(_ZN3ccc7CC1x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y4E[];
extern void _ZN3ccc7CC1x4y43abcEv();
extern void _ZN3ccc7CC1x4y43pqrEv();
extern void _ZN3ccc7CC1x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43pqrEv,_ZThn4_N3ccc7CC1x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43abcEv,_ZThn4_N3ccc7CC1x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y43efgEv,_ZThn4_N3ccc7CC1x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y43pqrEv,_ZThn4_N3ccc7CC1x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y43abcEv,_ZThn4_N3ccc7CC1x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y43efgEv,_ZThn4_N3ccc7CC1x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y4E[];
Class_Descriptor cd__ZN3ccc7CC1x4y4E = {  "_ZN3ccc7CC1x4y4E", // class name
  bases__ZN3ccc7CC1x4y4E, 2,
  &(vtc__ZN3ccc7CC1x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y5  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC1x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y53abcEv
  ~CC1x4y5(); // tgen
  CC1x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y5E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y53pqrEv");}
void  ccc::CC1x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y53efgEv");}
void  ccc::CC1x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y53abcEv");}
ccc::CC1x4y5 ::~CC1x4y5(){ note_dtor("_ZN3ccc7CC1x4y5E", this);} // tgen
ccc::CC1x4y5 ::CC1x4y5(){ note_ctor("_ZN3ccc7CC1x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y5E, buf);
    ::ccc::CC1x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y5E);
    dp->::ccc::CC1x4y5::~CC1x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y5E(Test__ZN3ccc7CC1x4y5E, "_ZN3ccc7CC1x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y5C1Ev();
extern void _ZN3ccc7CC1x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y5E[] = {
  NSPAIR(_ZN3ccc7CC1x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y5E[];
extern void _ZN3ccc7CC1x4y53abcEv();
extern void _ZN3ccc7CC1x4y53pqrEv();
extern void _ZN3ccc7CC1x4y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53pqrEv,_ZThn4_N3ccc7CC1x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53abcEv,_ZThn4_N3ccc7CC1x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y53efgEv,_ZThn4_N3ccc7CC1x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y53pqrEv,_ZThn4_N3ccc7CC1x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y53abcEv,_ZThn4_N3ccc7CC1x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y53efgEv,_ZThn4_N3ccc7CC1x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y5E[];
Class_Descriptor cd__ZN3ccc7CC1x4y5E = {  "_ZN3ccc7CC1x4y5E", // class name
  bases__ZN3ccc7CC1x4y5E, 2,
  &(vtc__ZN3ccc7CC1x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y6  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x4y63efgEv
  ~CC1x4y6(); // tgen
  CC1x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y6E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y63abcEv");}
void  ccc::CC1x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y63efgEv");}
ccc::CC1x4y6 ::~CC1x4y6(){ note_dtor("_ZN3ccc7CC1x4y6E", this);} // tgen
ccc::CC1x4y6 ::CC1x4y6(){ note_ctor("_ZN3ccc7CC1x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y6E, buf);
    ::ccc::CC1x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y6E);
    dp->::ccc::CC1x4y6::~CC1x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y6E(Test__ZN3ccc7CC1x4y6E, "_ZN3ccc7CC1x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y6C1Ev();
extern void _ZN3ccc7CC1x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y6E[] = {
  NSPAIR(_ZN3ccc7CC1x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y6E[];
extern void _ZN3ccc7CC1x4y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y63abcEv,_ZThn4_N3ccc7CC1x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y63efgEv,_ZThn4_N3ccc7CC1x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y63abcEv,_ZThn4_N3ccc7CC1x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y63efgEv,_ZThn4_N3ccc7CC1x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y6E[];
Class_Descriptor cd__ZN3ccc7CC1x4y6E = {  "_ZN3ccc7CC1x4y6E", // class name
  bases__ZN3ccc7CC1x4y6E, 2,
  &(vtc__ZN3ccc7CC1x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y7  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC1x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y73pqrEv
  ~CC1x4y7(); // tgen
  CC1x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y7E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y73abcEv");}
void  ccc::CC1x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y73pqrEv");}
ccc::CC1x4y7 ::~CC1x4y7(){ note_dtor("_ZN3ccc7CC1x4y7E", this);} // tgen
ccc::CC1x4y7 ::CC1x4y7(){ note_ctor("_ZN3ccc7CC1x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y7E, buf);
    ::ccc::CC1x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y7E);
    dp->::ccc::CC1x4y7::~CC1x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y7E(Test__ZN3ccc7CC1x4y7E, "_ZN3ccc7CC1x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y7C1Ev();
extern void _ZN3ccc7CC1x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y7E[] = {
  NSPAIR(_ZN3ccc7CC1x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y7E[];
extern void _ZN3ccc7CC1x4y73abcEv();
extern void _ZN3ccc7CC1x4y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y73pqrEv,_ZThn4_N3ccc7CC1x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y73abcEv,_ZThn4_N3ccc7CC1x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y73pqrEv,_ZThn4_N3ccc7CC1x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y73abcEv,_ZThn4_N3ccc7CC1x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y7E[];
Class_Descriptor cd__ZN3ccc7CC1x4y7E = {  "_ZN3ccc7CC1x4y7E", // class name
  bases__ZN3ccc7CC1x4y7E, 2,
  &(vtc__ZN3ccc7CC1x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y8  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x4y83abcEv
  ~CC1x4y8(); // tgen
  CC1x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y8E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y83efgEv");}
void  ccc::CC1x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x4y83abcEv");}
ccc::CC1x4y8 ::~CC1x4y8(){ note_dtor("_ZN3ccc7CC1x4y8E", this);} // tgen
ccc::CC1x4y8 ::CC1x4y8(){ note_ctor("_ZN3ccc7CC1x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y8E, buf);
    ::ccc::CC1x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y8E);
    dp->::ccc::CC1x4y8::~CC1x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y8E(Test__ZN3ccc7CC1x4y8E, "_ZN3ccc7CC1x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y8C1Ev();
extern void _ZN3ccc7CC1x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y8E[] = {
  NSPAIR(_ZN3ccc7CC1x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y8E[];
extern void _ZN3ccc7CC1x4y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y83abcEv,_ZThn4_N3ccc7CC1x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y83efgEv,_ZThn4_N3ccc7CC1x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y83abcEv,_ZThn4_N3ccc7CC1x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y83efgEv,_ZThn4_N3ccc7CC1x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y8E[];
Class_Descriptor cd__ZN3ccc7CC1x4y8E = {  "_ZN3ccc7CC1x4y8E", // class name
  bases__ZN3ccc7CC1x4y8E, 2,
  &(vtc__ZN3ccc7CC1x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y9  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC1x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x4y93pqrEv
  ~CC1x4y9(); // tgen
  CC1x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x4y9E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x4y93efgEv");}
void  ccc::CC1x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x4y93pqrEv");}
ccc::CC1x4y9 ::~CC1x4y9(){ note_dtor("_ZN3ccc7CC1x4y9E", this);} // tgen
ccc::CC1x4y9 ::CC1x4y9(){ note_ctor("_ZN3ccc7CC1x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x4y9E, buf);
    ::ccc::CC1x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x4y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC1x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x4y9E);
    dp->::ccc::CC1x4y9::~CC1x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x4y9E(Test__ZN3ccc7CC1x4y9E, "_ZN3ccc7CC1x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x4y9C1Ev();
extern void _ZN3ccc7CC1x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x4y9E[] = {
  NSPAIR(_ZN3ccc7CC1x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC1x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x4y93pqrEv();
extern void _ZN3ccc7CC1x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y93pqrEv,_ZThn4_N3ccc7CC1x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x4y93efgEv,_ZThn4_N3ccc7CC1x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y93pqrEv,_ZThn4_N3ccc7CC1x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x4y93efgEv,_ZThn4_N3ccc7CC1x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x4y9E[];
Class_Descriptor cd__ZN3ccc7CC1x4y9E = {  "_ZN3ccc7CC1x4y9E", // class name
  bases__ZN3ccc7CC1x4y9E, 2,
  &(vtc__ZN3ccc7CC1x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y10  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x4y103abcEv
  ~CC1x4y10(); // tgen
  CC1x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y10E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y103pqrEv");}
void  ccc::CC1x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x4y103abcEv");}
ccc::CC1x4y10 ::~CC1x4y10(){ note_dtor("_ZN3ccc8CC1x4y10E", this);} // tgen
ccc::CC1x4y10 ::CC1x4y10(){ note_ctor("_ZN3ccc8CC1x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y10E, buf);
    ::ccc::CC1x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y10E);
    dp->::ccc::CC1x4y10::~CC1x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y10E(Test__ZN3ccc8CC1x4y10E, "_ZN3ccc8CC1x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y10C1Ev();
extern void _ZN3ccc8CC1x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y10E[] = {
  NSPAIR(_ZN3ccc8CC1x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y10E[];
extern void _ZN3ccc8CC1x4y103abcEv();
extern void _ZN3ccc8CC1x4y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y103pqrEv,_ZThn4_N3ccc8CC1x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y103abcEv,_ZThn4_N3ccc8CC1x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y103pqrEv,_ZThn4_N3ccc8CC1x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y103abcEv,_ZThn4_N3ccc8CC1x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y10E[];
Class_Descriptor cd__ZN3ccc8CC1x4y10E = {  "_ZN3ccc8CC1x4y10E", // class name
  bases__ZN3ccc8CC1x4y10E, 2,
  &(vtc__ZN3ccc8CC1x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y11  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x4y113efgEv
  ~CC1x4y11(); // tgen
  CC1x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y11E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y113pqrEv");}
void  ccc::CC1x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x4y113efgEv");}
ccc::CC1x4y11 ::~CC1x4y11(){ note_dtor("_ZN3ccc8CC1x4y11E", this);} // tgen
ccc::CC1x4y11 ::CC1x4y11(){ note_ctor("_ZN3ccc8CC1x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y11E, buf);
    ::ccc::CC1x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y11E);
    dp->::ccc::CC1x4y11::~CC1x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y11E(Test__ZN3ccc8CC1x4y11E, "_ZN3ccc8CC1x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y11C1Ev();
extern void _ZN3ccc8CC1x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y11E[] = {
  NSPAIR(_ZN3ccc8CC1x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x4y113pqrEv();
extern void _ZN3ccc8CC1x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y113pqrEv,_ZThn4_N3ccc8CC1x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y113efgEv,_ZThn4_N3ccc8CC1x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y113pqrEv,_ZThn4_N3ccc8CC1x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y113efgEv,_ZThn4_N3ccc8CC1x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y11E[];
Class_Descriptor cd__ZN3ccc8CC1x4y11E = {  "_ZN3ccc8CC1x4y11E", // class name
  bases__ZN3ccc8CC1x4y11E, 2,
  &(vtc__ZN3ccc8CC1x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y12  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC1x4y123abcEv
  ~CC1x4y12(); // tgen
  CC1x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x4y123abcEv");}
ccc::CC1x4y12 ::~CC1x4y12(){ note_dtor("_ZN3ccc8CC1x4y12E", this);} // tgen
ccc::CC1x4y12 ::CC1x4y12(){ note_ctor("_ZN3ccc8CC1x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y12E, buf);
    ::ccc::CC1x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y12E);
    dp->::ccc::CC1x4y12::~CC1x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y12E(Test__ZN3ccc8CC1x4y12E, "_ZN3ccc8CC1x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y12C1Ev();
extern void _ZN3ccc8CC1x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y12E[] = {
  NSPAIR(_ZN3ccc8CC1x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y12E[];
extern void _ZN3ccc8CC1x4y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y123abcEv,_ZThn4_N3ccc8CC1x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y123abcEv,_ZThn4_N3ccc8CC1x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y12E[];
Class_Descriptor cd__ZN3ccc8CC1x4y12E = {  "_ZN3ccc8CC1x4y12E", // class name
  bases__ZN3ccc8CC1x4y12E, 2,
  &(vtc__ZN3ccc8CC1x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y13  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC1x4y133efgEv
  ~CC1x4y13(); // tgen
  CC1x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x4y133efgEv");}
ccc::CC1x4y13 ::~CC1x4y13(){ note_dtor("_ZN3ccc8CC1x4y13E", this);} // tgen
ccc::CC1x4y13 ::CC1x4y13(){ note_ctor("_ZN3ccc8CC1x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y13E, buf);
    ::ccc::CC1x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y13E);
    dp->::ccc::CC1x4y13::~CC1x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y13E(Test__ZN3ccc8CC1x4y13E, "_ZN3ccc8CC1x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y13C1Ev();
extern void _ZN3ccc8CC1x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y13E[] = {
  NSPAIR(_ZN3ccc8CC1x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y133efgEv,_ZThn4_N3ccc8CC1x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y133efgEv,_ZThn4_N3ccc8CC1x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y13E[];
Class_Descriptor cd__ZN3ccc8CC1x4y13E = {  "_ZN3ccc8CC1x4y13E", // class name
  bases__ZN3ccc8CC1x4y13E, 2,
  &(vtc__ZN3ccc8CC1x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y14  : ::ccc::AA1 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC1x4y143pqrEv
  ~CC1x4y14(); // tgen
  CC1x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x4y143pqrEv");}
ccc::CC1x4y14 ::~CC1x4y14(){ note_dtor("_ZN3ccc8CC1x4y14E", this);} // tgen
ccc::CC1x4y14 ::CC1x4y14(){ note_ctor("_ZN3ccc8CC1x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y14E, buf);
    ::ccc::CC1x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y14E);
    dp->::ccc::CC1x4y14::~CC1x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y14E(Test__ZN3ccc8CC1x4y14E, "_ZN3ccc8CC1x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y14C1Ev();
extern void _ZN3ccc8CC1x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y14E[] = {
  NSPAIR(_ZN3ccc8CC1x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x4y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x4y143pqrEv,_ZThn4_N3ccc8CC1x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x4y143pqrEv,_ZThn4_N3ccc8CC1x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y14E[];
Class_Descriptor cd__ZN3ccc8CC1x4y14E = {  "_ZN3ccc8CC1x4y14E", // class name
  bases__ZN3ccc8CC1x4y14E, 2,
  &(vtc__ZN3ccc8CC1x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x4y15  : ::ccc::AA1 , ::ccc::BB4 {
  ~CC1x4y15(); // tgen
  CC1x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x4y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x4y15 ::~CC1x4y15(){ note_dtor("_ZN3ccc8CC1x4y15E", this);} // tgen
ccc::CC1x4y15 ::CC1x4y15(){ note_ctor("_ZN3ccc8CC1x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x4y15E, buf);
    ::ccc::CC1x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x4y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC1x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x4y15E);
    dp->::ccc::CC1x4y15::~CC1x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x4y15E(Test__ZN3ccc8CC1x4y15E, "_ZN3ccc8CC1x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x4y15C1Ev();
extern void _ZN3ccc8CC1x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x4y15E[] = {
  NSPAIR(_ZN3ccc8CC1x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC1x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x4y15E[];
Class_Descriptor cd__ZN3ccc8CC1x4y15E = {  "_ZN3ccc8CC1x4y15E", // class name
  bases__ZN3ccc8CC1x4y15E, 2,
  &(vtc__ZN3ccc8CC1x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y0  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y03pqrEv
  ~CC1x5y0(); // tgen
  CC1x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y0E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y03abcEv");}
void  ccc::CC1x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y03efgEv");}
void  ccc::CC1x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y03pqrEv");}
ccc::CC1x5y0 ::~CC1x5y0(){ note_dtor("_ZN3ccc7CC1x5y0E", this);} // tgen
ccc::CC1x5y0 ::CC1x5y0(){ note_ctor("_ZN3ccc7CC1x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y0E, buf);
    ::ccc::CC1x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y0E);
    dp->::ccc::CC1x5y0::~CC1x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y0E(Test__ZN3ccc7CC1x5y0E, "_ZN3ccc7CC1x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y0C1Ev();
extern void _ZN3ccc7CC1x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y0E[] = {
  NSPAIR(_ZN3ccc7CC1x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y0E[];
extern void _ZN3ccc7CC1x5y03abcEv();
extern void _ZN3ccc7CC1x5y03pqrEv();
extern void _ZN3ccc7CC1x5y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03pqrEv,_ZThn4_N3ccc7CC1x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03efgEv,_ZThn4_N3ccc7CC1x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y03abcEv,_ZThn4_N3ccc7CC1x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y03pqrEv,_ZThn4_N3ccc7CC1x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y03efgEv,_ZThn4_N3ccc7CC1x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y03abcEv,_ZThn4_N3ccc7CC1x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y0E[];
Class_Descriptor cd__ZN3ccc7CC1x5y0E = {  "_ZN3ccc7CC1x5y0E", // class name
  bases__ZN3ccc7CC1x5y0E, 2,
  &(vtc__ZN3ccc7CC1x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y1  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x5y13efgEv
  ~CC1x5y1(); // tgen
  CC1x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y1E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y13abcEv");}
void  ccc::CC1x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y13pqrEv");}
void  ccc::CC1x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y13efgEv");}
ccc::CC1x5y1 ::~CC1x5y1(){ note_dtor("_ZN3ccc7CC1x5y1E", this);} // tgen
ccc::CC1x5y1 ::CC1x5y1(){ note_ctor("_ZN3ccc7CC1x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y1E, buf);
    ::ccc::CC1x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y1E);
    dp->::ccc::CC1x5y1::~CC1x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y1E(Test__ZN3ccc7CC1x5y1E, "_ZN3ccc7CC1x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y1C1Ev();
extern void _ZN3ccc7CC1x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y1E[] = {
  NSPAIR(_ZN3ccc7CC1x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y1E[];
extern void _ZN3ccc7CC1x5y13abcEv();
extern void _ZN3ccc7CC1x5y13pqrEv();
extern void _ZN3ccc7CC1x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13pqrEv,_ZThn4_N3ccc7CC1x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13efgEv,_ZThn4_N3ccc7CC1x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y13abcEv,_ZThn4_N3ccc7CC1x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y13pqrEv,_ZThn4_N3ccc7CC1x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y13efgEv,_ZThn4_N3ccc7CC1x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y13abcEv,_ZThn4_N3ccc7CC1x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y1E[];
Class_Descriptor cd__ZN3ccc7CC1x5y1E = {  "_ZN3ccc7CC1x5y1E", // class name
  bases__ZN3ccc7CC1x5y1E, 2,
  &(vtc__ZN3ccc7CC1x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y2  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y23pqrEv
  ~CC1x5y2(); // tgen
  CC1x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y2E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y23efgEv");}
void  ccc::CC1x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y23abcEv");}
void  ccc::CC1x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y23pqrEv");}
ccc::CC1x5y2 ::~CC1x5y2(){ note_dtor("_ZN3ccc7CC1x5y2E", this);} // tgen
ccc::CC1x5y2 ::CC1x5y2(){ note_ctor("_ZN3ccc7CC1x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y2E, buf);
    ::ccc::CC1x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y2E);
    dp->::ccc::CC1x5y2::~CC1x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y2E(Test__ZN3ccc7CC1x5y2E, "_ZN3ccc7CC1x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y2C1Ev();
extern void _ZN3ccc7CC1x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y2E[] = {
  NSPAIR(_ZN3ccc7CC1x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y2E[];
extern void _ZN3ccc7CC1x5y23abcEv();
extern void _ZN3ccc7CC1x5y23pqrEv();
extern void _ZN3ccc7CC1x5y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23pqrEv,_ZThn4_N3ccc7CC1x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23efgEv,_ZThn4_N3ccc7CC1x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y23abcEv,_ZThn4_N3ccc7CC1x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y23pqrEv,_ZThn4_N3ccc7CC1x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y23efgEv,_ZThn4_N3ccc7CC1x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y23abcEv,_ZThn4_N3ccc7CC1x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y2E[];
Class_Descriptor cd__ZN3ccc7CC1x5y2E = {  "_ZN3ccc7CC1x5y2E", // class name
  bases__ZN3ccc7CC1x5y2E, 2,
  &(vtc__ZN3ccc7CC1x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y3  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x5y33abcEv
  ~CC1x5y3(); // tgen
  CC1x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y3E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y33efgEv");}
void  ccc::CC1x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y33pqrEv");}
void  ccc::CC1x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y33abcEv");}
ccc::CC1x5y3 ::~CC1x5y3(){ note_dtor("_ZN3ccc7CC1x5y3E", this);} // tgen
ccc::CC1x5y3 ::CC1x5y3(){ note_ctor("_ZN3ccc7CC1x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y3E, buf);
    ::ccc::CC1x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y3E);
    dp->::ccc::CC1x5y3::~CC1x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y3E(Test__ZN3ccc7CC1x5y3E, "_ZN3ccc7CC1x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y3C1Ev();
extern void _ZN3ccc7CC1x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y3E[] = {
  NSPAIR(_ZN3ccc7CC1x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y3E[];
extern void _ZN3ccc7CC1x5y33abcEv();
extern void _ZN3ccc7CC1x5y33pqrEv();
extern void _ZN3ccc7CC1x5y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33pqrEv,_ZThn4_N3ccc7CC1x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33efgEv,_ZThn4_N3ccc7CC1x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y33abcEv,_ZThn4_N3ccc7CC1x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y33pqrEv,_ZThn4_N3ccc7CC1x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y33efgEv,_ZThn4_N3ccc7CC1x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y33abcEv,_ZThn4_N3ccc7CC1x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y3E[];
Class_Descriptor cd__ZN3ccc7CC1x5y3E = {  "_ZN3ccc7CC1x5y3E", // class name
  bases__ZN3ccc7CC1x5y3E, 2,
  &(vtc__ZN3ccc7CC1x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y4  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC1x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y43efgEv
  ~CC1x5y4(); // tgen
  CC1x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y4E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y43pqrEv");}
void  ccc::CC1x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y43abcEv");}
void  ccc::CC1x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y43efgEv");}
ccc::CC1x5y4 ::~CC1x5y4(){ note_dtor("_ZN3ccc7CC1x5y4E", this);} // tgen
ccc::CC1x5y4 ::CC1x5y4(){ note_ctor("_ZN3ccc7CC1x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y4E, buf);
    ::ccc::CC1x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y4E);
    dp->::ccc::CC1x5y4::~CC1x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y4E(Test__ZN3ccc7CC1x5y4E, "_ZN3ccc7CC1x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y4C1Ev();
extern void _ZN3ccc7CC1x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y4E[] = {
  NSPAIR(_ZN3ccc7CC1x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y4E[];
extern void _ZN3ccc7CC1x5y43abcEv();
extern void _ZN3ccc7CC1x5y43pqrEv();
extern void _ZN3ccc7CC1x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43pqrEv,_ZThn4_N3ccc7CC1x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43efgEv,_ZThn4_N3ccc7CC1x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y43abcEv,_ZThn4_N3ccc7CC1x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y43pqrEv,_ZThn4_N3ccc7CC1x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y43efgEv,_ZThn4_N3ccc7CC1x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y43abcEv,_ZThn4_N3ccc7CC1x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y4E[];
Class_Descriptor cd__ZN3ccc7CC1x5y4E = {  "_ZN3ccc7CC1x5y4E", // class name
  bases__ZN3ccc7CC1x5y4E, 2,
  &(vtc__ZN3ccc7CC1x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y5  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC1x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y53abcEv
  ~CC1x5y5(); // tgen
  CC1x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y5E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y53pqrEv");}
void  ccc::CC1x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y53efgEv");}
void  ccc::CC1x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y53abcEv");}
ccc::CC1x5y5 ::~CC1x5y5(){ note_dtor("_ZN3ccc7CC1x5y5E", this);} // tgen
ccc::CC1x5y5 ::CC1x5y5(){ note_ctor("_ZN3ccc7CC1x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y5E, buf);
    ::ccc::CC1x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y5E);
    dp->::ccc::CC1x5y5::~CC1x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y5E(Test__ZN3ccc7CC1x5y5E, "_ZN3ccc7CC1x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y5C1Ev();
extern void _ZN3ccc7CC1x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y5E[] = {
  NSPAIR(_ZN3ccc7CC1x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y5E[];
extern void _ZN3ccc7CC1x5y53abcEv();
extern void _ZN3ccc7CC1x5y53pqrEv();
extern void _ZN3ccc7CC1x5y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53pqrEv,_ZThn4_N3ccc7CC1x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53efgEv,_ZThn4_N3ccc7CC1x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y53abcEv,_ZThn4_N3ccc7CC1x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y53pqrEv,_ZThn4_N3ccc7CC1x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y53efgEv,_ZThn4_N3ccc7CC1x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y53abcEv,_ZThn4_N3ccc7CC1x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y5E[];
Class_Descriptor cd__ZN3ccc7CC1x5y5E = {  "_ZN3ccc7CC1x5y5E", // class name
  bases__ZN3ccc7CC1x5y5E, 2,
  &(vtc__ZN3ccc7CC1x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y6  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x5y63efgEv
  ~CC1x5y6(); // tgen
  CC1x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y6E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y63abcEv");}
void  ccc::CC1x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y63efgEv");}
ccc::CC1x5y6 ::~CC1x5y6(){ note_dtor("_ZN3ccc7CC1x5y6E", this);} // tgen
ccc::CC1x5y6 ::CC1x5y6(){ note_ctor("_ZN3ccc7CC1x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y6E, buf);
    ::ccc::CC1x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y6E);
    dp->::ccc::CC1x5y6::~CC1x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y6E(Test__ZN3ccc7CC1x5y6E, "_ZN3ccc7CC1x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y6C1Ev();
extern void _ZN3ccc7CC1x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y6E[] = {
  NSPAIR(_ZN3ccc7CC1x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y6E[];
extern void _ZN3ccc7CC1x5y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y63efgEv,_ZThn4_N3ccc7CC1x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y63abcEv,_ZThn4_N3ccc7CC1x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y63efgEv,_ZThn4_N3ccc7CC1x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y63abcEv,_ZThn4_N3ccc7CC1x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y6E[];
Class_Descriptor cd__ZN3ccc7CC1x5y6E = {  "_ZN3ccc7CC1x5y6E", // class name
  bases__ZN3ccc7CC1x5y6E, 2,
  &(vtc__ZN3ccc7CC1x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y7  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC1x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y73pqrEv
  ~CC1x5y7(); // tgen
  CC1x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y7E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y73abcEv");}
void  ccc::CC1x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y73pqrEv");}
ccc::CC1x5y7 ::~CC1x5y7(){ note_dtor("_ZN3ccc7CC1x5y7E", this);} // tgen
ccc::CC1x5y7 ::CC1x5y7(){ note_ctor("_ZN3ccc7CC1x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y7E, buf);
    ::ccc::CC1x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y7E);
    dp->::ccc::CC1x5y7::~CC1x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y7E(Test__ZN3ccc7CC1x5y7E, "_ZN3ccc7CC1x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y7C1Ev();
extern void _ZN3ccc7CC1x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y7E[] = {
  NSPAIR(_ZN3ccc7CC1x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y7E[];
extern void _ZN3ccc7CC1x5y73abcEv();
extern void _ZN3ccc7CC1x5y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y73pqrEv,_ZThn4_N3ccc7CC1x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y73abcEv,_ZThn4_N3ccc7CC1x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y73pqrEv,_ZThn4_N3ccc7CC1x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y73abcEv,_ZThn4_N3ccc7CC1x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y7E[];
Class_Descriptor cd__ZN3ccc7CC1x5y7E = {  "_ZN3ccc7CC1x5y7E", // class name
  bases__ZN3ccc7CC1x5y7E, 2,
  &(vtc__ZN3ccc7CC1x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y8  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x5y83abcEv
  ~CC1x5y8(); // tgen
  CC1x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y8E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y83efgEv");}
void  ccc::CC1x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x5y83abcEv");}
ccc::CC1x5y8 ::~CC1x5y8(){ note_dtor("_ZN3ccc7CC1x5y8E", this);} // tgen
ccc::CC1x5y8 ::CC1x5y8(){ note_ctor("_ZN3ccc7CC1x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y8E, buf);
    ::ccc::CC1x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y8E);
    dp->::ccc::CC1x5y8::~CC1x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y8E(Test__ZN3ccc7CC1x5y8E, "_ZN3ccc7CC1x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y8C1Ev();
extern void _ZN3ccc7CC1x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y8E[] = {
  NSPAIR(_ZN3ccc7CC1x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y8E[];
extern void _ZN3ccc7CC1x5y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y83efgEv,_ZThn4_N3ccc7CC1x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y83abcEv,_ZThn4_N3ccc7CC1x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y83efgEv,_ZThn4_N3ccc7CC1x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y83abcEv,_ZThn4_N3ccc7CC1x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y8E[];
Class_Descriptor cd__ZN3ccc7CC1x5y8E = {  "_ZN3ccc7CC1x5y8E", // class name
  bases__ZN3ccc7CC1x5y8E, 2,
  &(vtc__ZN3ccc7CC1x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y9  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC1x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x5y93pqrEv
  ~CC1x5y9(); // tgen
  CC1x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x5y9E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x5y93efgEv");}
void  ccc::CC1x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x5y93pqrEv");}
ccc::CC1x5y9 ::~CC1x5y9(){ note_dtor("_ZN3ccc7CC1x5y9E", this);} // tgen
ccc::CC1x5y9 ::CC1x5y9(){ note_ctor("_ZN3ccc7CC1x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x5y9E, buf);
    ::ccc::CC1x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x5y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC1x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x5y9E);
    dp->::ccc::CC1x5y9::~CC1x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x5y9E(Test__ZN3ccc7CC1x5y9E, "_ZN3ccc7CC1x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x5y9C1Ev();
extern void _ZN3ccc7CC1x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x5y9E[] = {
  NSPAIR(_ZN3ccc7CC1x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC1x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x5y93pqrEv();
extern void _ZN3ccc7CC1x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y93pqrEv,_ZThn4_N3ccc7CC1x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x5y93efgEv,_ZThn4_N3ccc7CC1x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y93pqrEv,_ZThn4_N3ccc7CC1x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x5y93efgEv,_ZThn4_N3ccc7CC1x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x5y9E[];
Class_Descriptor cd__ZN3ccc7CC1x5y9E = {  "_ZN3ccc7CC1x5y9E", // class name
  bases__ZN3ccc7CC1x5y9E, 2,
  &(vtc__ZN3ccc7CC1x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y10  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x5y103abcEv
  ~CC1x5y10(); // tgen
  CC1x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y10E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y103pqrEv");}
void  ccc::CC1x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x5y103abcEv");}
ccc::CC1x5y10 ::~CC1x5y10(){ note_dtor("_ZN3ccc8CC1x5y10E", this);} // tgen
ccc::CC1x5y10 ::CC1x5y10(){ note_ctor("_ZN3ccc8CC1x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y10E, buf);
    ::ccc::CC1x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y10E);
    dp->::ccc::CC1x5y10::~CC1x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y10E(Test__ZN3ccc8CC1x5y10E, "_ZN3ccc8CC1x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y10C1Ev();
extern void _ZN3ccc8CC1x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y10E[] = {
  NSPAIR(_ZN3ccc8CC1x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y10E[];
extern void _ZN3ccc8CC1x5y103abcEv();
extern void _ZN3ccc8CC1x5y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y103pqrEv,_ZThn4_N3ccc8CC1x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y103abcEv,_ZThn4_N3ccc8CC1x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y103pqrEv,_ZThn4_N3ccc8CC1x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y103abcEv,_ZThn4_N3ccc8CC1x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y10E[];
Class_Descriptor cd__ZN3ccc8CC1x5y10E = {  "_ZN3ccc8CC1x5y10E", // class name
  bases__ZN3ccc8CC1x5y10E, 2,
  &(vtc__ZN3ccc8CC1x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y11  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x5y113efgEv
  ~CC1x5y11(); // tgen
  CC1x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y11E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y113pqrEv");}
void  ccc::CC1x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x5y113efgEv");}
ccc::CC1x5y11 ::~CC1x5y11(){ note_dtor("_ZN3ccc8CC1x5y11E", this);} // tgen
ccc::CC1x5y11 ::CC1x5y11(){ note_ctor("_ZN3ccc8CC1x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y11E, buf);
    ::ccc::CC1x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y11E);
    dp->::ccc::CC1x5y11::~CC1x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y11E(Test__ZN3ccc8CC1x5y11E, "_ZN3ccc8CC1x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y11C1Ev();
extern void _ZN3ccc8CC1x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y11E[] = {
  NSPAIR(_ZN3ccc8CC1x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x5y113pqrEv();
extern void _ZN3ccc8CC1x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y113pqrEv,_ZThn4_N3ccc8CC1x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y113efgEv,_ZThn4_N3ccc8CC1x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y113pqrEv,_ZThn4_N3ccc8CC1x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y113efgEv,_ZThn4_N3ccc8CC1x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y11E[];
Class_Descriptor cd__ZN3ccc8CC1x5y11E = {  "_ZN3ccc8CC1x5y11E", // class name
  bases__ZN3ccc8CC1x5y11E, 2,
  &(vtc__ZN3ccc8CC1x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y12  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC1x5y123abcEv
  ~CC1x5y12(); // tgen
  CC1x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC1x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x5y123abcEv");}
ccc::CC1x5y12 ::~CC1x5y12(){ note_dtor("_ZN3ccc8CC1x5y12E", this);} // tgen
ccc::CC1x5y12 ::CC1x5y12(){ note_ctor("_ZN3ccc8CC1x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y12E, buf);
    ::ccc::CC1x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y12E);
    dp->::ccc::CC1x5y12::~CC1x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y12E(Test__ZN3ccc8CC1x5y12E, "_ZN3ccc8CC1x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y12C1Ev();
extern void _ZN3ccc8CC1x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y12E[] = {
  NSPAIR(_ZN3ccc8CC1x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y12E[];
extern void _ZN3ccc8CC1x5y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y123abcEv,_ZThn4_N3ccc8CC1x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y123abcEv,_ZThn4_N3ccc8CC1x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y12E[];
Class_Descriptor cd__ZN3ccc8CC1x5y12E = {  "_ZN3ccc8CC1x5y12E", // class name
  bases__ZN3ccc8CC1x5y12E, 2,
  &(vtc__ZN3ccc8CC1x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y13  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC1x5y133efgEv
  ~CC1x5y13(); // tgen
  CC1x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC1x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x5y133efgEv");}
ccc::CC1x5y13 ::~CC1x5y13(){ note_dtor("_ZN3ccc8CC1x5y13E", this);} // tgen
ccc::CC1x5y13 ::CC1x5y13(){ note_ctor("_ZN3ccc8CC1x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y13E, buf);
    ::ccc::CC1x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y13E);
    dp->::ccc::CC1x5y13::~CC1x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y13E(Test__ZN3ccc8CC1x5y13E, "_ZN3ccc8CC1x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y13C1Ev();
extern void _ZN3ccc8CC1x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y13E[] = {
  NSPAIR(_ZN3ccc8CC1x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y133efgEv,_ZThn4_N3ccc8CC1x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y133efgEv,_ZThn4_N3ccc8CC1x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y13E[];
Class_Descriptor cd__ZN3ccc8CC1x5y13E = {  "_ZN3ccc8CC1x5y13E", // class name
  bases__ZN3ccc8CC1x5y13E, 2,
  &(vtc__ZN3ccc8CC1x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y14  : ::ccc::AA1 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC1x5y143pqrEv
  ~CC1x5y14(); // tgen
  CC1x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x5y143pqrEv");}
ccc::CC1x5y14 ::~CC1x5y14(){ note_dtor("_ZN3ccc8CC1x5y14E", this);} // tgen
ccc::CC1x5y14 ::CC1x5y14(){ note_ctor("_ZN3ccc8CC1x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y14E, buf);
    ::ccc::CC1x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y14E);
    dp->::ccc::CC1x5y14::~CC1x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y14E(Test__ZN3ccc8CC1x5y14E, "_ZN3ccc8CC1x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y14C1Ev();
extern void _ZN3ccc8CC1x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y14E[] = {
  NSPAIR(_ZN3ccc8CC1x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x5y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x5y143pqrEv,_ZThn4_N3ccc8CC1x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x5y143pqrEv,_ZThn4_N3ccc8CC1x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y14E[];
Class_Descriptor cd__ZN3ccc8CC1x5y14E = {  "_ZN3ccc8CC1x5y14E", // class name
  bases__ZN3ccc8CC1x5y14E, 2,
  &(vtc__ZN3ccc8CC1x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x5y15  : ::ccc::AA1 , ::ccc::BB5 {
  ~CC1x5y15(); // tgen
  CC1x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x5y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC1x5y15 ::~CC1x5y15(){ note_dtor("_ZN3ccc8CC1x5y15E", this);} // tgen
ccc::CC1x5y15 ::CC1x5y15(){ note_ctor("_ZN3ccc8CC1x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x5y15E, buf);
    ::ccc::CC1x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x5y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC1x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x5y15E);
    dp->::ccc::CC1x5y15::~CC1x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x5y15E(Test__ZN3ccc8CC1x5y15E, "_ZN3ccc8CC1x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x5y15C1Ev();
extern void _ZN3ccc8CC1x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x5y15E[] = {
  NSPAIR(_ZN3ccc8CC1x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC1x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x5y15E[];
Class_Descriptor cd__ZN3ccc8CC1x5y15E = {  "_ZN3ccc8CC1x5y15E", // class name
  bases__ZN3ccc8CC1x5y15E, 2,
  &(vtc__ZN3ccc8CC1x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y0  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y03pqrEv
  ~CC1x6y0(); // tgen
  CC1x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y0E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y03abcEv");}
void  ccc::CC1x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y03efgEv");}
void  ccc::CC1x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y03pqrEv");}
ccc::CC1x6y0 ::~CC1x6y0(){ note_dtor("_ZN3ccc7CC1x6y0E", this);} // tgen
ccc::CC1x6y0 ::CC1x6y0(){ note_ctor("_ZN3ccc7CC1x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y0E, buf);
    ::ccc::CC1x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y0E);
    dp->::ccc::CC1x6y0::~CC1x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y0E(Test__ZN3ccc7CC1x6y0E, "_ZN3ccc7CC1x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y0C1Ev();
extern void _ZN3ccc7CC1x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y0E[] = {
  NSPAIR(_ZN3ccc7CC1x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y0E[];
extern void _ZN3ccc7CC1x6y03abcEv();
extern void _ZN3ccc7CC1x6y03pqrEv();
extern void _ZN3ccc7CC1x6y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y03abcEv,_ZThn4_N3ccc7CC1x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y03efgEv,_ZThn4_N3ccc7CC1x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y03abcEv,_ZThn4_N3ccc7CC1x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y03efgEv,_ZThn4_N3ccc7CC1x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y0E[];
Class_Descriptor cd__ZN3ccc7CC1x6y0E = {  "_ZN3ccc7CC1x6y0E", // class name
  bases__ZN3ccc7CC1x6y0E, 2,
  &(vtc__ZN3ccc7CC1x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y1  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x6y13efgEv
  ~CC1x6y1(); // tgen
  CC1x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y1E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y13abcEv");}
void  ccc::CC1x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y13pqrEv");}
void  ccc::CC1x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y13efgEv");}
ccc::CC1x6y1 ::~CC1x6y1(){ note_dtor("_ZN3ccc7CC1x6y1E", this);} // tgen
ccc::CC1x6y1 ::CC1x6y1(){ note_ctor("_ZN3ccc7CC1x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y1E, buf);
    ::ccc::CC1x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y1E);
    dp->::ccc::CC1x6y1::~CC1x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y1E(Test__ZN3ccc7CC1x6y1E, "_ZN3ccc7CC1x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y1C1Ev();
extern void _ZN3ccc7CC1x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y1E[] = {
  NSPAIR(_ZN3ccc7CC1x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y1E[];
extern void _ZN3ccc7CC1x6y13abcEv();
extern void _ZN3ccc7CC1x6y13pqrEv();
extern void _ZN3ccc7CC1x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y13abcEv,_ZThn4_N3ccc7CC1x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y13efgEv,_ZThn4_N3ccc7CC1x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y13abcEv,_ZThn4_N3ccc7CC1x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y13efgEv,_ZThn4_N3ccc7CC1x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y1E[];
Class_Descriptor cd__ZN3ccc7CC1x6y1E = {  "_ZN3ccc7CC1x6y1E", // class name
  bases__ZN3ccc7CC1x6y1E, 2,
  &(vtc__ZN3ccc7CC1x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y2  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y23pqrEv
  ~CC1x6y2(); // tgen
  CC1x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y2E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y23efgEv");}
void  ccc::CC1x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y23abcEv");}
void  ccc::CC1x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y23pqrEv");}
ccc::CC1x6y2 ::~CC1x6y2(){ note_dtor("_ZN3ccc7CC1x6y2E", this);} // tgen
ccc::CC1x6y2 ::CC1x6y2(){ note_ctor("_ZN3ccc7CC1x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y2E, buf);
    ::ccc::CC1x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y2E);
    dp->::ccc::CC1x6y2::~CC1x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y2E(Test__ZN3ccc7CC1x6y2E, "_ZN3ccc7CC1x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y2C1Ev();
extern void _ZN3ccc7CC1x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y2E[] = {
  NSPAIR(_ZN3ccc7CC1x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y2E[];
extern void _ZN3ccc7CC1x6y23abcEv();
extern void _ZN3ccc7CC1x6y23pqrEv();
extern void _ZN3ccc7CC1x6y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y23abcEv,_ZThn4_N3ccc7CC1x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y23efgEv,_ZThn4_N3ccc7CC1x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y23abcEv,_ZThn4_N3ccc7CC1x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y23efgEv,_ZThn4_N3ccc7CC1x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y2E[];
Class_Descriptor cd__ZN3ccc7CC1x6y2E = {  "_ZN3ccc7CC1x6y2E", // class name
  bases__ZN3ccc7CC1x6y2E, 2,
  &(vtc__ZN3ccc7CC1x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y3  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x6y33abcEv
  ~CC1x6y3(); // tgen
  CC1x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y3E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y33efgEv");}
void  ccc::CC1x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y33pqrEv");}
void  ccc::CC1x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y33abcEv");}
ccc::CC1x6y3 ::~CC1x6y3(){ note_dtor("_ZN3ccc7CC1x6y3E", this);} // tgen
ccc::CC1x6y3 ::CC1x6y3(){ note_ctor("_ZN3ccc7CC1x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y3E, buf);
    ::ccc::CC1x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y3E);
    dp->::ccc::CC1x6y3::~CC1x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y3E(Test__ZN3ccc7CC1x6y3E, "_ZN3ccc7CC1x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y3C1Ev();
extern void _ZN3ccc7CC1x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y3E[] = {
  NSPAIR(_ZN3ccc7CC1x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y3E[];
extern void _ZN3ccc7CC1x6y33abcEv();
extern void _ZN3ccc7CC1x6y33pqrEv();
extern void _ZN3ccc7CC1x6y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y33abcEv,_ZThn4_N3ccc7CC1x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y33efgEv,_ZThn4_N3ccc7CC1x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y33abcEv,_ZThn4_N3ccc7CC1x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y33efgEv,_ZThn4_N3ccc7CC1x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y3E[];
Class_Descriptor cd__ZN3ccc7CC1x6y3E = {  "_ZN3ccc7CC1x6y3E", // class name
  bases__ZN3ccc7CC1x6y3E, 2,
  &(vtc__ZN3ccc7CC1x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y4  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC1x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y43efgEv
  ~CC1x6y4(); // tgen
  CC1x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y4E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y43pqrEv");}
void  ccc::CC1x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y43abcEv");}
void  ccc::CC1x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y43efgEv");}
ccc::CC1x6y4 ::~CC1x6y4(){ note_dtor("_ZN3ccc7CC1x6y4E", this);} // tgen
ccc::CC1x6y4 ::CC1x6y4(){ note_ctor("_ZN3ccc7CC1x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y4E, buf);
    ::ccc::CC1x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y4E);
    dp->::ccc::CC1x6y4::~CC1x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y4E(Test__ZN3ccc7CC1x6y4E, "_ZN3ccc7CC1x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y4C1Ev();
extern void _ZN3ccc7CC1x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y4E[] = {
  NSPAIR(_ZN3ccc7CC1x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y4E[];
extern void _ZN3ccc7CC1x6y43abcEv();
extern void _ZN3ccc7CC1x6y43pqrEv();
extern void _ZN3ccc7CC1x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y43abcEv,_ZThn4_N3ccc7CC1x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y43efgEv,_ZThn4_N3ccc7CC1x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y43abcEv,_ZThn4_N3ccc7CC1x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y43efgEv,_ZThn4_N3ccc7CC1x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y4E[];
Class_Descriptor cd__ZN3ccc7CC1x6y4E = {  "_ZN3ccc7CC1x6y4E", // class name
  bases__ZN3ccc7CC1x6y4E, 2,
  &(vtc__ZN3ccc7CC1x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y5  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC1x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y53abcEv
  ~CC1x6y5(); // tgen
  CC1x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y5E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y53pqrEv");}
void  ccc::CC1x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y53efgEv");}
void  ccc::CC1x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y53abcEv");}
ccc::CC1x6y5 ::~CC1x6y5(){ note_dtor("_ZN3ccc7CC1x6y5E", this);} // tgen
ccc::CC1x6y5 ::CC1x6y5(){ note_ctor("_ZN3ccc7CC1x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y5E, buf);
    ::ccc::CC1x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y5E);
    dp->::ccc::CC1x6y5::~CC1x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y5E(Test__ZN3ccc7CC1x6y5E, "_ZN3ccc7CC1x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y5C1Ev();
extern void _ZN3ccc7CC1x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y5E[] = {
  NSPAIR(_ZN3ccc7CC1x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y5E[];
extern void _ZN3ccc7CC1x6y53abcEv();
extern void _ZN3ccc7CC1x6y53pqrEv();
extern void _ZN3ccc7CC1x6y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y53abcEv,_ZThn4_N3ccc7CC1x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y53efgEv,_ZThn4_N3ccc7CC1x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y53abcEv,_ZThn4_N3ccc7CC1x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y53efgEv,_ZThn4_N3ccc7CC1x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y5E[];
Class_Descriptor cd__ZN3ccc7CC1x6y5E = {  "_ZN3ccc7CC1x6y5E", // class name
  bases__ZN3ccc7CC1x6y5E, 2,
  &(vtc__ZN3ccc7CC1x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y6  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x6y63efgEv
  ~CC1x6y6(); // tgen
  CC1x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y6E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y63abcEv");}
void  ccc::CC1x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y63efgEv");}
ccc::CC1x6y6 ::~CC1x6y6(){ note_dtor("_ZN3ccc7CC1x6y6E", this);} // tgen
ccc::CC1x6y6 ::CC1x6y6(){ note_ctor("_ZN3ccc7CC1x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y6E, buf);
    ::ccc::CC1x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y6E);
    dp->::ccc::CC1x6y6::~CC1x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y6E(Test__ZN3ccc7CC1x6y6E, "_ZN3ccc7CC1x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y6C1Ev();
extern void _ZN3ccc7CC1x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y6E[] = {
  NSPAIR(_ZN3ccc7CC1x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y6E[];
extern void _ZN3ccc7CC1x6y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y63abcEv,_ZThn4_N3ccc7CC1x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y63efgEv,_ZThn4_N3ccc7CC1x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y63abcEv,_ZThn4_N3ccc7CC1x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y63efgEv,_ZThn4_N3ccc7CC1x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y6E[];
Class_Descriptor cd__ZN3ccc7CC1x6y6E = {  "_ZN3ccc7CC1x6y6E", // class name
  bases__ZN3ccc7CC1x6y6E, 2,
  &(vtc__ZN3ccc7CC1x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y7  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC1x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y73pqrEv
  ~CC1x6y7(); // tgen
  CC1x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y7E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y73abcEv");}
void  ccc::CC1x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y73pqrEv");}
ccc::CC1x6y7 ::~CC1x6y7(){ note_dtor("_ZN3ccc7CC1x6y7E", this);} // tgen
ccc::CC1x6y7 ::CC1x6y7(){ note_ctor("_ZN3ccc7CC1x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y7E, buf);
    ::ccc::CC1x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y7E);
    dp->::ccc::CC1x6y7::~CC1x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y7E(Test__ZN3ccc7CC1x6y7E, "_ZN3ccc7CC1x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y7C1Ev();
extern void _ZN3ccc7CC1x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y7E[] = {
  NSPAIR(_ZN3ccc7CC1x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y7E[];
extern void _ZN3ccc7CC1x6y73abcEv();
extern void _ZN3ccc7CC1x6y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y73abcEv,_ZThn4_N3ccc7CC1x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y73abcEv,_ZThn4_N3ccc7CC1x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y7E[];
Class_Descriptor cd__ZN3ccc7CC1x6y7E = {  "_ZN3ccc7CC1x6y7E", // class name
  bases__ZN3ccc7CC1x6y7E, 2,
  &(vtc__ZN3ccc7CC1x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y8  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x6y83abcEv
  ~CC1x6y8(); // tgen
  CC1x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y8E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y83efgEv");}
void  ccc::CC1x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x6y83abcEv");}
ccc::CC1x6y8 ::~CC1x6y8(){ note_dtor("_ZN3ccc7CC1x6y8E", this);} // tgen
ccc::CC1x6y8 ::CC1x6y8(){ note_ctor("_ZN3ccc7CC1x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y8E, buf);
    ::ccc::CC1x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y8E);
    dp->::ccc::CC1x6y8::~CC1x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y8E(Test__ZN3ccc7CC1x6y8E, "_ZN3ccc7CC1x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y8C1Ev();
extern void _ZN3ccc7CC1x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y8E[] = {
  NSPAIR(_ZN3ccc7CC1x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y8E[];
extern void _ZN3ccc7CC1x6y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y83abcEv,_ZThn4_N3ccc7CC1x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y83efgEv,_ZThn4_N3ccc7CC1x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y83abcEv,_ZThn4_N3ccc7CC1x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y83efgEv,_ZThn4_N3ccc7CC1x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y8E[];
Class_Descriptor cd__ZN3ccc7CC1x6y8E = {  "_ZN3ccc7CC1x6y8E", // class name
  bases__ZN3ccc7CC1x6y8E, 2,
  &(vtc__ZN3ccc7CC1x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y9  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC1x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x6y93pqrEv
  ~CC1x6y9(); // tgen
  CC1x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x6y9E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x6y93efgEv");}
void  ccc::CC1x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x6y93pqrEv");}
ccc::CC1x6y9 ::~CC1x6y9(){ note_dtor("_ZN3ccc7CC1x6y9E", this);} // tgen
ccc::CC1x6y9 ::CC1x6y9(){ note_ctor("_ZN3ccc7CC1x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x6y9E, buf);
    ::ccc::CC1x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x6y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC1x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x6y9E);
    dp->::ccc::CC1x6y9::~CC1x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x6y9E(Test__ZN3ccc7CC1x6y9E, "_ZN3ccc7CC1x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x6y9C1Ev();
extern void _ZN3ccc7CC1x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x6y9E[] = {
  NSPAIR(_ZN3ccc7CC1x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC1x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x6y93pqrEv();
extern void _ZN3ccc7CC1x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x6y93efgEv,_ZThn4_N3ccc7CC1x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x6y93efgEv,_ZThn4_N3ccc7CC1x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x6y9E[];
Class_Descriptor cd__ZN3ccc7CC1x6y9E = {  "_ZN3ccc7CC1x6y9E", // class name
  bases__ZN3ccc7CC1x6y9E, 2,
  &(vtc__ZN3ccc7CC1x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y10  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x6y103abcEv
  ~CC1x6y10(); // tgen
  CC1x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y10E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y103pqrEv");}
void  ccc::CC1x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x6y103abcEv");}
ccc::CC1x6y10 ::~CC1x6y10(){ note_dtor("_ZN3ccc8CC1x6y10E", this);} // tgen
ccc::CC1x6y10 ::CC1x6y10(){ note_ctor("_ZN3ccc8CC1x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y10E, buf);
    ::ccc::CC1x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y10E);
    dp->::ccc::CC1x6y10::~CC1x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y10E(Test__ZN3ccc8CC1x6y10E, "_ZN3ccc8CC1x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y10C1Ev();
extern void _ZN3ccc8CC1x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y10E[] = {
  NSPAIR(_ZN3ccc8CC1x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y10E[];
extern void _ZN3ccc8CC1x6y103abcEv();
extern void _ZN3ccc8CC1x6y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y103abcEv,_ZThn4_N3ccc8CC1x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x6y103abcEv,_ZThn4_N3ccc8CC1x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y10E[];
Class_Descriptor cd__ZN3ccc8CC1x6y10E = {  "_ZN3ccc8CC1x6y10E", // class name
  bases__ZN3ccc8CC1x6y10E, 2,
  &(vtc__ZN3ccc8CC1x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y11  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x6y113efgEv
  ~CC1x6y11(); // tgen
  CC1x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y11E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y113pqrEv");}
void  ccc::CC1x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x6y113efgEv");}
ccc::CC1x6y11 ::~CC1x6y11(){ note_dtor("_ZN3ccc8CC1x6y11E", this);} // tgen
ccc::CC1x6y11 ::CC1x6y11(){ note_ctor("_ZN3ccc8CC1x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y11E, buf);
    ::ccc::CC1x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y11E);
    dp->::ccc::CC1x6y11::~CC1x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y11E(Test__ZN3ccc8CC1x6y11E, "_ZN3ccc8CC1x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y11C1Ev();
extern void _ZN3ccc8CC1x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y11E[] = {
  NSPAIR(_ZN3ccc8CC1x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x6y113pqrEv();
extern void _ZN3ccc8CC1x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y113efgEv,_ZThn4_N3ccc8CC1x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x6y113efgEv,_ZThn4_N3ccc8CC1x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y11E[];
Class_Descriptor cd__ZN3ccc8CC1x6y11E = {  "_ZN3ccc8CC1x6y11E", // class name
  bases__ZN3ccc8CC1x6y11E, 2,
  &(vtc__ZN3ccc8CC1x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y12  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC1x6y123abcEv
  ~CC1x6y12(); // tgen
  CC1x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x6y123abcEv");}
ccc::CC1x6y12 ::~CC1x6y12(){ note_dtor("_ZN3ccc8CC1x6y12E", this);} // tgen
ccc::CC1x6y12 ::CC1x6y12(){ note_ctor("_ZN3ccc8CC1x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y12E, buf);
    ::ccc::CC1x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y12E);
    dp->::ccc::CC1x6y12::~CC1x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y12E(Test__ZN3ccc8CC1x6y12E, "_ZN3ccc8CC1x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y12C1Ev();
extern void _ZN3ccc8CC1x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y12E[] = {
  NSPAIR(_ZN3ccc8CC1x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y12E[];
extern void _ZN3ccc8CC1x6y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y123abcEv,_ZThn4_N3ccc8CC1x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x6y123abcEv,_ZThn4_N3ccc8CC1x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y12E[];
Class_Descriptor cd__ZN3ccc8CC1x6y12E = {  "_ZN3ccc8CC1x6y12E", // class name
  bases__ZN3ccc8CC1x6y12E, 2,
  &(vtc__ZN3ccc8CC1x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y13  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC1x6y133efgEv
  ~CC1x6y13(); // tgen
  CC1x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x6y133efgEv");}
ccc::CC1x6y13 ::~CC1x6y13(){ note_dtor("_ZN3ccc8CC1x6y13E", this);} // tgen
ccc::CC1x6y13 ::CC1x6y13(){ note_ctor("_ZN3ccc8CC1x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y13E, buf);
    ::ccc::CC1x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y13E);
    dp->::ccc::CC1x6y13::~CC1x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y13E(Test__ZN3ccc8CC1x6y13E, "_ZN3ccc8CC1x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y13C1Ev();
extern void _ZN3ccc8CC1x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y13E[] = {
  NSPAIR(_ZN3ccc8CC1x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x6y133efgEv,_ZThn4_N3ccc8CC1x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x6y133efgEv,_ZThn4_N3ccc8CC1x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y13E[];
Class_Descriptor cd__ZN3ccc8CC1x6y13E = {  "_ZN3ccc8CC1x6y13E", // class name
  bases__ZN3ccc8CC1x6y13E, 2,
  &(vtc__ZN3ccc8CC1x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y14  : ::ccc::AA1 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC1x6y143pqrEv
  ~CC1x6y14(); // tgen
  CC1x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x6y143pqrEv");}
ccc::CC1x6y14 ::~CC1x6y14(){ note_dtor("_ZN3ccc8CC1x6y14E", this);} // tgen
ccc::CC1x6y14 ::CC1x6y14(){ note_ctor("_ZN3ccc8CC1x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y14E, buf);
    ::ccc::CC1x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y14E);
    dp->::ccc::CC1x6y14::~CC1x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y14E(Test__ZN3ccc8CC1x6y14E, "_ZN3ccc8CC1x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y14C1Ev();
extern void _ZN3ccc8CC1x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y14E[] = {
  NSPAIR(_ZN3ccc8CC1x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x6y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y14E[];
Class_Descriptor cd__ZN3ccc8CC1x6y14E = {  "_ZN3ccc8CC1x6y14E", // class name
  bases__ZN3ccc8CC1x6y14E, 2,
  &(vtc__ZN3ccc8CC1x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x6y15  : ::ccc::AA1 , ::ccc::BB6 {
  ~CC1x6y15(); // tgen
  CC1x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x6y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x6y15 ::~CC1x6y15(){ note_dtor("_ZN3ccc8CC1x6y15E", this);} // tgen
ccc::CC1x6y15 ::CC1x6y15(){ note_ctor("_ZN3ccc8CC1x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x6y15E, buf);
    ::ccc::CC1x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x6y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC1x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x6y15E);
    dp->::ccc::CC1x6y15::~CC1x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x6y15E(Test__ZN3ccc8CC1x6y15E, "_ZN3ccc8CC1x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x6y15C1Ev();
extern void _ZN3ccc8CC1x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x6y15E[] = {
  NSPAIR(_ZN3ccc8CC1x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC1x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x6y15E[];
Class_Descriptor cd__ZN3ccc8CC1x6y15E = {  "_ZN3ccc8CC1x6y15E", // class name
  bases__ZN3ccc8CC1x6y15E, 2,
  &(vtc__ZN3ccc8CC1x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y0  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y03pqrEv
  ~CC1x7y0(); // tgen
  CC1x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y0E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y03abcEv");}
void  ccc::CC1x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y03efgEv");}
void  ccc::CC1x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y03pqrEv");}
ccc::CC1x7y0 ::~CC1x7y0(){ note_dtor("_ZN3ccc7CC1x7y0E", this);} // tgen
ccc::CC1x7y0 ::CC1x7y0(){ note_ctor("_ZN3ccc7CC1x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y0E, buf);
    ::ccc::CC1x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y0E);
    dp->::ccc::CC1x7y0::~CC1x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y0E(Test__ZN3ccc7CC1x7y0E, "_ZN3ccc7CC1x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y0C1Ev();
extern void _ZN3ccc7CC1x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y0E[] = {
  NSPAIR(_ZN3ccc7CC1x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y0E[];
extern void _ZN3ccc7CC1x7y03abcEv();
extern void _ZN3ccc7CC1x7y03pqrEv();
extern void _ZN3ccc7CC1x7y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y03abcEv,_ZThn4_N3ccc7CC1x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y03pqrEv,_ZThn4_N3ccc7CC1x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y03abcEv,_ZThn4_N3ccc7CC1x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y03pqrEv,_ZThn4_N3ccc7CC1x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y0E[];
Class_Descriptor cd__ZN3ccc7CC1x7y0E = {  "_ZN3ccc7CC1x7y0E", // class name
  bases__ZN3ccc7CC1x7y0E, 2,
  &(vtc__ZN3ccc7CC1x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y1  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x7y13efgEv
  ~CC1x7y1(); // tgen
  CC1x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y1E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y13abcEv");}
void  ccc::CC1x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y13pqrEv");}
void  ccc::CC1x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y13efgEv");}
ccc::CC1x7y1 ::~CC1x7y1(){ note_dtor("_ZN3ccc7CC1x7y1E", this);} // tgen
ccc::CC1x7y1 ::CC1x7y1(){ note_ctor("_ZN3ccc7CC1x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y1E, buf);
    ::ccc::CC1x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y1E);
    dp->::ccc::CC1x7y1::~CC1x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y1E(Test__ZN3ccc7CC1x7y1E, "_ZN3ccc7CC1x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y1C1Ev();
extern void _ZN3ccc7CC1x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y1E[] = {
  NSPAIR(_ZN3ccc7CC1x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y1E[];
extern void _ZN3ccc7CC1x7y13abcEv();
extern void _ZN3ccc7CC1x7y13pqrEv();
extern void _ZN3ccc7CC1x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y13abcEv,_ZThn4_N3ccc7CC1x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y13pqrEv,_ZThn4_N3ccc7CC1x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y13abcEv,_ZThn4_N3ccc7CC1x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y13pqrEv,_ZThn4_N3ccc7CC1x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y1E[];
Class_Descriptor cd__ZN3ccc7CC1x7y1E = {  "_ZN3ccc7CC1x7y1E", // class name
  bases__ZN3ccc7CC1x7y1E, 2,
  &(vtc__ZN3ccc7CC1x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y2  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y23pqrEv
  ~CC1x7y2(); // tgen
  CC1x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y2E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y23efgEv");}
void  ccc::CC1x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y23abcEv");}
void  ccc::CC1x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y23pqrEv");}
ccc::CC1x7y2 ::~CC1x7y2(){ note_dtor("_ZN3ccc7CC1x7y2E", this);} // tgen
ccc::CC1x7y2 ::CC1x7y2(){ note_ctor("_ZN3ccc7CC1x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y2E, buf);
    ::ccc::CC1x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y2E);
    dp->::ccc::CC1x7y2::~CC1x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y2E(Test__ZN3ccc7CC1x7y2E, "_ZN3ccc7CC1x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y2C1Ev();
extern void _ZN3ccc7CC1x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y2E[] = {
  NSPAIR(_ZN3ccc7CC1x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y2E[];
extern void _ZN3ccc7CC1x7y23abcEv();
extern void _ZN3ccc7CC1x7y23pqrEv();
extern void _ZN3ccc7CC1x7y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y23abcEv,_ZThn4_N3ccc7CC1x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y23pqrEv,_ZThn4_N3ccc7CC1x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y23abcEv,_ZThn4_N3ccc7CC1x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y23pqrEv,_ZThn4_N3ccc7CC1x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y2E[];
Class_Descriptor cd__ZN3ccc7CC1x7y2E = {  "_ZN3ccc7CC1x7y2E", // class name
  bases__ZN3ccc7CC1x7y2E, 2,
  &(vtc__ZN3ccc7CC1x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y3  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x7y33abcEv
  ~CC1x7y3(); // tgen
  CC1x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y3E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y33efgEv");}
void  ccc::CC1x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y33pqrEv");}
void  ccc::CC1x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y33abcEv");}
ccc::CC1x7y3 ::~CC1x7y3(){ note_dtor("_ZN3ccc7CC1x7y3E", this);} // tgen
ccc::CC1x7y3 ::CC1x7y3(){ note_ctor("_ZN3ccc7CC1x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y3E, buf);
    ::ccc::CC1x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y3E);
    dp->::ccc::CC1x7y3::~CC1x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y3E(Test__ZN3ccc7CC1x7y3E, "_ZN3ccc7CC1x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y3C1Ev();
extern void _ZN3ccc7CC1x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y3E[] = {
  NSPAIR(_ZN3ccc7CC1x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y3E[];
extern void _ZN3ccc7CC1x7y33abcEv();
extern void _ZN3ccc7CC1x7y33pqrEv();
extern void _ZN3ccc7CC1x7y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y33abcEv,_ZThn4_N3ccc7CC1x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y33pqrEv,_ZThn4_N3ccc7CC1x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y33abcEv,_ZThn4_N3ccc7CC1x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y33pqrEv,_ZThn4_N3ccc7CC1x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y3E[];
Class_Descriptor cd__ZN3ccc7CC1x7y3E = {  "_ZN3ccc7CC1x7y3E", // class name
  bases__ZN3ccc7CC1x7y3E, 2,
  &(vtc__ZN3ccc7CC1x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y4  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC1x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y43efgEv
  ~CC1x7y4(); // tgen
  CC1x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y4E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y43pqrEv");}
void  ccc::CC1x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y43abcEv");}
void  ccc::CC1x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y43efgEv");}
ccc::CC1x7y4 ::~CC1x7y4(){ note_dtor("_ZN3ccc7CC1x7y4E", this);} // tgen
ccc::CC1x7y4 ::CC1x7y4(){ note_ctor("_ZN3ccc7CC1x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y4E, buf);
    ::ccc::CC1x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y4E);
    dp->::ccc::CC1x7y4::~CC1x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y4E(Test__ZN3ccc7CC1x7y4E, "_ZN3ccc7CC1x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y4C1Ev();
extern void _ZN3ccc7CC1x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y4E[] = {
  NSPAIR(_ZN3ccc7CC1x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y4E[];
extern void _ZN3ccc7CC1x7y43abcEv();
extern void _ZN3ccc7CC1x7y43pqrEv();
extern void _ZN3ccc7CC1x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y43abcEv,_ZThn4_N3ccc7CC1x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y43pqrEv,_ZThn4_N3ccc7CC1x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y43abcEv,_ZThn4_N3ccc7CC1x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y43pqrEv,_ZThn4_N3ccc7CC1x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y4E[];
Class_Descriptor cd__ZN3ccc7CC1x7y4E = {  "_ZN3ccc7CC1x7y4E", // class name
  bases__ZN3ccc7CC1x7y4E, 2,
  &(vtc__ZN3ccc7CC1x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y5  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC1x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y53abcEv
  ~CC1x7y5(); // tgen
  CC1x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y5E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y53pqrEv");}
void  ccc::CC1x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y53efgEv");}
void  ccc::CC1x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y53abcEv");}
ccc::CC1x7y5 ::~CC1x7y5(){ note_dtor("_ZN3ccc7CC1x7y5E", this);} // tgen
ccc::CC1x7y5 ::CC1x7y5(){ note_ctor("_ZN3ccc7CC1x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y5E, buf);
    ::ccc::CC1x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y5E);
    dp->::ccc::CC1x7y5::~CC1x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y5E(Test__ZN3ccc7CC1x7y5E, "_ZN3ccc7CC1x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y5C1Ev();
extern void _ZN3ccc7CC1x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y5E[] = {
  NSPAIR(_ZN3ccc7CC1x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y5E[];
extern void _ZN3ccc7CC1x7y53abcEv();
extern void _ZN3ccc7CC1x7y53pqrEv();
extern void _ZN3ccc7CC1x7y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y53abcEv,_ZThn4_N3ccc7CC1x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y53pqrEv,_ZThn4_N3ccc7CC1x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y53abcEv,_ZThn4_N3ccc7CC1x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y53pqrEv,_ZThn4_N3ccc7CC1x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y5E[];
Class_Descriptor cd__ZN3ccc7CC1x7y5E = {  "_ZN3ccc7CC1x7y5E", // class name
  bases__ZN3ccc7CC1x7y5E, 2,
  &(vtc__ZN3ccc7CC1x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y6  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x7y63efgEv
  ~CC1x7y6(); // tgen
  CC1x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y6E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y63abcEv");}
void  ccc::CC1x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y63efgEv");}
ccc::CC1x7y6 ::~CC1x7y6(){ note_dtor("_ZN3ccc7CC1x7y6E", this);} // tgen
ccc::CC1x7y6 ::CC1x7y6(){ note_ctor("_ZN3ccc7CC1x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y6E, buf);
    ::ccc::CC1x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y6E);
    dp->::ccc::CC1x7y6::~CC1x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y6E(Test__ZN3ccc7CC1x7y6E, "_ZN3ccc7CC1x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y6C1Ev();
extern void _ZN3ccc7CC1x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y6E[] = {
  NSPAIR(_ZN3ccc7CC1x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y6E[];
extern void _ZN3ccc7CC1x7y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y63abcEv,_ZThn4_N3ccc7CC1x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y63abcEv,_ZThn4_N3ccc7CC1x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y6E[];
Class_Descriptor cd__ZN3ccc7CC1x7y6E = {  "_ZN3ccc7CC1x7y6E", // class name
  bases__ZN3ccc7CC1x7y6E, 2,
  &(vtc__ZN3ccc7CC1x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y7  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC1x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y73pqrEv
  ~CC1x7y7(); // tgen
  CC1x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y7E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y73abcEv");}
void  ccc::CC1x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y73pqrEv");}
ccc::CC1x7y7 ::~CC1x7y7(){ note_dtor("_ZN3ccc7CC1x7y7E", this);} // tgen
ccc::CC1x7y7 ::CC1x7y7(){ note_ctor("_ZN3ccc7CC1x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y7E, buf);
    ::ccc::CC1x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y7E);
    dp->::ccc::CC1x7y7::~CC1x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y7E(Test__ZN3ccc7CC1x7y7E, "_ZN3ccc7CC1x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y7C1Ev();
extern void _ZN3ccc7CC1x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y7E[] = {
  NSPAIR(_ZN3ccc7CC1x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y7E[];
extern void _ZN3ccc7CC1x7y73abcEv();
extern void _ZN3ccc7CC1x7y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y73abcEv,_ZThn4_N3ccc7CC1x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y73pqrEv,_ZThn4_N3ccc7CC1x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y73abcEv,_ZThn4_N3ccc7CC1x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y73pqrEv,_ZThn4_N3ccc7CC1x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y7E[];
Class_Descriptor cd__ZN3ccc7CC1x7y7E = {  "_ZN3ccc7CC1x7y7E", // class name
  bases__ZN3ccc7CC1x7y7E, 2,
  &(vtc__ZN3ccc7CC1x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y8  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x7y83abcEv
  ~CC1x7y8(); // tgen
  CC1x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y8E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y83efgEv");}
void  ccc::CC1x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x7y83abcEv");}
ccc::CC1x7y8 ::~CC1x7y8(){ note_dtor("_ZN3ccc7CC1x7y8E", this);} // tgen
ccc::CC1x7y8 ::CC1x7y8(){ note_ctor("_ZN3ccc7CC1x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y8E, buf);
    ::ccc::CC1x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y8E);
    dp->::ccc::CC1x7y8::~CC1x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y8E(Test__ZN3ccc7CC1x7y8E, "_ZN3ccc7CC1x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y8C1Ev();
extern void _ZN3ccc7CC1x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y8E[] = {
  NSPAIR(_ZN3ccc7CC1x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y8E[];
extern void _ZN3ccc7CC1x7y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y83abcEv,_ZThn4_N3ccc7CC1x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y83abcEv,_ZThn4_N3ccc7CC1x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y8E[];
Class_Descriptor cd__ZN3ccc7CC1x7y8E = {  "_ZN3ccc7CC1x7y8E", // class name
  bases__ZN3ccc7CC1x7y8E, 2,
  &(vtc__ZN3ccc7CC1x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y9  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC1x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x7y93pqrEv
  ~CC1x7y9(); // tgen
  CC1x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x7y9E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x7y93efgEv");}
void  ccc::CC1x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x7y93pqrEv");}
ccc::CC1x7y9 ::~CC1x7y9(){ note_dtor("_ZN3ccc7CC1x7y9E", this);} // tgen
ccc::CC1x7y9 ::CC1x7y9(){ note_ctor("_ZN3ccc7CC1x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x7y9E, buf);
    ::ccc::CC1x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x7y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC1x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x7y9E);
    dp->::ccc::CC1x7y9::~CC1x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x7y9E(Test__ZN3ccc7CC1x7y9E, "_ZN3ccc7CC1x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x7y9C1Ev();
extern void _ZN3ccc7CC1x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x7y9E[] = {
  NSPAIR(_ZN3ccc7CC1x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC1x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x7y93pqrEv();
extern void _ZN3ccc7CC1x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x7y93pqrEv,_ZThn4_N3ccc7CC1x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x7y93pqrEv,_ZThn4_N3ccc7CC1x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x7y9E[];
Class_Descriptor cd__ZN3ccc7CC1x7y9E = {  "_ZN3ccc7CC1x7y9E", // class name
  bases__ZN3ccc7CC1x7y9E, 2,
  &(vtc__ZN3ccc7CC1x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y10  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x7y103abcEv
  ~CC1x7y10(); // tgen
  CC1x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y10E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y103pqrEv");}
void  ccc::CC1x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x7y103abcEv");}
ccc::CC1x7y10 ::~CC1x7y10(){ note_dtor("_ZN3ccc8CC1x7y10E", this);} // tgen
ccc::CC1x7y10 ::CC1x7y10(){ note_ctor("_ZN3ccc8CC1x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y10E, buf);
    ::ccc::CC1x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y10E);
    dp->::ccc::CC1x7y10::~CC1x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y10E(Test__ZN3ccc8CC1x7y10E, "_ZN3ccc8CC1x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y10C1Ev();
extern void _ZN3ccc8CC1x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y10E[] = {
  NSPAIR(_ZN3ccc8CC1x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y10E[];
extern void _ZN3ccc8CC1x7y103abcEv();
extern void _ZN3ccc8CC1x7y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y103abcEv,_ZThn4_N3ccc8CC1x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y103pqrEv,_ZThn4_N3ccc8CC1x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x7y103abcEv,_ZThn4_N3ccc8CC1x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x7y103pqrEv,_ZThn4_N3ccc8CC1x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y10E[];
Class_Descriptor cd__ZN3ccc8CC1x7y10E = {  "_ZN3ccc8CC1x7y10E", // class name
  bases__ZN3ccc8CC1x7y10E, 2,
  &(vtc__ZN3ccc8CC1x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y11  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x7y113efgEv
  ~CC1x7y11(); // tgen
  CC1x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y11E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y113pqrEv");}
void  ccc::CC1x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x7y113efgEv");}
ccc::CC1x7y11 ::~CC1x7y11(){ note_dtor("_ZN3ccc8CC1x7y11E", this);} // tgen
ccc::CC1x7y11 ::CC1x7y11(){ note_ctor("_ZN3ccc8CC1x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y11E, buf);
    ::ccc::CC1x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y11E);
    dp->::ccc::CC1x7y11::~CC1x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y11E(Test__ZN3ccc8CC1x7y11E, "_ZN3ccc8CC1x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y11C1Ev();
extern void _ZN3ccc8CC1x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y11E[] = {
  NSPAIR(_ZN3ccc8CC1x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x7y113pqrEv();
extern void _ZN3ccc8CC1x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y113pqrEv,_ZThn4_N3ccc8CC1x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x7y113pqrEv,_ZThn4_N3ccc8CC1x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y11E[];
Class_Descriptor cd__ZN3ccc8CC1x7y11E = {  "_ZN3ccc8CC1x7y11E", // class name
  bases__ZN3ccc8CC1x7y11E, 2,
  &(vtc__ZN3ccc8CC1x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y12  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC1x7y123abcEv
  ~CC1x7y12(); // tgen
  CC1x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y12E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x7y123abcEv");}
ccc::CC1x7y12 ::~CC1x7y12(){ note_dtor("_ZN3ccc8CC1x7y12E", this);} // tgen
ccc::CC1x7y12 ::CC1x7y12(){ note_ctor("_ZN3ccc8CC1x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y12E, buf);
    ::ccc::CC1x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y12E);
    dp->::ccc::CC1x7y12::~CC1x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y12E(Test__ZN3ccc8CC1x7y12E, "_ZN3ccc8CC1x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y12C1Ev();
extern void _ZN3ccc8CC1x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y12E[] = {
  NSPAIR(_ZN3ccc8CC1x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y12E[];
extern void _ZN3ccc8CC1x7y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y123abcEv,_ZThn4_N3ccc8CC1x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x7y123abcEv,_ZThn4_N3ccc8CC1x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y12E[];
Class_Descriptor cd__ZN3ccc8CC1x7y12E = {  "_ZN3ccc8CC1x7y12E", // class name
  bases__ZN3ccc8CC1x7y12E, 2,
  &(vtc__ZN3ccc8CC1x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y13  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC1x7y133efgEv
  ~CC1x7y13(); // tgen
  CC1x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x7y133efgEv");}
ccc::CC1x7y13 ::~CC1x7y13(){ note_dtor("_ZN3ccc8CC1x7y13E", this);} // tgen
ccc::CC1x7y13 ::CC1x7y13(){ note_ctor("_ZN3ccc8CC1x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y13E, buf);
    ::ccc::CC1x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y13E);
    dp->::ccc::CC1x7y13::~CC1x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y13E(Test__ZN3ccc8CC1x7y13E, "_ZN3ccc8CC1x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y13C1Ev();
extern void _ZN3ccc8CC1x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y13E[] = {
  NSPAIR(_ZN3ccc8CC1x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y13E[];
Class_Descriptor cd__ZN3ccc8CC1x7y13E = {  "_ZN3ccc8CC1x7y13E", // class name
  bases__ZN3ccc8CC1x7y13E, 2,
  &(vtc__ZN3ccc8CC1x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y14  : ::ccc::AA1 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC1x7y143pqrEv
  ~CC1x7y14(); // tgen
  CC1x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x7y143pqrEv");}
ccc::CC1x7y14 ::~CC1x7y14(){ note_dtor("_ZN3ccc8CC1x7y14E", this);} // tgen
ccc::CC1x7y14 ::CC1x7y14(){ note_ctor("_ZN3ccc8CC1x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y14E, buf);
    ::ccc::CC1x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y14E);
    dp->::ccc::CC1x7y14::~CC1x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y14E(Test__ZN3ccc8CC1x7y14E, "_ZN3ccc8CC1x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y14C1Ev();
extern void _ZN3ccc8CC1x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y14E[] = {
  NSPAIR(_ZN3ccc8CC1x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x7y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x7y143pqrEv,_ZThn4_N3ccc8CC1x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x7y143pqrEv,_ZThn4_N3ccc8CC1x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y14E[];
Class_Descriptor cd__ZN3ccc8CC1x7y14E = {  "_ZN3ccc8CC1x7y14E", // class name
  bases__ZN3ccc8CC1x7y14E, 2,
  &(vtc__ZN3ccc8CC1x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x7y15  : ::ccc::AA1 , ::ccc::BB7 {
  ~CC1x7y15(); // tgen
  CC1x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x7y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x7y15 ::~CC1x7y15(){ note_dtor("_ZN3ccc8CC1x7y15E", this);} // tgen
ccc::CC1x7y15 ::CC1x7y15(){ note_ctor("_ZN3ccc8CC1x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x7y15E, buf);
    ::ccc::CC1x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x7y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC1x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x7y15E);
    dp->::ccc::CC1x7y15::~CC1x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x7y15E(Test__ZN3ccc8CC1x7y15E, "_ZN3ccc8CC1x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x7y15C1Ev();
extern void _ZN3ccc8CC1x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x7y15E[] = {
  NSPAIR(_ZN3ccc8CC1x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC1x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x7y15E[];
Class_Descriptor cd__ZN3ccc8CC1x7y15E = {  "_ZN3ccc8CC1x7y15E", // class name
  bases__ZN3ccc8CC1x7y15E, 2,
  &(vtc__ZN3ccc8CC1x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y0  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y03pqrEv
  ~CC1x8y0(); // tgen
  CC1x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y0E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y03abcEv");}
void  ccc::CC1x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y03efgEv");}
void  ccc::CC1x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y03pqrEv");}
ccc::CC1x8y0 ::~CC1x8y0(){ note_dtor("_ZN3ccc7CC1x8y0E", this);} // tgen
ccc::CC1x8y0 ::CC1x8y0(){ note_ctor("_ZN3ccc7CC1x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y0E, buf);
    ::ccc::CC1x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y0E);
    dp->::ccc::CC1x8y0::~CC1x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y0E(Test__ZN3ccc7CC1x8y0E, "_ZN3ccc7CC1x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y0C1Ev();
extern void _ZN3ccc7CC1x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y0E[] = {
  NSPAIR(_ZN3ccc7CC1x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y0E[];
extern void _ZN3ccc7CC1x8y03abcEv();
extern void _ZN3ccc7CC1x8y03pqrEv();
extern void _ZN3ccc7CC1x8y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y03efgEv,_ZThn4_N3ccc7CC1x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y03abcEv,_ZThn4_N3ccc7CC1x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y03efgEv,_ZThn4_N3ccc7CC1x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y03abcEv,_ZThn4_N3ccc7CC1x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y0E[];
Class_Descriptor cd__ZN3ccc7CC1x8y0E = {  "_ZN3ccc7CC1x8y0E", // class name
  bases__ZN3ccc7CC1x8y0E, 2,
  &(vtc__ZN3ccc7CC1x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y1  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x8y13efgEv
  ~CC1x8y1(); // tgen
  CC1x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y1E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y13abcEv");}
void  ccc::CC1x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y13pqrEv");}
void  ccc::CC1x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y13efgEv");}
ccc::CC1x8y1 ::~CC1x8y1(){ note_dtor("_ZN3ccc7CC1x8y1E", this);} // tgen
ccc::CC1x8y1 ::CC1x8y1(){ note_ctor("_ZN3ccc7CC1x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y1E, buf);
    ::ccc::CC1x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y1E);
    dp->::ccc::CC1x8y1::~CC1x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y1E(Test__ZN3ccc7CC1x8y1E, "_ZN3ccc7CC1x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y1C1Ev();
extern void _ZN3ccc7CC1x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y1E[] = {
  NSPAIR(_ZN3ccc7CC1x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y1E[];
extern void _ZN3ccc7CC1x8y13abcEv();
extern void _ZN3ccc7CC1x8y13pqrEv();
extern void _ZN3ccc7CC1x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y13efgEv,_ZThn4_N3ccc7CC1x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y13abcEv,_ZThn4_N3ccc7CC1x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y13efgEv,_ZThn4_N3ccc7CC1x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y13abcEv,_ZThn4_N3ccc7CC1x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y1E[];
Class_Descriptor cd__ZN3ccc7CC1x8y1E = {  "_ZN3ccc7CC1x8y1E", // class name
  bases__ZN3ccc7CC1x8y1E, 2,
  &(vtc__ZN3ccc7CC1x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y2  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y23pqrEv
  ~CC1x8y2(); // tgen
  CC1x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y2E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y23efgEv");}
void  ccc::CC1x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y23abcEv");}
void  ccc::CC1x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y23pqrEv");}
ccc::CC1x8y2 ::~CC1x8y2(){ note_dtor("_ZN3ccc7CC1x8y2E", this);} // tgen
ccc::CC1x8y2 ::CC1x8y2(){ note_ctor("_ZN3ccc7CC1x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y2E, buf);
    ::ccc::CC1x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y2E);
    dp->::ccc::CC1x8y2::~CC1x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y2E(Test__ZN3ccc7CC1x8y2E, "_ZN3ccc7CC1x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y2C1Ev();
extern void _ZN3ccc7CC1x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y2E[] = {
  NSPAIR(_ZN3ccc7CC1x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y2E[];
extern void _ZN3ccc7CC1x8y23abcEv();
extern void _ZN3ccc7CC1x8y23pqrEv();
extern void _ZN3ccc7CC1x8y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y23efgEv,_ZThn4_N3ccc7CC1x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y23abcEv,_ZThn4_N3ccc7CC1x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y23efgEv,_ZThn4_N3ccc7CC1x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y23abcEv,_ZThn4_N3ccc7CC1x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y2E[];
Class_Descriptor cd__ZN3ccc7CC1x8y2E = {  "_ZN3ccc7CC1x8y2E", // class name
  bases__ZN3ccc7CC1x8y2E, 2,
  &(vtc__ZN3ccc7CC1x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y3  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x8y33abcEv
  ~CC1x8y3(); // tgen
  CC1x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y3E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y33efgEv");}
void  ccc::CC1x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y33pqrEv");}
void  ccc::CC1x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y33abcEv");}
ccc::CC1x8y3 ::~CC1x8y3(){ note_dtor("_ZN3ccc7CC1x8y3E", this);} // tgen
ccc::CC1x8y3 ::CC1x8y3(){ note_ctor("_ZN3ccc7CC1x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y3E, buf);
    ::ccc::CC1x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y3E);
    dp->::ccc::CC1x8y3::~CC1x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y3E(Test__ZN3ccc7CC1x8y3E, "_ZN3ccc7CC1x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y3C1Ev();
extern void _ZN3ccc7CC1x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y3E[] = {
  NSPAIR(_ZN3ccc7CC1x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y3E[];
extern void _ZN3ccc7CC1x8y33abcEv();
extern void _ZN3ccc7CC1x8y33pqrEv();
extern void _ZN3ccc7CC1x8y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y33efgEv,_ZThn4_N3ccc7CC1x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y33abcEv,_ZThn4_N3ccc7CC1x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y33efgEv,_ZThn4_N3ccc7CC1x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y33abcEv,_ZThn4_N3ccc7CC1x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y3E[];
Class_Descriptor cd__ZN3ccc7CC1x8y3E = {  "_ZN3ccc7CC1x8y3E", // class name
  bases__ZN3ccc7CC1x8y3E, 2,
  &(vtc__ZN3ccc7CC1x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y4  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC1x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y43efgEv
  ~CC1x8y4(); // tgen
  CC1x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y4E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y43pqrEv");}
void  ccc::CC1x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y43abcEv");}
void  ccc::CC1x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y43efgEv");}
ccc::CC1x8y4 ::~CC1x8y4(){ note_dtor("_ZN3ccc7CC1x8y4E", this);} // tgen
ccc::CC1x8y4 ::CC1x8y4(){ note_ctor("_ZN3ccc7CC1x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y4E, buf);
    ::ccc::CC1x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y4E);
    dp->::ccc::CC1x8y4::~CC1x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y4E(Test__ZN3ccc7CC1x8y4E, "_ZN3ccc7CC1x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y4C1Ev();
extern void _ZN3ccc7CC1x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y4E[] = {
  NSPAIR(_ZN3ccc7CC1x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y4E[];
extern void _ZN3ccc7CC1x8y43abcEv();
extern void _ZN3ccc7CC1x8y43pqrEv();
extern void _ZN3ccc7CC1x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y43efgEv,_ZThn4_N3ccc7CC1x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y43abcEv,_ZThn4_N3ccc7CC1x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y43efgEv,_ZThn4_N3ccc7CC1x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y43abcEv,_ZThn4_N3ccc7CC1x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y4E[];
Class_Descriptor cd__ZN3ccc7CC1x8y4E = {  "_ZN3ccc7CC1x8y4E", // class name
  bases__ZN3ccc7CC1x8y4E, 2,
  &(vtc__ZN3ccc7CC1x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y5  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC1x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y53abcEv
  ~CC1x8y5(); // tgen
  CC1x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y5E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y53pqrEv");}
void  ccc::CC1x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y53efgEv");}
void  ccc::CC1x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y53abcEv");}
ccc::CC1x8y5 ::~CC1x8y5(){ note_dtor("_ZN3ccc7CC1x8y5E", this);} // tgen
ccc::CC1x8y5 ::CC1x8y5(){ note_ctor("_ZN3ccc7CC1x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y5E, buf);
    ::ccc::CC1x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y5E);
    dp->::ccc::CC1x8y5::~CC1x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y5E(Test__ZN3ccc7CC1x8y5E, "_ZN3ccc7CC1x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y5C1Ev();
extern void _ZN3ccc7CC1x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y5E[] = {
  NSPAIR(_ZN3ccc7CC1x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y5E[];
extern void _ZN3ccc7CC1x8y53abcEv();
extern void _ZN3ccc7CC1x8y53pqrEv();
extern void _ZN3ccc7CC1x8y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y53efgEv,_ZThn4_N3ccc7CC1x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y53abcEv,_ZThn4_N3ccc7CC1x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y53efgEv,_ZThn4_N3ccc7CC1x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y53abcEv,_ZThn4_N3ccc7CC1x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y5E[];
Class_Descriptor cd__ZN3ccc7CC1x8y5E = {  "_ZN3ccc7CC1x8y5E", // class name
  bases__ZN3ccc7CC1x8y5E, 2,
  &(vtc__ZN3ccc7CC1x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y6  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x8y63efgEv
  ~CC1x8y6(); // tgen
  CC1x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y6E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y63abcEv");}
void  ccc::CC1x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y63efgEv");}
ccc::CC1x8y6 ::~CC1x8y6(){ note_dtor("_ZN3ccc7CC1x8y6E", this);} // tgen
ccc::CC1x8y6 ::CC1x8y6(){ note_ctor("_ZN3ccc7CC1x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y6E, buf);
    ::ccc::CC1x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y6E);
    dp->::ccc::CC1x8y6::~CC1x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y6E(Test__ZN3ccc7CC1x8y6E, "_ZN3ccc7CC1x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y6C1Ev();
extern void _ZN3ccc7CC1x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y6E[] = {
  NSPAIR(_ZN3ccc7CC1x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y6E[];
extern void _ZN3ccc7CC1x8y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y63efgEv,_ZThn4_N3ccc7CC1x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y63abcEv,_ZThn4_N3ccc7CC1x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y63efgEv,_ZThn4_N3ccc7CC1x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y63abcEv,_ZThn4_N3ccc7CC1x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y6E[];
Class_Descriptor cd__ZN3ccc7CC1x8y6E = {  "_ZN3ccc7CC1x8y6E", // class name
  bases__ZN3ccc7CC1x8y6E, 2,
  &(vtc__ZN3ccc7CC1x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y7  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC1x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y73pqrEv
  ~CC1x8y7(); // tgen
  CC1x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y7E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y73abcEv");}
void  ccc::CC1x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y73pqrEv");}
ccc::CC1x8y7 ::~CC1x8y7(){ note_dtor("_ZN3ccc7CC1x8y7E", this);} // tgen
ccc::CC1x8y7 ::CC1x8y7(){ note_ctor("_ZN3ccc7CC1x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y7E, buf);
    ::ccc::CC1x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y7E);
    dp->::ccc::CC1x8y7::~CC1x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y7E(Test__ZN3ccc7CC1x8y7E, "_ZN3ccc7CC1x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y7C1Ev();
extern void _ZN3ccc7CC1x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y7E[] = {
  NSPAIR(_ZN3ccc7CC1x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y7E[];
extern void _ZN3ccc7CC1x8y73abcEv();
extern void _ZN3ccc7CC1x8y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y73abcEv,_ZThn4_N3ccc7CC1x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y73abcEv,_ZThn4_N3ccc7CC1x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y7E[];
Class_Descriptor cd__ZN3ccc7CC1x8y7E = {  "_ZN3ccc7CC1x8y7E", // class name
  bases__ZN3ccc7CC1x8y7E, 2,
  &(vtc__ZN3ccc7CC1x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y8  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x8y83abcEv
  ~CC1x8y8(); // tgen
  CC1x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y8E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y83efgEv");}
void  ccc::CC1x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x8y83abcEv");}
ccc::CC1x8y8 ::~CC1x8y8(){ note_dtor("_ZN3ccc7CC1x8y8E", this);} // tgen
ccc::CC1x8y8 ::CC1x8y8(){ note_ctor("_ZN3ccc7CC1x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y8E, buf);
    ::ccc::CC1x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y8E);
    dp->::ccc::CC1x8y8::~CC1x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y8E(Test__ZN3ccc7CC1x8y8E, "_ZN3ccc7CC1x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y8C1Ev();
extern void _ZN3ccc7CC1x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y8E[] = {
  NSPAIR(_ZN3ccc7CC1x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y8E[];
extern void _ZN3ccc7CC1x8y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y83efgEv,_ZThn4_N3ccc7CC1x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y83abcEv,_ZThn4_N3ccc7CC1x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y83efgEv,_ZThn4_N3ccc7CC1x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y83abcEv,_ZThn4_N3ccc7CC1x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y8E[];
Class_Descriptor cd__ZN3ccc7CC1x8y8E = {  "_ZN3ccc7CC1x8y8E", // class name
  bases__ZN3ccc7CC1x8y8E, 2,
  &(vtc__ZN3ccc7CC1x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y9  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC1x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x8y93pqrEv
  ~CC1x8y9(); // tgen
  CC1x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x8y9E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x8y93efgEv");}
void  ccc::CC1x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x8y93pqrEv");}
ccc::CC1x8y9 ::~CC1x8y9(){ note_dtor("_ZN3ccc7CC1x8y9E", this);} // tgen
ccc::CC1x8y9 ::CC1x8y9(){ note_ctor("_ZN3ccc7CC1x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x8y9E, buf);
    ::ccc::CC1x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x8y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC1x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x8y9E);
    dp->::ccc::CC1x8y9::~CC1x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x8y9E(Test__ZN3ccc7CC1x8y9E, "_ZN3ccc7CC1x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x8y9C1Ev();
extern void _ZN3ccc7CC1x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x8y9E[] = {
  NSPAIR(_ZN3ccc7CC1x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC1x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x8y93pqrEv();
extern void _ZN3ccc7CC1x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x8y93efgEv,_ZThn4_N3ccc7CC1x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x8y93efgEv,_ZThn4_N3ccc7CC1x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x8y9E[];
Class_Descriptor cd__ZN3ccc7CC1x8y9E = {  "_ZN3ccc7CC1x8y9E", // class name
  bases__ZN3ccc7CC1x8y9E, 2,
  &(vtc__ZN3ccc7CC1x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y10  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x8y103abcEv
  ~CC1x8y10(); // tgen
  CC1x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y10E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y103pqrEv");}
void  ccc::CC1x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x8y103abcEv");}
ccc::CC1x8y10 ::~CC1x8y10(){ note_dtor("_ZN3ccc8CC1x8y10E", this);} // tgen
ccc::CC1x8y10 ::CC1x8y10(){ note_ctor("_ZN3ccc8CC1x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y10E, buf);
    ::ccc::CC1x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y10E);
    dp->::ccc::CC1x8y10::~CC1x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y10E(Test__ZN3ccc8CC1x8y10E, "_ZN3ccc8CC1x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y10C1Ev();
extern void _ZN3ccc8CC1x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y10E[] = {
  NSPAIR(_ZN3ccc8CC1x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y10E[];
extern void _ZN3ccc8CC1x8y103abcEv();
extern void _ZN3ccc8CC1x8y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y103abcEv,_ZThn4_N3ccc8CC1x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x8y103abcEv,_ZThn4_N3ccc8CC1x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y10E[];
Class_Descriptor cd__ZN3ccc8CC1x8y10E = {  "_ZN3ccc8CC1x8y10E", // class name
  bases__ZN3ccc8CC1x8y10E, 2,
  &(vtc__ZN3ccc8CC1x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y11  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x8y113efgEv
  ~CC1x8y11(); // tgen
  CC1x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y11E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y113pqrEv");}
void  ccc::CC1x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x8y113efgEv");}
ccc::CC1x8y11 ::~CC1x8y11(){ note_dtor("_ZN3ccc8CC1x8y11E", this);} // tgen
ccc::CC1x8y11 ::CC1x8y11(){ note_ctor("_ZN3ccc8CC1x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y11E, buf);
    ::ccc::CC1x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y11E);
    dp->::ccc::CC1x8y11::~CC1x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y11E(Test__ZN3ccc8CC1x8y11E, "_ZN3ccc8CC1x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y11C1Ev();
extern void _ZN3ccc8CC1x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y11E[] = {
  NSPAIR(_ZN3ccc8CC1x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x8y113pqrEv();
extern void _ZN3ccc8CC1x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y113efgEv,_ZThn4_N3ccc8CC1x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x8y113efgEv,_ZThn4_N3ccc8CC1x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y11E[];
Class_Descriptor cd__ZN3ccc8CC1x8y11E = {  "_ZN3ccc8CC1x8y11E", // class name
  bases__ZN3ccc8CC1x8y11E, 2,
  &(vtc__ZN3ccc8CC1x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y12  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC1x8y123abcEv
  ~CC1x8y12(); // tgen
  CC1x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x8y123abcEv");}
ccc::CC1x8y12 ::~CC1x8y12(){ note_dtor("_ZN3ccc8CC1x8y12E", this);} // tgen
ccc::CC1x8y12 ::CC1x8y12(){ note_ctor("_ZN3ccc8CC1x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y12E, buf);
    ::ccc::CC1x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y12E);
    dp->::ccc::CC1x8y12::~CC1x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y12E(Test__ZN3ccc8CC1x8y12E, "_ZN3ccc8CC1x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y12C1Ev();
extern void _ZN3ccc8CC1x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y12E[] = {
  NSPAIR(_ZN3ccc8CC1x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y12E[];
extern void _ZN3ccc8CC1x8y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y123abcEv,_ZThn4_N3ccc8CC1x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x8y123abcEv,_ZThn4_N3ccc8CC1x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y12E[];
Class_Descriptor cd__ZN3ccc8CC1x8y12E = {  "_ZN3ccc8CC1x8y12E", // class name
  bases__ZN3ccc8CC1x8y12E, 2,
  &(vtc__ZN3ccc8CC1x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y13  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC1x8y133efgEv
  ~CC1x8y13(); // tgen
  CC1x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x8y133efgEv");}
ccc::CC1x8y13 ::~CC1x8y13(){ note_dtor("_ZN3ccc8CC1x8y13E", this);} // tgen
ccc::CC1x8y13 ::CC1x8y13(){ note_ctor("_ZN3ccc8CC1x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y13E, buf);
    ::ccc::CC1x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y13E);
    dp->::ccc::CC1x8y13::~CC1x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y13E(Test__ZN3ccc8CC1x8y13E, "_ZN3ccc8CC1x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y13C1Ev();
extern void _ZN3ccc8CC1x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y13E[] = {
  NSPAIR(_ZN3ccc8CC1x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x8y133efgEv,_ZThn4_N3ccc8CC1x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x8y133efgEv,_ZThn4_N3ccc8CC1x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y13E[];
Class_Descriptor cd__ZN3ccc8CC1x8y13E = {  "_ZN3ccc8CC1x8y13E", // class name
  bases__ZN3ccc8CC1x8y13E, 2,
  &(vtc__ZN3ccc8CC1x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y14  : ::ccc::AA1 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC1x8y143pqrEv
  ~CC1x8y14(); // tgen
  CC1x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x8y143pqrEv");}
ccc::CC1x8y14 ::~CC1x8y14(){ note_dtor("_ZN3ccc8CC1x8y14E", this);} // tgen
ccc::CC1x8y14 ::CC1x8y14(){ note_ctor("_ZN3ccc8CC1x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y14E, buf);
    ::ccc::CC1x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y14E);
    dp->::ccc::CC1x8y14::~CC1x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y14E(Test__ZN3ccc8CC1x8y14E, "_ZN3ccc8CC1x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y14C1Ev();
extern void _ZN3ccc8CC1x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y14E[] = {
  NSPAIR(_ZN3ccc8CC1x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x8y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y14E[];
Class_Descriptor cd__ZN3ccc8CC1x8y14E = {  "_ZN3ccc8CC1x8y14E", // class name
  bases__ZN3ccc8CC1x8y14E, 2,
  &(vtc__ZN3ccc8CC1x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x8y15  : ::ccc::AA1 , ::ccc::BB8 {
  ~CC1x8y15(); // tgen
  CC1x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x8y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x8y15 ::~CC1x8y15(){ note_dtor("_ZN3ccc8CC1x8y15E", this);} // tgen
ccc::CC1x8y15 ::CC1x8y15(){ note_ctor("_ZN3ccc8CC1x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x8y15E, buf);
    ::ccc::CC1x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x8y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC1x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x8y15E);
    dp->::ccc::CC1x8y15::~CC1x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x8y15E(Test__ZN3ccc8CC1x8y15E, "_ZN3ccc8CC1x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x8y15C1Ev();
extern void _ZN3ccc8CC1x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x8y15E[] = {
  NSPAIR(_ZN3ccc8CC1x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC1x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x8y15E[];
Class_Descriptor cd__ZN3ccc8CC1x8y15E = {  "_ZN3ccc8CC1x8y15E", // class name
  bases__ZN3ccc8CC1x8y15E, 2,
  &(vtc__ZN3ccc8CC1x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y0  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y03pqrEv
  ~CC1x9y0(); // tgen
  CC1x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y0E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y03abcEv");}
void  ccc::CC1x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y03efgEv");}
void  ccc::CC1x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y03pqrEv");}
ccc::CC1x9y0 ::~CC1x9y0(){ note_dtor("_ZN3ccc7CC1x9y0E", this);} // tgen
ccc::CC1x9y0 ::CC1x9y0(){ note_ctor("_ZN3ccc7CC1x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y0E, buf);
    ::ccc::CC1x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y0E);
    dp->::ccc::CC1x9y0::~CC1x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y0E(Test__ZN3ccc7CC1x9y0E, "_ZN3ccc7CC1x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y0C1Ev();
extern void _ZN3ccc7CC1x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y0E[] = {
  NSPAIR(_ZN3ccc7CC1x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y0E[];
extern void _ZN3ccc7CC1x9y03abcEv();
extern void _ZN3ccc7CC1x9y03pqrEv();
extern void _ZN3ccc7CC1x9y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y03efgEv,_ZThn4_N3ccc7CC1x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y03pqrEv,_ZThn4_N3ccc7CC1x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y03efgEv,_ZThn4_N3ccc7CC1x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y03pqrEv,_ZThn4_N3ccc7CC1x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y0E[];
Class_Descriptor cd__ZN3ccc7CC1x9y0E = {  "_ZN3ccc7CC1x9y0E", // class name
  bases__ZN3ccc7CC1x9y0E, 2,
  &(vtc__ZN3ccc7CC1x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y1  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x9y13efgEv
  ~CC1x9y1(); // tgen
  CC1x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y1E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y13abcEv");}
void  ccc::CC1x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y13pqrEv");}
void  ccc::CC1x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y13efgEv");}
ccc::CC1x9y1 ::~CC1x9y1(){ note_dtor("_ZN3ccc7CC1x9y1E", this);} // tgen
ccc::CC1x9y1 ::CC1x9y1(){ note_ctor("_ZN3ccc7CC1x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y1E, buf);
    ::ccc::CC1x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y1E);
    dp->::ccc::CC1x9y1::~CC1x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y1E(Test__ZN3ccc7CC1x9y1E, "_ZN3ccc7CC1x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y1C1Ev();
extern void _ZN3ccc7CC1x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y1E[] = {
  NSPAIR(_ZN3ccc7CC1x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y1E[];
extern void _ZN3ccc7CC1x9y13abcEv();
extern void _ZN3ccc7CC1x9y13pqrEv();
extern void _ZN3ccc7CC1x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y13efgEv,_ZThn4_N3ccc7CC1x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y13pqrEv,_ZThn4_N3ccc7CC1x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y13efgEv,_ZThn4_N3ccc7CC1x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y13pqrEv,_ZThn4_N3ccc7CC1x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y1E[];
Class_Descriptor cd__ZN3ccc7CC1x9y1E = {  "_ZN3ccc7CC1x9y1E", // class name
  bases__ZN3ccc7CC1x9y1E, 2,
  &(vtc__ZN3ccc7CC1x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y2  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y23pqrEv
  ~CC1x9y2(); // tgen
  CC1x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y2E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y23efgEv");}
void  ccc::CC1x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y23abcEv");}
void  ccc::CC1x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y23pqrEv");}
ccc::CC1x9y2 ::~CC1x9y2(){ note_dtor("_ZN3ccc7CC1x9y2E", this);} // tgen
ccc::CC1x9y2 ::CC1x9y2(){ note_ctor("_ZN3ccc7CC1x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y2E, buf);
    ::ccc::CC1x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y2E);
    dp->::ccc::CC1x9y2::~CC1x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y2E(Test__ZN3ccc7CC1x9y2E, "_ZN3ccc7CC1x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y2C1Ev();
extern void _ZN3ccc7CC1x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y2E[] = {
  NSPAIR(_ZN3ccc7CC1x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y2E[];
extern void _ZN3ccc7CC1x9y23abcEv();
extern void _ZN3ccc7CC1x9y23pqrEv();
extern void _ZN3ccc7CC1x9y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y23efgEv,_ZThn4_N3ccc7CC1x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y23pqrEv,_ZThn4_N3ccc7CC1x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y23efgEv,_ZThn4_N3ccc7CC1x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y23pqrEv,_ZThn4_N3ccc7CC1x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y2E[];
Class_Descriptor cd__ZN3ccc7CC1x9y2E = {  "_ZN3ccc7CC1x9y2E", // class name
  bases__ZN3ccc7CC1x9y2E, 2,
  &(vtc__ZN3ccc7CC1x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y3  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x9y33abcEv
  ~CC1x9y3(); // tgen
  CC1x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y3E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y33efgEv");}
void  ccc::CC1x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y33pqrEv");}
void  ccc::CC1x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y33abcEv");}
ccc::CC1x9y3 ::~CC1x9y3(){ note_dtor("_ZN3ccc7CC1x9y3E", this);} // tgen
ccc::CC1x9y3 ::CC1x9y3(){ note_ctor("_ZN3ccc7CC1x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y3E, buf);
    ::ccc::CC1x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y3E);
    dp->::ccc::CC1x9y3::~CC1x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y3E(Test__ZN3ccc7CC1x9y3E, "_ZN3ccc7CC1x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y3C1Ev();
extern void _ZN3ccc7CC1x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y3E[] = {
  NSPAIR(_ZN3ccc7CC1x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y3E[];
extern void _ZN3ccc7CC1x9y33abcEv();
extern void _ZN3ccc7CC1x9y33pqrEv();
extern void _ZN3ccc7CC1x9y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y33efgEv,_ZThn4_N3ccc7CC1x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y33pqrEv,_ZThn4_N3ccc7CC1x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y33efgEv,_ZThn4_N3ccc7CC1x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y33pqrEv,_ZThn4_N3ccc7CC1x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y3E[];
Class_Descriptor cd__ZN3ccc7CC1x9y3E = {  "_ZN3ccc7CC1x9y3E", // class name
  bases__ZN3ccc7CC1x9y3E, 2,
  &(vtc__ZN3ccc7CC1x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y4  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC1x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC1x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y43efgEv
  ~CC1x9y4(); // tgen
  CC1x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y4E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y43pqrEv");}
void  ccc::CC1x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y43abcEv");}
void  ccc::CC1x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y43efgEv");}
ccc::CC1x9y4 ::~CC1x9y4(){ note_dtor("_ZN3ccc7CC1x9y4E", this);} // tgen
ccc::CC1x9y4 ::CC1x9y4(){ note_ctor("_ZN3ccc7CC1x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y4E, buf);
    ::ccc::CC1x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y4E);
    dp->::ccc::CC1x9y4::~CC1x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y4E(Test__ZN3ccc7CC1x9y4E, "_ZN3ccc7CC1x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y4C1Ev();
extern void _ZN3ccc7CC1x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y4E[] = {
  NSPAIR(_ZN3ccc7CC1x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y4E[];
extern void _ZN3ccc7CC1x9y43abcEv();
extern void _ZN3ccc7CC1x9y43pqrEv();
extern void _ZN3ccc7CC1x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y43efgEv,_ZThn4_N3ccc7CC1x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y43pqrEv,_ZThn4_N3ccc7CC1x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y43efgEv,_ZThn4_N3ccc7CC1x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y43pqrEv,_ZThn4_N3ccc7CC1x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y4E[];
Class_Descriptor cd__ZN3ccc7CC1x9y4E = {  "_ZN3ccc7CC1x9y4E", // class name
  bases__ZN3ccc7CC1x9y4E, 2,
  &(vtc__ZN3ccc7CC1x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y5  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC1x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC1x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y53abcEv
  ~CC1x9y5(); // tgen
  CC1x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y5E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y53pqrEv");}
void  ccc::CC1x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y53efgEv");}
void  ccc::CC1x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y53abcEv");}
ccc::CC1x9y5 ::~CC1x9y5(){ note_dtor("_ZN3ccc7CC1x9y5E", this);} // tgen
ccc::CC1x9y5 ::CC1x9y5(){ note_ctor("_ZN3ccc7CC1x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y5E, buf);
    ::ccc::CC1x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y5E);
    dp->::ccc::CC1x9y5::~CC1x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y5E(Test__ZN3ccc7CC1x9y5E, "_ZN3ccc7CC1x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y5C1Ev();
extern void _ZN3ccc7CC1x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y5E[] = {
  NSPAIR(_ZN3ccc7CC1x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y5E[];
extern void _ZN3ccc7CC1x9y53abcEv();
extern void _ZN3ccc7CC1x9y53pqrEv();
extern void _ZN3ccc7CC1x9y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y53efgEv,_ZThn4_N3ccc7CC1x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y53pqrEv,_ZThn4_N3ccc7CC1x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y53efgEv,_ZThn4_N3ccc7CC1x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y53pqrEv,_ZThn4_N3ccc7CC1x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y5E[];
Class_Descriptor cd__ZN3ccc7CC1x9y5E = {  "_ZN3ccc7CC1x9y5E", // class name
  bases__ZN3ccc7CC1x9y5E, 2,
  &(vtc__ZN3ccc7CC1x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y6  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC1x9y63efgEv
  ~CC1x9y6(); // tgen
  CC1x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y6E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y63abcEv");}
void  ccc::CC1x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y63efgEv");}
ccc::CC1x9y6 ::~CC1x9y6(){ note_dtor("_ZN3ccc7CC1x9y6E", this);} // tgen
ccc::CC1x9y6 ::CC1x9y6(){ note_ctor("_ZN3ccc7CC1x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y6E, buf);
    ::ccc::CC1x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y6E);
    dp->::ccc::CC1x9y6::~CC1x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y6E(Test__ZN3ccc7CC1x9y6E, "_ZN3ccc7CC1x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y6C1Ev();
extern void _ZN3ccc7CC1x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y6E[] = {
  NSPAIR(_ZN3ccc7CC1x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y6E[];
extern void _ZN3ccc7CC1x9y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y63efgEv,_ZThn4_N3ccc7CC1x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y63efgEv,_ZThn4_N3ccc7CC1x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y6E[];
Class_Descriptor cd__ZN3ccc7CC1x9y6E = {  "_ZN3ccc7CC1x9y6E", // class name
  bases__ZN3ccc7CC1x9y6E, 2,
  &(vtc__ZN3ccc7CC1x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y7  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC1x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y73pqrEv
  ~CC1x9y7(); // tgen
  CC1x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y7E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y73abcEv");}
void  ccc::CC1x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y73pqrEv");}
ccc::CC1x9y7 ::~CC1x9y7(){ note_dtor("_ZN3ccc7CC1x9y7E", this);} // tgen
ccc::CC1x9y7 ::CC1x9y7(){ note_ctor("_ZN3ccc7CC1x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y7E, buf);
    ::ccc::CC1x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y7E);
    dp->::ccc::CC1x9y7::~CC1x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y7E(Test__ZN3ccc7CC1x9y7E, "_ZN3ccc7CC1x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y7C1Ev();
extern void _ZN3ccc7CC1x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y7E[] = {
  NSPAIR(_ZN3ccc7CC1x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y7E[];
extern void _ZN3ccc7CC1x9y73abcEv();
extern void _ZN3ccc7CC1x9y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y73pqrEv,_ZThn4_N3ccc7CC1x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y73pqrEv,_ZThn4_N3ccc7CC1x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y7E[];
Class_Descriptor cd__ZN3ccc7CC1x9y7E = {  "_ZN3ccc7CC1x9y7E", // class name
  bases__ZN3ccc7CC1x9y7E, 2,
  &(vtc__ZN3ccc7CC1x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y8  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC1x9y83abcEv
  ~CC1x9y8(); // tgen
  CC1x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y8E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y83efgEv");}
void  ccc::CC1x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC1x9y83abcEv");}
ccc::CC1x9y8 ::~CC1x9y8(){ note_dtor("_ZN3ccc7CC1x9y8E", this);} // tgen
ccc::CC1x9y8 ::CC1x9y8(){ note_ctor("_ZN3ccc7CC1x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y8E, buf);
    ::ccc::CC1x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y8E);
    dp->::ccc::CC1x9y8::~CC1x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y8E(Test__ZN3ccc7CC1x9y8E, "_ZN3ccc7CC1x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y8C1Ev();
extern void _ZN3ccc7CC1x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y8E[] = {
  NSPAIR(_ZN3ccc7CC1x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y8E[];
extern void _ZN3ccc7CC1x9y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc7CC1x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y83efgEv,_ZThn4_N3ccc7CC1x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y83efgEv,_ZThn4_N3ccc7CC1x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y8E[];
Class_Descriptor cd__ZN3ccc7CC1x9y8E = {  "_ZN3ccc7CC1x9y8E", // class name
  bases__ZN3ccc7CC1x9y8E, 2,
  &(vtc__ZN3ccc7CC1x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y9  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC1x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC1x9y93pqrEv
  ~CC1x9y9(); // tgen
  CC1x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC1x9y9E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC1x9y93efgEv");}
void  ccc::CC1x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC1x9y93pqrEv");}
ccc::CC1x9y9 ::~CC1x9y9(){ note_dtor("_ZN3ccc7CC1x9y9E", this);} // tgen
ccc::CC1x9y9 ::CC1x9y9(){ note_ctor("_ZN3ccc7CC1x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC1x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC1x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC1x9y9E, buf);
    ::ccc::CC1x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC1x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC1x9y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc7CC1x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC1x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC1x9y9E);
    dp->::ccc::CC1x9y9::~CC1x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC1x9y9E(Test__ZN3ccc7CC1x9y9E, "_ZN3ccc7CC1x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC1x9y9C1Ev();
extern void _ZN3ccc7CC1x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC1x9y9E[] = {
  NSPAIR(_ZN3ccc7CC1x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC1x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC1x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc7CC1x9y93pqrEv();
extern void _ZN3ccc7CC1x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y93efgEv,_ZThn4_N3ccc7CC1x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC1x9y93pqrEv,_ZThn4_N3ccc7CC1x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC1x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC1x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC1x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y93efgEv,_ZThn4_N3ccc7CC1x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC1x9y93pqrEv,_ZThn4_N3ccc7CC1x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC1x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC1x9y9E[];
Class_Descriptor cd__ZN3ccc7CC1x9y9E = {  "_ZN3ccc7CC1x9y9E", // class name
  bases__ZN3ccc7CC1x9y9E, 2,
  &(vtc__ZN3ccc7CC1x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC1x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC1x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y10  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x9y103abcEv
  ~CC1x9y10(); // tgen
  CC1x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y10E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y103pqrEv");}
void  ccc::CC1x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x9y103abcEv");}
ccc::CC1x9y10 ::~CC1x9y10(){ note_dtor("_ZN3ccc8CC1x9y10E", this);} // tgen
ccc::CC1x9y10 ::CC1x9y10(){ note_ctor("_ZN3ccc8CC1x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y10E, buf);
    ::ccc::CC1x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y10E);
    dp->::ccc::CC1x9y10::~CC1x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y10E(Test__ZN3ccc8CC1x9y10E, "_ZN3ccc8CC1x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y10C1Ev();
extern void _ZN3ccc8CC1x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y10E[] = {
  NSPAIR(_ZN3ccc8CC1x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y10E[];
extern void _ZN3ccc8CC1x9y103abcEv();
extern void _ZN3ccc8CC1x9y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y103pqrEv,_ZThn4_N3ccc8CC1x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x9y103pqrEv,_ZThn4_N3ccc8CC1x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y10E[];
Class_Descriptor cd__ZN3ccc8CC1x9y10E = {  "_ZN3ccc8CC1x9y10E", // class name
  bases__ZN3ccc8CC1x9y10E, 2,
  &(vtc__ZN3ccc8CC1x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y11  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x9y113efgEv
  ~CC1x9y11(); // tgen
  CC1x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y11E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y113pqrEv");}
void  ccc::CC1x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x9y113efgEv");}
ccc::CC1x9y11 ::~CC1x9y11(){ note_dtor("_ZN3ccc8CC1x9y11E", this);} // tgen
ccc::CC1x9y11 ::CC1x9y11(){ note_ctor("_ZN3ccc8CC1x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y11E, buf);
    ::ccc::CC1x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y11E);
    dp->::ccc::CC1x9y11::~CC1x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y11E(Test__ZN3ccc8CC1x9y11E, "_ZN3ccc8CC1x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y11C1Ev();
extern void _ZN3ccc8CC1x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y11E[] = {
  NSPAIR(_ZN3ccc8CC1x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x9y113pqrEv();
extern void _ZN3ccc8CC1x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y113efgEv,_ZThn4_N3ccc8CC1x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y113pqrEv,_ZThn4_N3ccc8CC1x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x9y113efgEv,_ZThn4_N3ccc8CC1x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x9y113pqrEv,_ZThn4_N3ccc8CC1x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y11E[];
Class_Descriptor cd__ZN3ccc8CC1x9y11E = {  "_ZN3ccc8CC1x9y11E", // class name
  bases__ZN3ccc8CC1x9y11E, 2,
  &(vtc__ZN3ccc8CC1x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y12  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC1x9y123abcEv
  ~CC1x9y12(); // tgen
  CC1x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x9y123abcEv");}
ccc::CC1x9y12 ::~CC1x9y12(){ note_dtor("_ZN3ccc8CC1x9y12E", this);} // tgen
ccc::CC1x9y12 ::CC1x9y12(){ note_ctor("_ZN3ccc8CC1x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y12E, buf);
    ::ccc::CC1x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y12E);
    dp->::ccc::CC1x9y12::~CC1x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y12E(Test__ZN3ccc8CC1x9y12E, "_ZN3ccc8CC1x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y12C1Ev();
extern void _ZN3ccc8CC1x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y12E[] = {
  NSPAIR(_ZN3ccc8CC1x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y12E[];
extern void _ZN3ccc8CC1x9y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y12E[];
Class_Descriptor cd__ZN3ccc8CC1x9y12E = {  "_ZN3ccc8CC1x9y12E", // class name
  bases__ZN3ccc8CC1x9y12E, 2,
  &(vtc__ZN3ccc8CC1x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y13  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC1x9y133efgEv
  ~CC1x9y13(); // tgen
  CC1x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x9y133efgEv");}
ccc::CC1x9y13 ::~CC1x9y13(){ note_dtor("_ZN3ccc8CC1x9y13E", this);} // tgen
ccc::CC1x9y13 ::CC1x9y13(){ note_ctor("_ZN3ccc8CC1x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y13E, buf);
    ::ccc::CC1x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y13E);
    dp->::ccc::CC1x9y13::~CC1x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y13E(Test__ZN3ccc8CC1x9y13E, "_ZN3ccc8CC1x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y13C1Ev();
extern void _ZN3ccc8CC1x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y13E[] = {
  NSPAIR(_ZN3ccc8CC1x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y133efgEv,_ZThn4_N3ccc8CC1x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x9y133efgEv,_ZThn4_N3ccc8CC1x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y13E[];
Class_Descriptor cd__ZN3ccc8CC1x9y13E = {  "_ZN3ccc8CC1x9y13E", // class name
  bases__ZN3ccc8CC1x9y13E, 2,
  &(vtc__ZN3ccc8CC1x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y14  : ::ccc::AA1 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC1x9y143pqrEv
  ~CC1x9y14(); // tgen
  CC1x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x9y143pqrEv");}
ccc::CC1x9y14 ::~CC1x9y14(){ note_dtor("_ZN3ccc8CC1x9y14E", this);} // tgen
ccc::CC1x9y14 ::CC1x9y14(){ note_ctor("_ZN3ccc8CC1x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y14E, buf);
    ::ccc::CC1x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y14E);
    dp->::ccc::CC1x9y14::~CC1x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y14E(Test__ZN3ccc8CC1x9y14E, "_ZN3ccc8CC1x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y14C1Ev();
extern void _ZN3ccc8CC1x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y14E[] = {
  NSPAIR(_ZN3ccc8CC1x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x9y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x9y143pqrEv,_ZThn4_N3ccc8CC1x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x9y143pqrEv,_ZThn4_N3ccc8CC1x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y14E[];
Class_Descriptor cd__ZN3ccc8CC1x9y14E = {  "_ZN3ccc8CC1x9y14E", // class name
  bases__ZN3ccc8CC1x9y14E, 2,
  &(vtc__ZN3ccc8CC1x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x9y15  : ::ccc::AA1 , ::ccc::BB9 {
  ~CC1x9y15(); // tgen
  CC1x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC1x9y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x9y15 ::~CC1x9y15(){ note_dtor("_ZN3ccc8CC1x9y15E", this);} // tgen
ccc::CC1x9y15 ::CC1x9y15(){ note_ctor("_ZN3ccc8CC1x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC1x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x9y15E, buf);
    ::ccc::CC1x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x9y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC1x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x9y15E);
    dp->::ccc::CC1x9y15::~CC1x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x9y15E(Test__ZN3ccc8CC1x9y15E, "_ZN3ccc8CC1x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x9y15C1Ev();
extern void _ZN3ccc8CC1x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC1x9y15E[] = {
  NSPAIR(_ZN3ccc8CC1x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC1x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC1x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x9y15E[];
Class_Descriptor cd__ZN3ccc8CC1x9y15E = {  "_ZN3ccc8CC1x9y15E", // class name
  bases__ZN3ccc8CC1x9y15E, 2,
  &(vtc__ZN3ccc8CC1x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y0  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y03pqrEv
  ~CC1x10y0(); // tgen
  CC1x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y0E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y03abcEv");}
void  ccc::CC1x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y03efgEv");}
void  ccc::CC1x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y03pqrEv");}
ccc::CC1x10y0 ::~CC1x10y0(){ note_dtor("_ZN3ccc8CC1x10y0E", this);} // tgen
ccc::CC1x10y0 ::CC1x10y0(){ note_ctor("_ZN3ccc8CC1x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y0E, buf);
    ::ccc::CC1x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y0E);
    dp->::ccc::CC1x10y0::~CC1x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y0E(Test__ZN3ccc8CC1x10y0E, "_ZN3ccc8CC1x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y0C1Ev();
extern void _ZN3ccc8CC1x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y0E[] = {
  NSPAIR(_ZN3ccc8CC1x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y0E[];
extern void _ZN3ccc8CC1x10y03abcEv();
extern void _ZN3ccc8CC1x10y03pqrEv();
extern void _ZN3ccc8CC1x10y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y03pqrEv,_ZThn4_N3ccc8CC1x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y03abcEv,_ZThn4_N3ccc8CC1x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y03pqrEv,_ZThn4_N3ccc8CC1x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y03abcEv,_ZThn4_N3ccc8CC1x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y0E[];
Class_Descriptor cd__ZN3ccc8CC1x10y0E = {  "_ZN3ccc8CC1x10y0E", // class name
  bases__ZN3ccc8CC1x10y0E, 2,
  &(vtc__ZN3ccc8CC1x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y1  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x10y13efgEv
  ~CC1x10y1(); // tgen
  CC1x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y1E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y13abcEv");}
void  ccc::CC1x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y13pqrEv");}
void  ccc::CC1x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y13efgEv");}
ccc::CC1x10y1 ::~CC1x10y1(){ note_dtor("_ZN3ccc8CC1x10y1E", this);} // tgen
ccc::CC1x10y1 ::CC1x10y1(){ note_ctor("_ZN3ccc8CC1x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y1E, buf);
    ::ccc::CC1x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y1E);
    dp->::ccc::CC1x10y1::~CC1x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y1E(Test__ZN3ccc8CC1x10y1E, "_ZN3ccc8CC1x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y1C1Ev();
extern void _ZN3ccc8CC1x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y1E[] = {
  NSPAIR(_ZN3ccc8CC1x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y1E[];
extern void _ZN3ccc8CC1x10y13abcEv();
extern void _ZN3ccc8CC1x10y13pqrEv();
extern void _ZN3ccc8CC1x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y13pqrEv,_ZThn4_N3ccc8CC1x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y13abcEv,_ZThn4_N3ccc8CC1x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y13pqrEv,_ZThn4_N3ccc8CC1x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y13abcEv,_ZThn4_N3ccc8CC1x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y1E[];
Class_Descriptor cd__ZN3ccc8CC1x10y1E = {  "_ZN3ccc8CC1x10y1E", // class name
  bases__ZN3ccc8CC1x10y1E, 2,
  &(vtc__ZN3ccc8CC1x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y2  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y23pqrEv
  ~CC1x10y2(); // tgen
  CC1x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y2E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y23efgEv");}
void  ccc::CC1x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y23abcEv");}
void  ccc::CC1x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y23pqrEv");}
ccc::CC1x10y2 ::~CC1x10y2(){ note_dtor("_ZN3ccc8CC1x10y2E", this);} // tgen
ccc::CC1x10y2 ::CC1x10y2(){ note_ctor("_ZN3ccc8CC1x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y2E, buf);
    ::ccc::CC1x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y2E);
    dp->::ccc::CC1x10y2::~CC1x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y2E(Test__ZN3ccc8CC1x10y2E, "_ZN3ccc8CC1x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y2C1Ev();
extern void _ZN3ccc8CC1x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y2E[] = {
  NSPAIR(_ZN3ccc8CC1x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y2E[];
extern void _ZN3ccc8CC1x10y23abcEv();
extern void _ZN3ccc8CC1x10y23pqrEv();
extern void _ZN3ccc8CC1x10y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y23pqrEv,_ZThn4_N3ccc8CC1x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y23abcEv,_ZThn4_N3ccc8CC1x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y23pqrEv,_ZThn4_N3ccc8CC1x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y23abcEv,_ZThn4_N3ccc8CC1x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y2E[];
Class_Descriptor cd__ZN3ccc8CC1x10y2E = {  "_ZN3ccc8CC1x10y2E", // class name
  bases__ZN3ccc8CC1x10y2E, 2,
  &(vtc__ZN3ccc8CC1x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y3  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x10y33abcEv
  ~CC1x10y3(); // tgen
  CC1x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y3E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y33efgEv");}
void  ccc::CC1x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y33pqrEv");}
void  ccc::CC1x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y33abcEv");}
ccc::CC1x10y3 ::~CC1x10y3(){ note_dtor("_ZN3ccc8CC1x10y3E", this);} // tgen
ccc::CC1x10y3 ::CC1x10y3(){ note_ctor("_ZN3ccc8CC1x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y3E, buf);
    ::ccc::CC1x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y3E);
    dp->::ccc::CC1x10y3::~CC1x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y3E(Test__ZN3ccc8CC1x10y3E, "_ZN3ccc8CC1x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y3C1Ev();
extern void _ZN3ccc8CC1x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y3E[] = {
  NSPAIR(_ZN3ccc8CC1x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y3E[];
extern void _ZN3ccc8CC1x10y33abcEv();
extern void _ZN3ccc8CC1x10y33pqrEv();
extern void _ZN3ccc8CC1x10y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y33pqrEv,_ZThn4_N3ccc8CC1x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y33abcEv,_ZThn4_N3ccc8CC1x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y33pqrEv,_ZThn4_N3ccc8CC1x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y33abcEv,_ZThn4_N3ccc8CC1x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y3E[];
Class_Descriptor cd__ZN3ccc8CC1x10y3E = {  "_ZN3ccc8CC1x10y3E", // class name
  bases__ZN3ccc8CC1x10y3E, 2,
  &(vtc__ZN3ccc8CC1x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y4  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC1x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y43efgEv
  ~CC1x10y4(); // tgen
  CC1x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y4E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y43pqrEv");}
void  ccc::CC1x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y43abcEv");}
void  ccc::CC1x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y43efgEv");}
ccc::CC1x10y4 ::~CC1x10y4(){ note_dtor("_ZN3ccc8CC1x10y4E", this);} // tgen
ccc::CC1x10y4 ::CC1x10y4(){ note_ctor("_ZN3ccc8CC1x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y4E, buf);
    ::ccc::CC1x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y4E);
    dp->::ccc::CC1x10y4::~CC1x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y4E(Test__ZN3ccc8CC1x10y4E, "_ZN3ccc8CC1x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y4C1Ev();
extern void _ZN3ccc8CC1x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y4E[] = {
  NSPAIR(_ZN3ccc8CC1x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y4E[];
extern void _ZN3ccc8CC1x10y43abcEv();
extern void _ZN3ccc8CC1x10y43pqrEv();
extern void _ZN3ccc8CC1x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y43pqrEv,_ZThn4_N3ccc8CC1x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y43abcEv,_ZThn4_N3ccc8CC1x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y43pqrEv,_ZThn4_N3ccc8CC1x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y43abcEv,_ZThn4_N3ccc8CC1x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y4E[];
Class_Descriptor cd__ZN3ccc8CC1x10y4E = {  "_ZN3ccc8CC1x10y4E", // class name
  bases__ZN3ccc8CC1x10y4E, 2,
  &(vtc__ZN3ccc8CC1x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y5  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC1x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y53abcEv
  ~CC1x10y5(); // tgen
  CC1x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y5E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y53pqrEv");}
void  ccc::CC1x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y53efgEv");}
void  ccc::CC1x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y53abcEv");}
ccc::CC1x10y5 ::~CC1x10y5(){ note_dtor("_ZN3ccc8CC1x10y5E", this);} // tgen
ccc::CC1x10y5 ::CC1x10y5(){ note_ctor("_ZN3ccc8CC1x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y5E, buf);
    ::ccc::CC1x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y5E);
    dp->::ccc::CC1x10y5::~CC1x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y5E(Test__ZN3ccc8CC1x10y5E, "_ZN3ccc8CC1x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y5C1Ev();
extern void _ZN3ccc8CC1x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y5E[] = {
  NSPAIR(_ZN3ccc8CC1x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y5E[];
extern void _ZN3ccc8CC1x10y53abcEv();
extern void _ZN3ccc8CC1x10y53pqrEv();
extern void _ZN3ccc8CC1x10y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y53pqrEv,_ZThn4_N3ccc8CC1x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y53abcEv,_ZThn4_N3ccc8CC1x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y53pqrEv,_ZThn4_N3ccc8CC1x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y53abcEv,_ZThn4_N3ccc8CC1x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y5E[];
Class_Descriptor cd__ZN3ccc8CC1x10y5E = {  "_ZN3ccc8CC1x10y5E", // class name
  bases__ZN3ccc8CC1x10y5E, 2,
  &(vtc__ZN3ccc8CC1x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y6  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x10y63efgEv
  ~CC1x10y6(); // tgen
  CC1x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y6E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y63abcEv");}
void  ccc::CC1x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y63efgEv");}
ccc::CC1x10y6 ::~CC1x10y6(){ note_dtor("_ZN3ccc8CC1x10y6E", this);} // tgen
ccc::CC1x10y6 ::CC1x10y6(){ note_ctor("_ZN3ccc8CC1x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y6E, buf);
    ::ccc::CC1x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y6E);
    dp->::ccc::CC1x10y6::~CC1x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y6E(Test__ZN3ccc8CC1x10y6E, "_ZN3ccc8CC1x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y6C1Ev();
extern void _ZN3ccc8CC1x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y6E[] = {
  NSPAIR(_ZN3ccc8CC1x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y6E[];
extern void _ZN3ccc8CC1x10y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y63abcEv,_ZThn4_N3ccc8CC1x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y63abcEv,_ZThn4_N3ccc8CC1x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y6E[];
Class_Descriptor cd__ZN3ccc8CC1x10y6E = {  "_ZN3ccc8CC1x10y6E", // class name
  bases__ZN3ccc8CC1x10y6E, 2,
  &(vtc__ZN3ccc8CC1x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y7  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC1x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y73pqrEv
  ~CC1x10y7(); // tgen
  CC1x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y7E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y73abcEv");}
void  ccc::CC1x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y73pqrEv");}
ccc::CC1x10y7 ::~CC1x10y7(){ note_dtor("_ZN3ccc8CC1x10y7E", this);} // tgen
ccc::CC1x10y7 ::CC1x10y7(){ note_ctor("_ZN3ccc8CC1x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y7E, buf);
    ::ccc::CC1x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y7E);
    dp->::ccc::CC1x10y7::~CC1x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y7E(Test__ZN3ccc8CC1x10y7E, "_ZN3ccc8CC1x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y7C1Ev();
extern void _ZN3ccc8CC1x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y7E[] = {
  NSPAIR(_ZN3ccc8CC1x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y7E[];
extern void _ZN3ccc8CC1x10y73abcEv();
extern void _ZN3ccc8CC1x10y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y73pqrEv,_ZThn4_N3ccc8CC1x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y73abcEv,_ZThn4_N3ccc8CC1x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y73pqrEv,_ZThn4_N3ccc8CC1x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y73abcEv,_ZThn4_N3ccc8CC1x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y7E[];
Class_Descriptor cd__ZN3ccc8CC1x10y7E = {  "_ZN3ccc8CC1x10y7E", // class name
  bases__ZN3ccc8CC1x10y7E, 2,
  &(vtc__ZN3ccc8CC1x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y8  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x10y83abcEv
  ~CC1x10y8(); // tgen
  CC1x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y8E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y83efgEv");}
void  ccc::CC1x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x10y83abcEv");}
ccc::CC1x10y8 ::~CC1x10y8(){ note_dtor("_ZN3ccc8CC1x10y8E", this);} // tgen
ccc::CC1x10y8 ::CC1x10y8(){ note_ctor("_ZN3ccc8CC1x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y8E, buf);
    ::ccc::CC1x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y8E);
    dp->::ccc::CC1x10y8::~CC1x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y8E(Test__ZN3ccc8CC1x10y8E, "_ZN3ccc8CC1x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y8C1Ev();
extern void _ZN3ccc8CC1x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y8E[] = {
  NSPAIR(_ZN3ccc8CC1x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y8E[];
extern void _ZN3ccc8CC1x10y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y83abcEv,_ZThn4_N3ccc8CC1x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y83abcEv,_ZThn4_N3ccc8CC1x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y8E[];
Class_Descriptor cd__ZN3ccc8CC1x10y8E = {  "_ZN3ccc8CC1x10y8E", // class name
  bases__ZN3ccc8CC1x10y8E, 2,
  &(vtc__ZN3ccc8CC1x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y9  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC1x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x10y93pqrEv
  ~CC1x10y9(); // tgen
  CC1x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x10y9E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x10y93efgEv");}
void  ccc::CC1x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x10y93pqrEv");}
ccc::CC1x10y9 ::~CC1x10y9(){ note_dtor("_ZN3ccc8CC1x10y9E", this);} // tgen
ccc::CC1x10y9 ::CC1x10y9(){ note_ctor("_ZN3ccc8CC1x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x10y9E, buf);
    ::ccc::CC1x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x10y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC1x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x10y9E);
    dp->::ccc::CC1x10y9::~CC1x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x10y9E(Test__ZN3ccc8CC1x10y9E, "_ZN3ccc8CC1x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x10y9C1Ev();
extern void _ZN3ccc8CC1x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x10y9E[] = {
  NSPAIR(_ZN3ccc8CC1x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC1x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x10y93pqrEv();
extern void _ZN3ccc8CC1x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x10y93pqrEv,_ZThn4_N3ccc8CC1x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x10y93pqrEv,_ZThn4_N3ccc8CC1x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x10y9E[];
Class_Descriptor cd__ZN3ccc8CC1x10y9E = {  "_ZN3ccc8CC1x10y9E", // class name
  bases__ZN3ccc8CC1x10y9E, 2,
  &(vtc__ZN3ccc8CC1x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y10  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x10y103abcEv
  ~CC1x10y10(); // tgen
  CC1x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y10E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y103pqrEv");}
void  ccc::CC1x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x10y103abcEv");}
ccc::CC1x10y10 ::~CC1x10y10(){ note_dtor("_ZN3ccc9CC1x10y10E", this);} // tgen
ccc::CC1x10y10 ::CC1x10y10(){ note_ctor("_ZN3ccc9CC1x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y10E, buf);
    ::ccc::CC1x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y10E);
    dp->::ccc::CC1x10y10::~CC1x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y10E(Test__ZN3ccc9CC1x10y10E, "_ZN3ccc9CC1x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y10C1Ev();
extern void _ZN3ccc9CC1x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y10E[] = {
  NSPAIR(_ZN3ccc9CC1x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y10E[];
extern void _ZN3ccc9CC1x10y103abcEv();
extern void _ZN3ccc9CC1x10y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y103pqrEv,_ZThn4_N3ccc9CC1x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y103abcEv,_ZThn4_N3ccc9CC1x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x10y103pqrEv,_ZThn4_N3ccc9CC1x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x10y103abcEv,_ZThn4_N3ccc9CC1x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y10E[];
Class_Descriptor cd__ZN3ccc9CC1x10y10E = {  "_ZN3ccc9CC1x10y10E", // class name
  bases__ZN3ccc9CC1x10y10E, 2,
  &(vtc__ZN3ccc9CC1x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y11  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x10y113efgEv
  ~CC1x10y11(); // tgen
  CC1x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y11E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y113pqrEv");}
void  ccc::CC1x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x10y113efgEv");}
ccc::CC1x10y11 ::~CC1x10y11(){ note_dtor("_ZN3ccc9CC1x10y11E", this);} // tgen
ccc::CC1x10y11 ::CC1x10y11(){ note_ctor("_ZN3ccc9CC1x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y11E, buf);
    ::ccc::CC1x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y11E);
    dp->::ccc::CC1x10y11::~CC1x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y11E(Test__ZN3ccc9CC1x10y11E, "_ZN3ccc9CC1x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y11C1Ev();
extern void _ZN3ccc9CC1x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y11E[] = {
  NSPAIR(_ZN3ccc9CC1x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x10y113pqrEv();
extern void _ZN3ccc9CC1x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y113pqrEv,_ZThn4_N3ccc9CC1x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x10y113pqrEv,_ZThn4_N3ccc9CC1x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y11E[];
Class_Descriptor cd__ZN3ccc9CC1x10y11E = {  "_ZN3ccc9CC1x10y11E", // class name
  bases__ZN3ccc9CC1x10y11E, 2,
  &(vtc__ZN3ccc9CC1x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y12  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC1x10y123abcEv
  ~CC1x10y12(); // tgen
  CC1x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x10y123abcEv");}
ccc::CC1x10y12 ::~CC1x10y12(){ note_dtor("_ZN3ccc9CC1x10y12E", this);} // tgen
ccc::CC1x10y12 ::CC1x10y12(){ note_ctor("_ZN3ccc9CC1x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y12E, buf);
    ::ccc::CC1x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y12E);
    dp->::ccc::CC1x10y12::~CC1x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y12E(Test__ZN3ccc9CC1x10y12E, "_ZN3ccc9CC1x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y12C1Ev();
extern void _ZN3ccc9CC1x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y12E[] = {
  NSPAIR(_ZN3ccc9CC1x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y12E[];
extern void _ZN3ccc9CC1x10y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y123abcEv,_ZThn4_N3ccc9CC1x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x10y123abcEv,_ZThn4_N3ccc9CC1x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y12E[];
Class_Descriptor cd__ZN3ccc9CC1x10y12E = {  "_ZN3ccc9CC1x10y12E", // class name
  bases__ZN3ccc9CC1x10y12E, 2,
  &(vtc__ZN3ccc9CC1x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y13  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC1x10y133efgEv
  ~CC1x10y13(); // tgen
  CC1x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x10y133efgEv");}
ccc::CC1x10y13 ::~CC1x10y13(){ note_dtor("_ZN3ccc9CC1x10y13E", this);} // tgen
ccc::CC1x10y13 ::CC1x10y13(){ note_ctor("_ZN3ccc9CC1x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y13E, buf);
    ::ccc::CC1x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y13E);
    dp->::ccc::CC1x10y13::~CC1x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y13E(Test__ZN3ccc9CC1x10y13E, "_ZN3ccc9CC1x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y13C1Ev();
extern void _ZN3ccc9CC1x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y13E[] = {
  NSPAIR(_ZN3ccc9CC1x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y13E[];
Class_Descriptor cd__ZN3ccc9CC1x10y13E = {  "_ZN3ccc9CC1x10y13E", // class name
  bases__ZN3ccc9CC1x10y13E, 2,
  &(vtc__ZN3ccc9CC1x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y14  : ::ccc::AA1 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC1x10y143pqrEv
  ~CC1x10y14(); // tgen
  CC1x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x10y143pqrEv");}
ccc::CC1x10y14 ::~CC1x10y14(){ note_dtor("_ZN3ccc9CC1x10y14E", this);} // tgen
ccc::CC1x10y14 ::CC1x10y14(){ note_ctor("_ZN3ccc9CC1x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y14E, buf);
    ::ccc::CC1x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y14E);
    dp->::ccc::CC1x10y14::~CC1x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y14E(Test__ZN3ccc9CC1x10y14E, "_ZN3ccc9CC1x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y14C1Ev();
extern void _ZN3ccc9CC1x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y14E[] = {
  NSPAIR(_ZN3ccc9CC1x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x10y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x10y143pqrEv,_ZThn4_N3ccc9CC1x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x10y143pqrEv,_ZThn4_N3ccc9CC1x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y14E[];
Class_Descriptor cd__ZN3ccc9CC1x10y14E = {  "_ZN3ccc9CC1x10y14E", // class name
  bases__ZN3ccc9CC1x10y14E, 2,
  &(vtc__ZN3ccc9CC1x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x10y15  : ::ccc::AA1 , ::ccc::BB10 {
  ~CC1x10y15(); // tgen
  CC1x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x10y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x10y15 ::~CC1x10y15(){ note_dtor("_ZN3ccc9CC1x10y15E", this);} // tgen
ccc::CC1x10y15 ::CC1x10y15(){ note_ctor("_ZN3ccc9CC1x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x10y15E, buf);
    ::ccc::CC1x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x10y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC1x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x10y15E);
    dp->::ccc::CC1x10y15::~CC1x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x10y15E(Test__ZN3ccc9CC1x10y15E, "_ZN3ccc9CC1x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x10y15C1Ev();
extern void _ZN3ccc9CC1x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x10y15E[] = {
  NSPAIR(_ZN3ccc9CC1x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC1x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x10y15E[];
Class_Descriptor cd__ZN3ccc9CC1x10y15E = {  "_ZN3ccc9CC1x10y15E", // class name
  bases__ZN3ccc9CC1x10y15E, 2,
  &(vtc__ZN3ccc9CC1x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y0  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y03pqrEv
  ~CC1x11y0(); // tgen
  CC1x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y0E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y03abcEv");}
void  ccc::CC1x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y03efgEv");}
void  ccc::CC1x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y03pqrEv");}
ccc::CC1x11y0 ::~CC1x11y0(){ note_dtor("_ZN3ccc8CC1x11y0E", this);} // tgen
ccc::CC1x11y0 ::CC1x11y0(){ note_ctor("_ZN3ccc8CC1x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y0E, buf);
    ::ccc::CC1x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y0E);
    dp->::ccc::CC1x11y0::~CC1x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y0E(Test__ZN3ccc8CC1x11y0E, "_ZN3ccc8CC1x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y0C1Ev();
extern void _ZN3ccc8CC1x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y0E[] = {
  NSPAIR(_ZN3ccc8CC1x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y0E[];
extern void _ZN3ccc8CC1x11y03abcEv();
extern void _ZN3ccc8CC1x11y03pqrEv();
extern void _ZN3ccc8CC1x11y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y03pqrEv,_ZThn4_N3ccc8CC1x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y03efgEv,_ZThn4_N3ccc8CC1x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y03pqrEv,_ZThn4_N3ccc8CC1x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y03efgEv,_ZThn4_N3ccc8CC1x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y0E[];
Class_Descriptor cd__ZN3ccc8CC1x11y0E = {  "_ZN3ccc8CC1x11y0E", // class name
  bases__ZN3ccc8CC1x11y0E, 2,
  &(vtc__ZN3ccc8CC1x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y1  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x11y13efgEv
  ~CC1x11y1(); // tgen
  CC1x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y1E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y13abcEv");}
void  ccc::CC1x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y13pqrEv");}
void  ccc::CC1x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y13efgEv");}
ccc::CC1x11y1 ::~CC1x11y1(){ note_dtor("_ZN3ccc8CC1x11y1E", this);} // tgen
ccc::CC1x11y1 ::CC1x11y1(){ note_ctor("_ZN3ccc8CC1x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y1E, buf);
    ::ccc::CC1x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y1E);
    dp->::ccc::CC1x11y1::~CC1x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y1E(Test__ZN3ccc8CC1x11y1E, "_ZN3ccc8CC1x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y1C1Ev();
extern void _ZN3ccc8CC1x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y1E[] = {
  NSPAIR(_ZN3ccc8CC1x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y1E[];
extern void _ZN3ccc8CC1x11y13abcEv();
extern void _ZN3ccc8CC1x11y13pqrEv();
extern void _ZN3ccc8CC1x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y13pqrEv,_ZThn4_N3ccc8CC1x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y13efgEv,_ZThn4_N3ccc8CC1x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y13pqrEv,_ZThn4_N3ccc8CC1x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y13efgEv,_ZThn4_N3ccc8CC1x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y1E[];
Class_Descriptor cd__ZN3ccc8CC1x11y1E = {  "_ZN3ccc8CC1x11y1E", // class name
  bases__ZN3ccc8CC1x11y1E, 2,
  &(vtc__ZN3ccc8CC1x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y2  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y23pqrEv
  ~CC1x11y2(); // tgen
  CC1x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y2E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y23efgEv");}
void  ccc::CC1x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y23abcEv");}
void  ccc::CC1x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y23pqrEv");}
ccc::CC1x11y2 ::~CC1x11y2(){ note_dtor("_ZN3ccc8CC1x11y2E", this);} // tgen
ccc::CC1x11y2 ::CC1x11y2(){ note_ctor("_ZN3ccc8CC1x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y2E, buf);
    ::ccc::CC1x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y2E);
    dp->::ccc::CC1x11y2::~CC1x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y2E(Test__ZN3ccc8CC1x11y2E, "_ZN3ccc8CC1x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y2C1Ev();
extern void _ZN3ccc8CC1x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y2E[] = {
  NSPAIR(_ZN3ccc8CC1x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y2E[];
extern void _ZN3ccc8CC1x11y23abcEv();
extern void _ZN3ccc8CC1x11y23pqrEv();
extern void _ZN3ccc8CC1x11y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y23pqrEv,_ZThn4_N3ccc8CC1x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y23efgEv,_ZThn4_N3ccc8CC1x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y23pqrEv,_ZThn4_N3ccc8CC1x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y23efgEv,_ZThn4_N3ccc8CC1x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y2E[];
Class_Descriptor cd__ZN3ccc8CC1x11y2E = {  "_ZN3ccc8CC1x11y2E", // class name
  bases__ZN3ccc8CC1x11y2E, 2,
  &(vtc__ZN3ccc8CC1x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y3  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x11y33abcEv
  ~CC1x11y3(); // tgen
  CC1x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y3E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y33efgEv");}
void  ccc::CC1x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y33pqrEv");}
void  ccc::CC1x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y33abcEv");}
ccc::CC1x11y3 ::~CC1x11y3(){ note_dtor("_ZN3ccc8CC1x11y3E", this);} // tgen
ccc::CC1x11y3 ::CC1x11y3(){ note_ctor("_ZN3ccc8CC1x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y3E, buf);
    ::ccc::CC1x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y3E);
    dp->::ccc::CC1x11y3::~CC1x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y3E(Test__ZN3ccc8CC1x11y3E, "_ZN3ccc8CC1x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y3C1Ev();
extern void _ZN3ccc8CC1x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y3E[] = {
  NSPAIR(_ZN3ccc8CC1x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y3E[];
extern void _ZN3ccc8CC1x11y33abcEv();
extern void _ZN3ccc8CC1x11y33pqrEv();
extern void _ZN3ccc8CC1x11y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y33pqrEv,_ZThn4_N3ccc8CC1x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y33efgEv,_ZThn4_N3ccc8CC1x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y33pqrEv,_ZThn4_N3ccc8CC1x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y33efgEv,_ZThn4_N3ccc8CC1x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y3E[];
Class_Descriptor cd__ZN3ccc8CC1x11y3E = {  "_ZN3ccc8CC1x11y3E", // class name
  bases__ZN3ccc8CC1x11y3E, 2,
  &(vtc__ZN3ccc8CC1x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y4  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC1x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y43efgEv
  ~CC1x11y4(); // tgen
  CC1x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y4E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y43pqrEv");}
void  ccc::CC1x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y43abcEv");}
void  ccc::CC1x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y43efgEv");}
ccc::CC1x11y4 ::~CC1x11y4(){ note_dtor("_ZN3ccc8CC1x11y4E", this);} // tgen
ccc::CC1x11y4 ::CC1x11y4(){ note_ctor("_ZN3ccc8CC1x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y4E, buf);
    ::ccc::CC1x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y4E);
    dp->::ccc::CC1x11y4::~CC1x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y4E(Test__ZN3ccc8CC1x11y4E, "_ZN3ccc8CC1x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y4C1Ev();
extern void _ZN3ccc8CC1x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y4E[] = {
  NSPAIR(_ZN3ccc8CC1x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y4E[];
extern void _ZN3ccc8CC1x11y43abcEv();
extern void _ZN3ccc8CC1x11y43pqrEv();
extern void _ZN3ccc8CC1x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y43pqrEv,_ZThn4_N3ccc8CC1x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y43efgEv,_ZThn4_N3ccc8CC1x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y43pqrEv,_ZThn4_N3ccc8CC1x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y43efgEv,_ZThn4_N3ccc8CC1x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y4E[];
Class_Descriptor cd__ZN3ccc8CC1x11y4E = {  "_ZN3ccc8CC1x11y4E", // class name
  bases__ZN3ccc8CC1x11y4E, 2,
  &(vtc__ZN3ccc8CC1x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y5  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC1x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y53abcEv
  ~CC1x11y5(); // tgen
  CC1x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y5E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y53pqrEv");}
void  ccc::CC1x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y53efgEv");}
void  ccc::CC1x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y53abcEv");}
ccc::CC1x11y5 ::~CC1x11y5(){ note_dtor("_ZN3ccc8CC1x11y5E", this);} // tgen
ccc::CC1x11y5 ::CC1x11y5(){ note_ctor("_ZN3ccc8CC1x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y5E, buf);
    ::ccc::CC1x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y5E);
    dp->::ccc::CC1x11y5::~CC1x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y5E(Test__ZN3ccc8CC1x11y5E, "_ZN3ccc8CC1x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y5C1Ev();
extern void _ZN3ccc8CC1x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y5E[] = {
  NSPAIR(_ZN3ccc8CC1x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y5E[];
extern void _ZN3ccc8CC1x11y53abcEv();
extern void _ZN3ccc8CC1x11y53pqrEv();
extern void _ZN3ccc8CC1x11y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y53pqrEv,_ZThn4_N3ccc8CC1x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y53efgEv,_ZThn4_N3ccc8CC1x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y53pqrEv,_ZThn4_N3ccc8CC1x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y53efgEv,_ZThn4_N3ccc8CC1x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y5E[];
Class_Descriptor cd__ZN3ccc8CC1x11y5E = {  "_ZN3ccc8CC1x11y5E", // class name
  bases__ZN3ccc8CC1x11y5E, 2,
  &(vtc__ZN3ccc8CC1x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y6  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x11y63efgEv
  ~CC1x11y6(); // tgen
  CC1x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y6E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y63abcEv");}
void  ccc::CC1x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y63efgEv");}
ccc::CC1x11y6 ::~CC1x11y6(){ note_dtor("_ZN3ccc8CC1x11y6E", this);} // tgen
ccc::CC1x11y6 ::CC1x11y6(){ note_ctor("_ZN3ccc8CC1x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y6E, buf);
    ::ccc::CC1x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y6E);
    dp->::ccc::CC1x11y6::~CC1x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y6E(Test__ZN3ccc8CC1x11y6E, "_ZN3ccc8CC1x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y6C1Ev();
extern void _ZN3ccc8CC1x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y6E[] = {
  NSPAIR(_ZN3ccc8CC1x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y6E[];
extern void _ZN3ccc8CC1x11y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y63efgEv,_ZThn4_N3ccc8CC1x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y63efgEv,_ZThn4_N3ccc8CC1x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y6E[];
Class_Descriptor cd__ZN3ccc8CC1x11y6E = {  "_ZN3ccc8CC1x11y6E", // class name
  bases__ZN3ccc8CC1x11y6E, 2,
  &(vtc__ZN3ccc8CC1x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y7  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC1x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y73pqrEv
  ~CC1x11y7(); // tgen
  CC1x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y7E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y73abcEv");}
void  ccc::CC1x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y73pqrEv");}
ccc::CC1x11y7 ::~CC1x11y7(){ note_dtor("_ZN3ccc8CC1x11y7E", this);} // tgen
ccc::CC1x11y7 ::CC1x11y7(){ note_ctor("_ZN3ccc8CC1x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y7E, buf);
    ::ccc::CC1x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y7E);
    dp->::ccc::CC1x11y7::~CC1x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y7E(Test__ZN3ccc8CC1x11y7E, "_ZN3ccc8CC1x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y7C1Ev();
extern void _ZN3ccc8CC1x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y7E[] = {
  NSPAIR(_ZN3ccc8CC1x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y7E[];
extern void _ZN3ccc8CC1x11y73abcEv();
extern void _ZN3ccc8CC1x11y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y73pqrEv,_ZThn4_N3ccc8CC1x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y73pqrEv,_ZThn4_N3ccc8CC1x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y7E[];
Class_Descriptor cd__ZN3ccc8CC1x11y7E = {  "_ZN3ccc8CC1x11y7E", // class name
  bases__ZN3ccc8CC1x11y7E, 2,
  &(vtc__ZN3ccc8CC1x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y8  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x11y83abcEv
  ~CC1x11y8(); // tgen
  CC1x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y8E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y83efgEv");}
void  ccc::CC1x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x11y83abcEv");}
ccc::CC1x11y8 ::~CC1x11y8(){ note_dtor("_ZN3ccc8CC1x11y8E", this);} // tgen
ccc::CC1x11y8 ::CC1x11y8(){ note_ctor("_ZN3ccc8CC1x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y8E, buf);
    ::ccc::CC1x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y8E);
    dp->::ccc::CC1x11y8::~CC1x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y8E(Test__ZN3ccc8CC1x11y8E, "_ZN3ccc8CC1x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y8C1Ev();
extern void _ZN3ccc8CC1x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y8E[] = {
  NSPAIR(_ZN3ccc8CC1x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y8E[];
extern void _ZN3ccc8CC1x11y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y83efgEv,_ZThn4_N3ccc8CC1x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y83efgEv,_ZThn4_N3ccc8CC1x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y8E[];
Class_Descriptor cd__ZN3ccc8CC1x11y8E = {  "_ZN3ccc8CC1x11y8E", // class name
  bases__ZN3ccc8CC1x11y8E, 2,
  &(vtc__ZN3ccc8CC1x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y9  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC1x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x11y93pqrEv
  ~CC1x11y9(); // tgen
  CC1x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x11y9E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x11y93efgEv");}
void  ccc::CC1x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x11y93pqrEv");}
ccc::CC1x11y9 ::~CC1x11y9(){ note_dtor("_ZN3ccc8CC1x11y9E", this);} // tgen
ccc::CC1x11y9 ::CC1x11y9(){ note_ctor("_ZN3ccc8CC1x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x11y9E, buf);
    ::ccc::CC1x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x11y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC1x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x11y9E);
    dp->::ccc::CC1x11y9::~CC1x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x11y9E(Test__ZN3ccc8CC1x11y9E, "_ZN3ccc8CC1x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x11y9C1Ev();
extern void _ZN3ccc8CC1x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x11y9E[] = {
  NSPAIR(_ZN3ccc8CC1x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC1x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x11y93pqrEv();
extern void _ZN3ccc8CC1x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y93pqrEv,_ZThn4_N3ccc8CC1x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC1x11y93efgEv,_ZThn4_N3ccc8CC1x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y93pqrEv,_ZThn4_N3ccc8CC1x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x11y93efgEv,_ZThn4_N3ccc8CC1x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x11y9E[];
Class_Descriptor cd__ZN3ccc8CC1x11y9E = {  "_ZN3ccc8CC1x11y9E", // class name
  bases__ZN3ccc8CC1x11y9E, 2,
  &(vtc__ZN3ccc8CC1x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y10  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x11y103abcEv
  ~CC1x11y10(); // tgen
  CC1x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y10E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y103pqrEv");}
void  ccc::CC1x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x11y103abcEv");}
ccc::CC1x11y10 ::~CC1x11y10(){ note_dtor("_ZN3ccc9CC1x11y10E", this);} // tgen
ccc::CC1x11y10 ::CC1x11y10(){ note_ctor("_ZN3ccc9CC1x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y10E, buf);
    ::ccc::CC1x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y10E);
    dp->::ccc::CC1x11y10::~CC1x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y10E(Test__ZN3ccc9CC1x11y10E, "_ZN3ccc9CC1x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y10C1Ev();
extern void _ZN3ccc9CC1x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y10E[] = {
  NSPAIR(_ZN3ccc9CC1x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y10E[];
extern void _ZN3ccc9CC1x11y103abcEv();
extern void _ZN3ccc9CC1x11y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y103pqrEv,_ZThn4_N3ccc9CC1x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x11y103pqrEv,_ZThn4_N3ccc9CC1x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y10E[];
Class_Descriptor cd__ZN3ccc9CC1x11y10E = {  "_ZN3ccc9CC1x11y10E", // class name
  bases__ZN3ccc9CC1x11y10E, 2,
  &(vtc__ZN3ccc9CC1x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y11  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x11y113efgEv
  ~CC1x11y11(); // tgen
  CC1x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y11E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y113pqrEv");}
void  ccc::CC1x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x11y113efgEv");}
ccc::CC1x11y11 ::~CC1x11y11(){ note_dtor("_ZN3ccc9CC1x11y11E", this);} // tgen
ccc::CC1x11y11 ::CC1x11y11(){ note_ctor("_ZN3ccc9CC1x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y11E, buf);
    ::ccc::CC1x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y11E);
    dp->::ccc::CC1x11y11::~CC1x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y11E(Test__ZN3ccc9CC1x11y11E, "_ZN3ccc9CC1x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y11C1Ev();
extern void _ZN3ccc9CC1x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y11E[] = {
  NSPAIR(_ZN3ccc9CC1x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x11y113pqrEv();
extern void _ZN3ccc9CC1x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y113pqrEv,_ZThn4_N3ccc9CC1x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y113efgEv,_ZThn4_N3ccc9CC1x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x11y113pqrEv,_ZThn4_N3ccc9CC1x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x11y113efgEv,_ZThn4_N3ccc9CC1x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y11E[];
Class_Descriptor cd__ZN3ccc9CC1x11y11E = {  "_ZN3ccc9CC1x11y11E", // class name
  bases__ZN3ccc9CC1x11y11E, 2,
  &(vtc__ZN3ccc9CC1x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y12  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC1x11y123abcEv
  ~CC1x11y12(); // tgen
  CC1x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y12E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC1x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x11y123abcEv");}
ccc::CC1x11y12 ::~CC1x11y12(){ note_dtor("_ZN3ccc9CC1x11y12E", this);} // tgen
ccc::CC1x11y12 ::CC1x11y12(){ note_ctor("_ZN3ccc9CC1x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y12E, buf);
    ::ccc::CC1x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y12E);
    dp->::ccc::CC1x11y12::~CC1x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y12E(Test__ZN3ccc9CC1x11y12E, "_ZN3ccc9CC1x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y12C1Ev();
extern void _ZN3ccc9CC1x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y12E[] = {
  NSPAIR(_ZN3ccc9CC1x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y12E[];
extern void _ZN3ccc9CC1x11y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y12E[];
Class_Descriptor cd__ZN3ccc9CC1x11y12E = {  "_ZN3ccc9CC1x11y12E", // class name
  bases__ZN3ccc9CC1x11y12E, 2,
  &(vtc__ZN3ccc9CC1x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y13  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC1x11y133efgEv
  ~CC1x11y13(); // tgen
  CC1x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC1x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x11y133efgEv");}
ccc::CC1x11y13 ::~CC1x11y13(){ note_dtor("_ZN3ccc9CC1x11y13E", this);} // tgen
ccc::CC1x11y13 ::CC1x11y13(){ note_ctor("_ZN3ccc9CC1x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y13E, buf);
    ::ccc::CC1x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y13E);
    dp->::ccc::CC1x11y13::~CC1x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y13E(Test__ZN3ccc9CC1x11y13E, "_ZN3ccc9CC1x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y13C1Ev();
extern void _ZN3ccc9CC1x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y13E[] = {
  NSPAIR(_ZN3ccc9CC1x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y133efgEv,_ZThn4_N3ccc9CC1x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x11y133efgEv,_ZThn4_N3ccc9CC1x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y13E[];
Class_Descriptor cd__ZN3ccc9CC1x11y13E = {  "_ZN3ccc9CC1x11y13E", // class name
  bases__ZN3ccc9CC1x11y13E, 2,
  &(vtc__ZN3ccc9CC1x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y14  : ::ccc::AA1 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC1x11y143pqrEv
  ~CC1x11y14(); // tgen
  CC1x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC1x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x11y143pqrEv");}
ccc::CC1x11y14 ::~CC1x11y14(){ note_dtor("_ZN3ccc9CC1x11y14E", this);} // tgen
ccc::CC1x11y14 ::CC1x11y14(){ note_ctor("_ZN3ccc9CC1x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y14E, buf);
    ::ccc::CC1x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y14E);
    dp->::ccc::CC1x11y14::~CC1x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y14E(Test__ZN3ccc9CC1x11y14E, "_ZN3ccc9CC1x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y14C1Ev();
extern void _ZN3ccc9CC1x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y14E[] = {
  NSPAIR(_ZN3ccc9CC1x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x11y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x11y143pqrEv,_ZThn4_N3ccc9CC1x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x11y143pqrEv,_ZThn4_N3ccc9CC1x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y14E[];
Class_Descriptor cd__ZN3ccc9CC1x11y14E = {  "_ZN3ccc9CC1x11y14E", // class name
  bases__ZN3ccc9CC1x11y14E, 2,
  &(vtc__ZN3ccc9CC1x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x11y15  : ::ccc::AA1 , ::ccc::BB11 {
  ~CC1x11y15(); // tgen
  CC1x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x11y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC1x11y15 ::~CC1x11y15(){ note_dtor("_ZN3ccc9CC1x11y15E", this);} // tgen
ccc::CC1x11y15 ::CC1x11y15(){ note_ctor("_ZN3ccc9CC1x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x11y15E, buf);
    ::ccc::CC1x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x11y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC1x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x11y15E);
    dp->::ccc::CC1x11y15::~CC1x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x11y15E(Test__ZN3ccc9CC1x11y15E, "_ZN3ccc9CC1x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x11y15C1Ev();
extern void _ZN3ccc9CC1x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x11y15E[] = {
  NSPAIR(_ZN3ccc9CC1x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC1x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x11y15E[];
Class_Descriptor cd__ZN3ccc9CC1x11y15E = {  "_ZN3ccc9CC1x11y15E", // class name
  bases__ZN3ccc9CC1x11y15E, 2,
  &(vtc__ZN3ccc9CC1x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y0  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y03pqrEv
  ~CC1x12y0(); // tgen
  CC1x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y0E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y03abcEv");}
void  ccc::CC1x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y03efgEv");}
void  ccc::CC1x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y03pqrEv");}
ccc::CC1x12y0 ::~CC1x12y0(){ note_dtor("_ZN3ccc8CC1x12y0E", this);} // tgen
ccc::CC1x12y0 ::CC1x12y0(){ note_ctor("_ZN3ccc8CC1x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y0E, buf);
    ::ccc::CC1x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y0E);
    dp->::ccc::CC1x12y0::~CC1x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y0E(Test__ZN3ccc8CC1x12y0E, "_ZN3ccc8CC1x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y0C1Ev();
extern void _ZN3ccc8CC1x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y0E[] = {
  NSPAIR(_ZN3ccc8CC1x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y0E[];
extern void _ZN3ccc8CC1x12y03abcEv();
extern void _ZN3ccc8CC1x12y03pqrEv();
extern void _ZN3ccc8CC1x12y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y03abcEv,_ZThn4_N3ccc8CC1x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y03abcEv,_ZThn4_N3ccc8CC1x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y0E[];
Class_Descriptor cd__ZN3ccc8CC1x12y0E = {  "_ZN3ccc8CC1x12y0E", // class name
  bases__ZN3ccc8CC1x12y0E, 2,
  &(vtc__ZN3ccc8CC1x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y1  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x12y13efgEv
  ~CC1x12y1(); // tgen
  CC1x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y1E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y13abcEv");}
void  ccc::CC1x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y13pqrEv");}
void  ccc::CC1x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y13efgEv");}
ccc::CC1x12y1 ::~CC1x12y1(){ note_dtor("_ZN3ccc8CC1x12y1E", this);} // tgen
ccc::CC1x12y1 ::CC1x12y1(){ note_ctor("_ZN3ccc8CC1x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y1E, buf);
    ::ccc::CC1x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y1E);
    dp->::ccc::CC1x12y1::~CC1x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y1E(Test__ZN3ccc8CC1x12y1E, "_ZN3ccc8CC1x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y1C1Ev();
extern void _ZN3ccc8CC1x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y1E[] = {
  NSPAIR(_ZN3ccc8CC1x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y1E[];
extern void _ZN3ccc8CC1x12y13abcEv();
extern void _ZN3ccc8CC1x12y13pqrEv();
extern void _ZN3ccc8CC1x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y13abcEv,_ZThn4_N3ccc8CC1x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y13abcEv,_ZThn4_N3ccc8CC1x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y1E[];
Class_Descriptor cd__ZN3ccc8CC1x12y1E = {  "_ZN3ccc8CC1x12y1E", // class name
  bases__ZN3ccc8CC1x12y1E, 2,
  &(vtc__ZN3ccc8CC1x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y2  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y23pqrEv
  ~CC1x12y2(); // tgen
  CC1x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y2E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y23efgEv");}
void  ccc::CC1x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y23abcEv");}
void  ccc::CC1x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y23pqrEv");}
ccc::CC1x12y2 ::~CC1x12y2(){ note_dtor("_ZN3ccc8CC1x12y2E", this);} // tgen
ccc::CC1x12y2 ::CC1x12y2(){ note_ctor("_ZN3ccc8CC1x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y2E, buf);
    ::ccc::CC1x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y2E);
    dp->::ccc::CC1x12y2::~CC1x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y2E(Test__ZN3ccc8CC1x12y2E, "_ZN3ccc8CC1x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y2C1Ev();
extern void _ZN3ccc8CC1x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y2E[] = {
  NSPAIR(_ZN3ccc8CC1x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y2E[];
extern void _ZN3ccc8CC1x12y23abcEv();
extern void _ZN3ccc8CC1x12y23pqrEv();
extern void _ZN3ccc8CC1x12y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y23abcEv,_ZThn4_N3ccc8CC1x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y23abcEv,_ZThn4_N3ccc8CC1x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y2E[];
Class_Descriptor cd__ZN3ccc8CC1x12y2E = {  "_ZN3ccc8CC1x12y2E", // class name
  bases__ZN3ccc8CC1x12y2E, 2,
  &(vtc__ZN3ccc8CC1x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y3  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x12y33abcEv
  ~CC1x12y3(); // tgen
  CC1x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y3E) C1{ BC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y33efgEv");}
void  ccc::CC1x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y33pqrEv");}
void  ccc::CC1x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y33abcEv");}
ccc::CC1x12y3 ::~CC1x12y3(){ note_dtor("_ZN3ccc8CC1x12y3E", this);} // tgen
ccc::CC1x12y3 ::CC1x12y3(){ note_ctor("_ZN3ccc8CC1x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y3E, buf);
    ::ccc::CC1x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y3E);
    dp->::ccc::CC1x12y3::~CC1x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y3E(Test__ZN3ccc8CC1x12y3E, "_ZN3ccc8CC1x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y3C1Ev();
extern void _ZN3ccc8CC1x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y3E[] = {
  NSPAIR(_ZN3ccc8CC1x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y3E[];
extern void _ZN3ccc8CC1x12y33abcEv();
extern void _ZN3ccc8CC1x12y33pqrEv();
extern void _ZN3ccc8CC1x12y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y33abcEv,_ZThn4_N3ccc8CC1x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y33abcEv,_ZThn4_N3ccc8CC1x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y3E[];
Class_Descriptor cd__ZN3ccc8CC1x12y3E = {  "_ZN3ccc8CC1x12y3E", // class name
  bases__ZN3ccc8CC1x12y3E, 2,
  &(vtc__ZN3ccc8CC1x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y4  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC1x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y43efgEv
  ~CC1x12y4(); // tgen
  CC1x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y4E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y43pqrEv");}
void  ccc::CC1x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y43abcEv");}
void  ccc::CC1x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y43efgEv");}
ccc::CC1x12y4 ::~CC1x12y4(){ note_dtor("_ZN3ccc8CC1x12y4E", this);} // tgen
ccc::CC1x12y4 ::CC1x12y4(){ note_ctor("_ZN3ccc8CC1x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y4E, buf);
    ::ccc::CC1x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y4E);
    dp->::ccc::CC1x12y4::~CC1x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y4E(Test__ZN3ccc8CC1x12y4E, "_ZN3ccc8CC1x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y4C1Ev();
extern void _ZN3ccc8CC1x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y4E[] = {
  NSPAIR(_ZN3ccc8CC1x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y4E[];
extern void _ZN3ccc8CC1x12y43abcEv();
extern void _ZN3ccc8CC1x12y43pqrEv();
extern void _ZN3ccc8CC1x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y43abcEv,_ZThn4_N3ccc8CC1x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y43abcEv,_ZThn4_N3ccc8CC1x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y4E[];
Class_Descriptor cd__ZN3ccc8CC1x12y4E = {  "_ZN3ccc8CC1x12y4E", // class name
  bases__ZN3ccc8CC1x12y4E, 2,
  &(vtc__ZN3ccc8CC1x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y5  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC1x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y53abcEv
  ~CC1x12y5(); // tgen
  CC1x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y5E) C1{ BC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y53pqrEv");}
void  ccc::CC1x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y53efgEv");}
void  ccc::CC1x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y53abcEv");}
ccc::CC1x12y5 ::~CC1x12y5(){ note_dtor("_ZN3ccc8CC1x12y5E", this);} // tgen
ccc::CC1x12y5 ::CC1x12y5(){ note_ctor("_ZN3ccc8CC1x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y5E, buf);
    ::ccc::CC1x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y5E);
    dp->::ccc::CC1x12y5::~CC1x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y5E(Test__ZN3ccc8CC1x12y5E, "_ZN3ccc8CC1x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y5C1Ev();
extern void _ZN3ccc8CC1x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y5E[] = {
  NSPAIR(_ZN3ccc8CC1x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y5E[];
extern void _ZN3ccc8CC1x12y53abcEv();
extern void _ZN3ccc8CC1x12y53pqrEv();
extern void _ZN3ccc8CC1x12y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y53abcEv,_ZThn4_N3ccc8CC1x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y53abcEv,_ZThn4_N3ccc8CC1x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y5E[];
Class_Descriptor cd__ZN3ccc8CC1x12y5E = {  "_ZN3ccc8CC1x12y5E", // class name
  bases__ZN3ccc8CC1x12y5E, 2,
  &(vtc__ZN3ccc8CC1x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y6  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x12y63efgEv
  ~CC1x12y6(); // tgen
  CC1x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y6E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y63abcEv");}
void  ccc::CC1x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y63efgEv");}
ccc::CC1x12y6 ::~CC1x12y6(){ note_dtor("_ZN3ccc8CC1x12y6E", this);} // tgen
ccc::CC1x12y6 ::CC1x12y6(){ note_ctor("_ZN3ccc8CC1x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y6E, buf);
    ::ccc::CC1x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y6E);
    dp->::ccc::CC1x12y6::~CC1x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y6E(Test__ZN3ccc8CC1x12y6E, "_ZN3ccc8CC1x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y6C1Ev();
extern void _ZN3ccc8CC1x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y6E[] = {
  NSPAIR(_ZN3ccc8CC1x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y6E[];
extern void _ZN3ccc8CC1x12y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y63abcEv,_ZThn4_N3ccc8CC1x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y63abcEv,_ZThn4_N3ccc8CC1x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y6E[];
Class_Descriptor cd__ZN3ccc8CC1x12y6E = {  "_ZN3ccc8CC1x12y6E", // class name
  bases__ZN3ccc8CC1x12y6E, 2,
  &(vtc__ZN3ccc8CC1x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y7  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC1x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y73pqrEv
  ~CC1x12y7(); // tgen
  CC1x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y7E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y73abcEv");}
void  ccc::CC1x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y73pqrEv");}
ccc::CC1x12y7 ::~CC1x12y7(){ note_dtor("_ZN3ccc8CC1x12y7E", this);} // tgen
ccc::CC1x12y7 ::CC1x12y7(){ note_ctor("_ZN3ccc8CC1x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y7E, buf);
    ::ccc::CC1x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y7E);
    dp->::ccc::CC1x12y7::~CC1x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y7E(Test__ZN3ccc8CC1x12y7E, "_ZN3ccc8CC1x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y7C1Ev();
extern void _ZN3ccc8CC1x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y7E[] = {
  NSPAIR(_ZN3ccc8CC1x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y7E[];
extern void _ZN3ccc8CC1x12y73abcEv();
extern void _ZN3ccc8CC1x12y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y73abcEv,_ZThn4_N3ccc8CC1x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y73abcEv,_ZThn4_N3ccc8CC1x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y7E[];
Class_Descriptor cd__ZN3ccc8CC1x12y7E = {  "_ZN3ccc8CC1x12y7E", // class name
  bases__ZN3ccc8CC1x12y7E, 2,
  &(vtc__ZN3ccc8CC1x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y8  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x12y83abcEv
  ~CC1x12y8(); // tgen
  CC1x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y8E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y83efgEv");}
void  ccc::CC1x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x12y83abcEv");}
ccc::CC1x12y8 ::~CC1x12y8(){ note_dtor("_ZN3ccc8CC1x12y8E", this);} // tgen
ccc::CC1x12y8 ::CC1x12y8(){ note_ctor("_ZN3ccc8CC1x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y8E, buf);
    ::ccc::CC1x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y8E);
    dp->::ccc::CC1x12y8::~CC1x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y8E(Test__ZN3ccc8CC1x12y8E, "_ZN3ccc8CC1x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y8C1Ev();
extern void _ZN3ccc8CC1x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y8E[] = {
  NSPAIR(_ZN3ccc8CC1x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y8E[];
extern void _ZN3ccc8CC1x12y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x12y83abcEv,_ZThn4_N3ccc8CC1x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x12y83abcEv,_ZThn4_N3ccc8CC1x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y8E[];
Class_Descriptor cd__ZN3ccc8CC1x12y8E = {  "_ZN3ccc8CC1x12y8E", // class name
  bases__ZN3ccc8CC1x12y8E, 2,
  &(vtc__ZN3ccc8CC1x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y9  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC1x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x12y93pqrEv
  ~CC1x12y9(); // tgen
  CC1x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x12y9E) C1{ BC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x12y93efgEv");}
void  ccc::CC1x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x12y93pqrEv");}
ccc::CC1x12y9 ::~CC1x12y9(){ note_dtor("_ZN3ccc8CC1x12y9E", this);} // tgen
ccc::CC1x12y9 ::CC1x12y9(){ note_ctor("_ZN3ccc8CC1x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x12y9E, buf);
    ::ccc::CC1x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x12y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC1x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x12y9E);
    dp->::ccc::CC1x12y9::~CC1x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x12y9E(Test__ZN3ccc8CC1x12y9E, "_ZN3ccc8CC1x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x12y9C1Ev();
extern void _ZN3ccc8CC1x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x12y9E[] = {
  NSPAIR(_ZN3ccc8CC1x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC1x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x12y93pqrEv();
extern void _ZN3ccc8CC1x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x12y9E[];
Class_Descriptor cd__ZN3ccc8CC1x12y9E = {  "_ZN3ccc8CC1x12y9E", // class name
  bases__ZN3ccc8CC1x12y9E, 2,
  &(vtc__ZN3ccc8CC1x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y10  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x12y103abcEv
  ~CC1x12y10(); // tgen
  CC1x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y10E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y103pqrEv");}
void  ccc::CC1x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x12y103abcEv");}
ccc::CC1x12y10 ::~CC1x12y10(){ note_dtor("_ZN3ccc9CC1x12y10E", this);} // tgen
ccc::CC1x12y10 ::CC1x12y10(){ note_ctor("_ZN3ccc9CC1x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y10E, buf);
    ::ccc::CC1x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y10E);
    dp->::ccc::CC1x12y10::~CC1x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y10E(Test__ZN3ccc9CC1x12y10E, "_ZN3ccc9CC1x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y10C1Ev();
extern void _ZN3ccc9CC1x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y10E[] = {
  NSPAIR(_ZN3ccc9CC1x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y10E[];
extern void _ZN3ccc9CC1x12y103abcEv();
extern void _ZN3ccc9CC1x12y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y103abcEv,_ZThn4_N3ccc9CC1x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x12y103abcEv,_ZThn4_N3ccc9CC1x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y10E[];
Class_Descriptor cd__ZN3ccc9CC1x12y10E = {  "_ZN3ccc9CC1x12y10E", // class name
  bases__ZN3ccc9CC1x12y10E, 2,
  &(vtc__ZN3ccc9CC1x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y11  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x12y113efgEv
  ~CC1x12y11(); // tgen
  CC1x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y11E) C1{ BC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y113pqrEv");}
void  ccc::CC1x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x12y113efgEv");}
ccc::CC1x12y11 ::~CC1x12y11(){ note_dtor("_ZN3ccc9CC1x12y11E", this);} // tgen
ccc::CC1x12y11 ::CC1x12y11(){ note_ctor("_ZN3ccc9CC1x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y11E, buf);
    ::ccc::CC1x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y11E);
    dp->::ccc::CC1x12y11::~CC1x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y11E(Test__ZN3ccc9CC1x12y11E, "_ZN3ccc9CC1x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y11C1Ev();
extern void _ZN3ccc9CC1x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y11E[] = {
  NSPAIR(_ZN3ccc9CC1x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x12y113pqrEv();
extern void _ZN3ccc9CC1x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y11E[];
Class_Descriptor cd__ZN3ccc9CC1x12y11E = {  "_ZN3ccc9CC1x12y11E", // class name
  bases__ZN3ccc9CC1x12y11E, 2,
  &(vtc__ZN3ccc9CC1x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y12  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC1x12y123abcEv
  ~CC1x12y12(); // tgen
  CC1x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y12E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x12y123abcEv");}
ccc::CC1x12y12 ::~CC1x12y12(){ note_dtor("_ZN3ccc9CC1x12y12E", this);} // tgen
ccc::CC1x12y12 ::CC1x12y12(){ note_ctor("_ZN3ccc9CC1x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y12E, buf);
    ::ccc::CC1x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y12E);
    dp->::ccc::CC1x12y12::~CC1x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y12E(Test__ZN3ccc9CC1x12y12E, "_ZN3ccc9CC1x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y12C1Ev();
extern void _ZN3ccc9CC1x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y12E[] = {
  NSPAIR(_ZN3ccc9CC1x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y12E[];
extern void _ZN3ccc9CC1x12y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x12y123abcEv,_ZThn4_N3ccc9CC1x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x12y123abcEv,_ZThn4_N3ccc9CC1x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y12E[];
Class_Descriptor cd__ZN3ccc9CC1x12y12E = {  "_ZN3ccc9CC1x12y12E", // class name
  bases__ZN3ccc9CC1x12y12E, 2,
  &(vtc__ZN3ccc9CC1x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y13  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC1x12y133efgEv
  ~CC1x12y13(); // tgen
  CC1x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y13E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x12y133efgEv");}
ccc::CC1x12y13 ::~CC1x12y13(){ note_dtor("_ZN3ccc9CC1x12y13E", this);} // tgen
ccc::CC1x12y13 ::CC1x12y13(){ note_ctor("_ZN3ccc9CC1x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y13E, buf);
    ::ccc::CC1x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y13E);
    dp->::ccc::CC1x12y13::~CC1x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y13E(Test__ZN3ccc9CC1x12y13E, "_ZN3ccc9CC1x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y13C1Ev();
extern void _ZN3ccc9CC1x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y13E[] = {
  NSPAIR(_ZN3ccc9CC1x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y13E[];
Class_Descriptor cd__ZN3ccc9CC1x12y13E = {  "_ZN3ccc9CC1x12y13E", // class name
  bases__ZN3ccc9CC1x12y13E, 2,
  &(vtc__ZN3ccc9CC1x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y14  : ::ccc::AA1 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC1x12y143pqrEv
  ~CC1x12y14(); // tgen
  CC1x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y14E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x12y143pqrEv");}
ccc::CC1x12y14 ::~CC1x12y14(){ note_dtor("_ZN3ccc9CC1x12y14E", this);} // tgen
ccc::CC1x12y14 ::CC1x12y14(){ note_ctor("_ZN3ccc9CC1x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y14E, buf);
    ::ccc::CC1x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y14E);
    dp->::ccc::CC1x12y14::~CC1x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y14E(Test__ZN3ccc9CC1x12y14E, "_ZN3ccc9CC1x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y14C1Ev();
extern void _ZN3ccc9CC1x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y14E[] = {
  NSPAIR(_ZN3ccc9CC1x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x12y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y14E[];
Class_Descriptor cd__ZN3ccc9CC1x12y14E = {  "_ZN3ccc9CC1x12y14E", // class name
  bases__ZN3ccc9CC1x12y14E, 2,
  &(vtc__ZN3ccc9CC1x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x12y15  : ::ccc::AA1 , ::ccc::BB12 {
  ~CC1x12y15(); // tgen
  CC1x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x12y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x12y15 ::~CC1x12y15(){ note_dtor("_ZN3ccc9CC1x12y15E", this);} // tgen
ccc::CC1x12y15 ::CC1x12y15(){ note_ctor("_ZN3ccc9CC1x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x12y15E, buf);
    ::ccc::CC1x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x12y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC1x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x12y15E);
    dp->::ccc::CC1x12y15::~CC1x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x12y15E(Test__ZN3ccc9CC1x12y15E, "_ZN3ccc9CC1x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x12y15C1Ev();
extern void _ZN3ccc9CC1x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x12y15E[] = {
  NSPAIR(_ZN3ccc9CC1x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC1x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x12y15E[];
Class_Descriptor cd__ZN3ccc9CC1x12y15E = {  "_ZN3ccc9CC1x12y15E", // class name
  bases__ZN3ccc9CC1x12y15E, 2,
  &(vtc__ZN3ccc9CC1x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y0  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y03pqrEv
  ~CC1x13y0(); // tgen
  CC1x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y0E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y03abcEv");}
void  ccc::CC1x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y03efgEv");}
void  ccc::CC1x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y03pqrEv");}
ccc::CC1x13y0 ::~CC1x13y0(){ note_dtor("_ZN3ccc8CC1x13y0E", this);} // tgen
ccc::CC1x13y0 ::CC1x13y0(){ note_ctor("_ZN3ccc8CC1x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y0E, buf);
    ::ccc::CC1x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y0E);
    dp->::ccc::CC1x13y0::~CC1x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y0E(Test__ZN3ccc8CC1x13y0E, "_ZN3ccc8CC1x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y0C1Ev();
extern void _ZN3ccc8CC1x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y0E[] = {
  NSPAIR(_ZN3ccc8CC1x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y0E[];
extern void _ZN3ccc8CC1x13y03abcEv();
extern void _ZN3ccc8CC1x13y03pqrEv();
extern void _ZN3ccc8CC1x13y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y03efgEv,_ZThn4_N3ccc8CC1x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y03efgEv,_ZThn4_N3ccc8CC1x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y0E[];
Class_Descriptor cd__ZN3ccc8CC1x13y0E = {  "_ZN3ccc8CC1x13y0E", // class name
  bases__ZN3ccc8CC1x13y0E, 2,
  &(vtc__ZN3ccc8CC1x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y1  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x13y13efgEv
  ~CC1x13y1(); // tgen
  CC1x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y1E) C1{ BC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y13abcEv");}
void  ccc::CC1x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y13pqrEv");}
void  ccc::CC1x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y13efgEv");}
ccc::CC1x13y1 ::~CC1x13y1(){ note_dtor("_ZN3ccc8CC1x13y1E", this);} // tgen
ccc::CC1x13y1 ::CC1x13y1(){ note_ctor("_ZN3ccc8CC1x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y1E, buf);
    ::ccc::CC1x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y1E);
    dp->::ccc::CC1x13y1::~CC1x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y1E(Test__ZN3ccc8CC1x13y1E, "_ZN3ccc8CC1x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y1C1Ev();
extern void _ZN3ccc8CC1x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y1E[] = {
  NSPAIR(_ZN3ccc8CC1x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y1E[];
extern void _ZN3ccc8CC1x13y13abcEv();
extern void _ZN3ccc8CC1x13y13pqrEv();
extern void _ZN3ccc8CC1x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y13efgEv,_ZThn4_N3ccc8CC1x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y13efgEv,_ZThn4_N3ccc8CC1x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y1E[];
Class_Descriptor cd__ZN3ccc8CC1x13y1E = {  "_ZN3ccc8CC1x13y1E", // class name
  bases__ZN3ccc8CC1x13y1E, 2,
  &(vtc__ZN3ccc8CC1x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y2  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y23pqrEv
  ~CC1x13y2(); // tgen
  CC1x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y2E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y23efgEv");}
void  ccc::CC1x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y23abcEv");}
void  ccc::CC1x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y23pqrEv");}
ccc::CC1x13y2 ::~CC1x13y2(){ note_dtor("_ZN3ccc8CC1x13y2E", this);} // tgen
ccc::CC1x13y2 ::CC1x13y2(){ note_ctor("_ZN3ccc8CC1x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y2E, buf);
    ::ccc::CC1x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y2E);
    dp->::ccc::CC1x13y2::~CC1x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y2E(Test__ZN3ccc8CC1x13y2E, "_ZN3ccc8CC1x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y2C1Ev();
extern void _ZN3ccc8CC1x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y2E[] = {
  NSPAIR(_ZN3ccc8CC1x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y2E[];
extern void _ZN3ccc8CC1x13y23abcEv();
extern void _ZN3ccc8CC1x13y23pqrEv();
extern void _ZN3ccc8CC1x13y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y23efgEv,_ZThn4_N3ccc8CC1x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y23efgEv,_ZThn4_N3ccc8CC1x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y2E[];
Class_Descriptor cd__ZN3ccc8CC1x13y2E = {  "_ZN3ccc8CC1x13y2E", // class name
  bases__ZN3ccc8CC1x13y2E, 2,
  &(vtc__ZN3ccc8CC1x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y3  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x13y33abcEv
  ~CC1x13y3(); // tgen
  CC1x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y3E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y33efgEv");}
void  ccc::CC1x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y33pqrEv");}
void  ccc::CC1x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y33abcEv");}
ccc::CC1x13y3 ::~CC1x13y3(){ note_dtor("_ZN3ccc8CC1x13y3E", this);} // tgen
ccc::CC1x13y3 ::CC1x13y3(){ note_ctor("_ZN3ccc8CC1x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y3E, buf);
    ::ccc::CC1x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y3E);
    dp->::ccc::CC1x13y3::~CC1x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y3E(Test__ZN3ccc8CC1x13y3E, "_ZN3ccc8CC1x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y3C1Ev();
extern void _ZN3ccc8CC1x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y3E[] = {
  NSPAIR(_ZN3ccc8CC1x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y3E[];
extern void _ZN3ccc8CC1x13y33abcEv();
extern void _ZN3ccc8CC1x13y33pqrEv();
extern void _ZN3ccc8CC1x13y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y33efgEv,_ZThn4_N3ccc8CC1x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y33efgEv,_ZThn4_N3ccc8CC1x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y3E[];
Class_Descriptor cd__ZN3ccc8CC1x13y3E = {  "_ZN3ccc8CC1x13y3E", // class name
  bases__ZN3ccc8CC1x13y3E, 2,
  &(vtc__ZN3ccc8CC1x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y4  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC1x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y43efgEv
  ~CC1x13y4(); // tgen
  CC1x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y4E) C1{ BC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y43pqrEv");}
void  ccc::CC1x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y43abcEv");}
void  ccc::CC1x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y43efgEv");}
ccc::CC1x13y4 ::~CC1x13y4(){ note_dtor("_ZN3ccc8CC1x13y4E", this);} // tgen
ccc::CC1x13y4 ::CC1x13y4(){ note_ctor("_ZN3ccc8CC1x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y4E, buf);
    ::ccc::CC1x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y4E);
    dp->::ccc::CC1x13y4::~CC1x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y4E(Test__ZN3ccc8CC1x13y4E, "_ZN3ccc8CC1x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y4C1Ev();
extern void _ZN3ccc8CC1x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y4E[] = {
  NSPAIR(_ZN3ccc8CC1x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y4E[];
extern void _ZN3ccc8CC1x13y43abcEv();
extern void _ZN3ccc8CC1x13y43pqrEv();
extern void _ZN3ccc8CC1x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y43efgEv,_ZThn4_N3ccc8CC1x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y43efgEv,_ZThn4_N3ccc8CC1x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y4E[];
Class_Descriptor cd__ZN3ccc8CC1x13y4E = {  "_ZN3ccc8CC1x13y4E", // class name
  bases__ZN3ccc8CC1x13y4E, 2,
  &(vtc__ZN3ccc8CC1x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y5  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC1x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y53abcEv
  ~CC1x13y5(); // tgen
  CC1x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y5E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y53pqrEv");}
void  ccc::CC1x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y53efgEv");}
void  ccc::CC1x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y53abcEv");}
ccc::CC1x13y5 ::~CC1x13y5(){ note_dtor("_ZN3ccc8CC1x13y5E", this);} // tgen
ccc::CC1x13y5 ::CC1x13y5(){ note_ctor("_ZN3ccc8CC1x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y5E, buf);
    ::ccc::CC1x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y5E);
    dp->::ccc::CC1x13y5::~CC1x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y5E(Test__ZN3ccc8CC1x13y5E, "_ZN3ccc8CC1x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y5C1Ev();
extern void _ZN3ccc8CC1x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y5E[] = {
  NSPAIR(_ZN3ccc8CC1x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y5E[];
extern void _ZN3ccc8CC1x13y53abcEv();
extern void _ZN3ccc8CC1x13y53pqrEv();
extern void _ZN3ccc8CC1x13y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y53efgEv,_ZThn4_N3ccc8CC1x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y53efgEv,_ZThn4_N3ccc8CC1x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y5E[];
Class_Descriptor cd__ZN3ccc8CC1x13y5E = {  "_ZN3ccc8CC1x13y5E", // class name
  bases__ZN3ccc8CC1x13y5E, 2,
  &(vtc__ZN3ccc8CC1x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y6  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x13y63efgEv
  ~CC1x13y6(); // tgen
  CC1x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y6E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y63abcEv");}
void  ccc::CC1x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y63efgEv");}
ccc::CC1x13y6 ::~CC1x13y6(){ note_dtor("_ZN3ccc8CC1x13y6E", this);} // tgen
ccc::CC1x13y6 ::CC1x13y6(){ note_ctor("_ZN3ccc8CC1x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y6E, buf);
    ::ccc::CC1x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y6E);
    dp->::ccc::CC1x13y6::~CC1x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y6E(Test__ZN3ccc8CC1x13y6E, "_ZN3ccc8CC1x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y6C1Ev();
extern void _ZN3ccc8CC1x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y6E[] = {
  NSPAIR(_ZN3ccc8CC1x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y6E[];
extern void _ZN3ccc8CC1x13y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y63efgEv,_ZThn4_N3ccc8CC1x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y63efgEv,_ZThn4_N3ccc8CC1x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y6E[];
Class_Descriptor cd__ZN3ccc8CC1x13y6E = {  "_ZN3ccc8CC1x13y6E", // class name
  bases__ZN3ccc8CC1x13y6E, 2,
  &(vtc__ZN3ccc8CC1x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y7  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC1x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y73pqrEv
  ~CC1x13y7(); // tgen
  CC1x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y7E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y73abcEv");}
void  ccc::CC1x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y73pqrEv");}
ccc::CC1x13y7 ::~CC1x13y7(){ note_dtor("_ZN3ccc8CC1x13y7E", this);} // tgen
ccc::CC1x13y7 ::CC1x13y7(){ note_ctor("_ZN3ccc8CC1x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y7E, buf);
    ::ccc::CC1x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y7E);
    dp->::ccc::CC1x13y7::~CC1x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y7E(Test__ZN3ccc8CC1x13y7E, "_ZN3ccc8CC1x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y7C1Ev();
extern void _ZN3ccc8CC1x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y7E[] = {
  NSPAIR(_ZN3ccc8CC1x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y7E[];
extern void _ZN3ccc8CC1x13y73abcEv();
extern void _ZN3ccc8CC1x13y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y7E[];
Class_Descriptor cd__ZN3ccc8CC1x13y7E = {  "_ZN3ccc8CC1x13y7E", // class name
  bases__ZN3ccc8CC1x13y7E, 2,
  &(vtc__ZN3ccc8CC1x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y8  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x13y83abcEv
  ~CC1x13y8(); // tgen
  CC1x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y8E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y83efgEv");}
void  ccc::CC1x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x13y83abcEv");}
ccc::CC1x13y8 ::~CC1x13y8(){ note_dtor("_ZN3ccc8CC1x13y8E", this);} // tgen
ccc::CC1x13y8 ::CC1x13y8(){ note_ctor("_ZN3ccc8CC1x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y8E, buf);
    ::ccc::CC1x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y8E);
    dp->::ccc::CC1x13y8::~CC1x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y8E(Test__ZN3ccc8CC1x13y8E, "_ZN3ccc8CC1x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y8C1Ev();
extern void _ZN3ccc8CC1x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y8E[] = {
  NSPAIR(_ZN3ccc8CC1x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y8E[];
extern void _ZN3ccc8CC1x13y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y83efgEv,_ZThn4_N3ccc8CC1x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y83efgEv,_ZThn4_N3ccc8CC1x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y8E[];
Class_Descriptor cd__ZN3ccc8CC1x13y8E = {  "_ZN3ccc8CC1x13y8E", // class name
  bases__ZN3ccc8CC1x13y8E, 2,
  &(vtc__ZN3ccc8CC1x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y9  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC1x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x13y93pqrEv
  ~CC1x13y9(); // tgen
  CC1x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x13y9E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x13y93efgEv");}
void  ccc::CC1x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x13y93pqrEv");}
ccc::CC1x13y9 ::~CC1x13y9(){ note_dtor("_ZN3ccc8CC1x13y9E", this);} // tgen
ccc::CC1x13y9 ::CC1x13y9(){ note_ctor("_ZN3ccc8CC1x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x13y9E, buf);
    ::ccc::CC1x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x13y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC1x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x13y9E);
    dp->::ccc::CC1x13y9::~CC1x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x13y9E(Test__ZN3ccc8CC1x13y9E, "_ZN3ccc8CC1x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x13y9C1Ev();
extern void _ZN3ccc8CC1x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x13y9E[] = {
  NSPAIR(_ZN3ccc8CC1x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC1x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x13y93pqrEv();
extern void _ZN3ccc8CC1x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x13y93efgEv,_ZThn4_N3ccc8CC1x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x13y93efgEv,_ZThn4_N3ccc8CC1x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x13y9E[];
Class_Descriptor cd__ZN3ccc8CC1x13y9E = {  "_ZN3ccc8CC1x13y9E", // class name
  bases__ZN3ccc8CC1x13y9E, 2,
  &(vtc__ZN3ccc8CC1x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y10  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x13y103abcEv
  ~CC1x13y10(); // tgen
  CC1x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y10E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y103pqrEv");}
void  ccc::CC1x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x13y103abcEv");}
ccc::CC1x13y10 ::~CC1x13y10(){ note_dtor("_ZN3ccc9CC1x13y10E", this);} // tgen
ccc::CC1x13y10 ::CC1x13y10(){ note_ctor("_ZN3ccc9CC1x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y10E, buf);
    ::ccc::CC1x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y10E);
    dp->::ccc::CC1x13y10::~CC1x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y10E(Test__ZN3ccc9CC1x13y10E, "_ZN3ccc9CC1x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y10C1Ev();
extern void _ZN3ccc9CC1x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y10E[] = {
  NSPAIR(_ZN3ccc9CC1x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y10E[];
extern void _ZN3ccc9CC1x13y103abcEv();
extern void _ZN3ccc9CC1x13y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y10E[];
Class_Descriptor cd__ZN3ccc9CC1x13y10E = {  "_ZN3ccc9CC1x13y10E", // class name
  bases__ZN3ccc9CC1x13y10E, 2,
  &(vtc__ZN3ccc9CC1x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y11  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x13y113efgEv
  ~CC1x13y11(); // tgen
  CC1x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y11E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y113pqrEv");}
void  ccc::CC1x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x13y113efgEv");}
ccc::CC1x13y11 ::~CC1x13y11(){ note_dtor("_ZN3ccc9CC1x13y11E", this);} // tgen
ccc::CC1x13y11 ::CC1x13y11(){ note_ctor("_ZN3ccc9CC1x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y11E, buf);
    ::ccc::CC1x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y11E);
    dp->::ccc::CC1x13y11::~CC1x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y11E(Test__ZN3ccc9CC1x13y11E, "_ZN3ccc9CC1x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y11C1Ev();
extern void _ZN3ccc9CC1x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y11E[] = {
  NSPAIR(_ZN3ccc9CC1x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x13y113pqrEv();
extern void _ZN3ccc9CC1x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y113efgEv,_ZThn4_N3ccc9CC1x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x13y113efgEv,_ZThn4_N3ccc9CC1x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y11E[];
Class_Descriptor cd__ZN3ccc9CC1x13y11E = {  "_ZN3ccc9CC1x13y11E", // class name
  bases__ZN3ccc9CC1x13y11E, 2,
  &(vtc__ZN3ccc9CC1x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y12  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC1x13y123abcEv
  ~CC1x13y12(); // tgen
  CC1x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y12E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x13y123abcEv");}
ccc::CC1x13y12 ::~CC1x13y12(){ note_dtor("_ZN3ccc9CC1x13y12E", this);} // tgen
ccc::CC1x13y12 ::CC1x13y12(){ note_ctor("_ZN3ccc9CC1x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y12E, buf);
    ::ccc::CC1x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y12E);
    dp->::ccc::CC1x13y12::~CC1x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y12E(Test__ZN3ccc9CC1x13y12E, "_ZN3ccc9CC1x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y12C1Ev();
extern void _ZN3ccc9CC1x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y12E[] = {
  NSPAIR(_ZN3ccc9CC1x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y12E[];
extern void _ZN3ccc9CC1x13y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y12E[];
Class_Descriptor cd__ZN3ccc9CC1x13y12E = {  "_ZN3ccc9CC1x13y12E", // class name
  bases__ZN3ccc9CC1x13y12E, 2,
  &(vtc__ZN3ccc9CC1x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y13  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC1x13y133efgEv
  ~CC1x13y13(); // tgen
  CC1x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y13E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x13y133efgEv");}
ccc::CC1x13y13 ::~CC1x13y13(){ note_dtor("_ZN3ccc9CC1x13y13E", this);} // tgen
ccc::CC1x13y13 ::CC1x13y13(){ note_ctor("_ZN3ccc9CC1x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y13E, buf);
    ::ccc::CC1x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y13E);
    dp->::ccc::CC1x13y13::~CC1x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y13E(Test__ZN3ccc9CC1x13y13E, "_ZN3ccc9CC1x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y13C1Ev();
extern void _ZN3ccc9CC1x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y13E[] = {
  NSPAIR(_ZN3ccc9CC1x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x13y133efgEv,_ZThn4_N3ccc9CC1x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x13y133efgEv,_ZThn4_N3ccc9CC1x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y13E[];
Class_Descriptor cd__ZN3ccc9CC1x13y13E = {  "_ZN3ccc9CC1x13y13E", // class name
  bases__ZN3ccc9CC1x13y13E, 2,
  &(vtc__ZN3ccc9CC1x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y14  : ::ccc::AA1 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC1x13y143pqrEv
  ~CC1x13y14(); // tgen
  CC1x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y14E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x13y143pqrEv");}
ccc::CC1x13y14 ::~CC1x13y14(){ note_dtor("_ZN3ccc9CC1x13y14E", this);} // tgen
ccc::CC1x13y14 ::CC1x13y14(){ note_ctor("_ZN3ccc9CC1x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y14E, buf);
    ::ccc::CC1x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y14E);
    dp->::ccc::CC1x13y14::~CC1x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y14E(Test__ZN3ccc9CC1x13y14E, "_ZN3ccc9CC1x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y14C1Ev();
extern void _ZN3ccc9CC1x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y14E[] = {
  NSPAIR(_ZN3ccc9CC1x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x13y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y14E[];
Class_Descriptor cd__ZN3ccc9CC1x13y14E = {  "_ZN3ccc9CC1x13y14E", // class name
  bases__ZN3ccc9CC1x13y14E, 2,
  &(vtc__ZN3ccc9CC1x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x13y15  : ::ccc::AA1 , ::ccc::BB13 {
  ~CC1x13y15(); // tgen
  CC1x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x13y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x13y15 ::~CC1x13y15(){ note_dtor("_ZN3ccc9CC1x13y15E", this);} // tgen
ccc::CC1x13y15 ::CC1x13y15(){ note_ctor("_ZN3ccc9CC1x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x13y15E, buf);
    ::ccc::CC1x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x13y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC1x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x13y15E);
    dp->::ccc::CC1x13y15::~CC1x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x13y15E(Test__ZN3ccc9CC1x13y15E, "_ZN3ccc9CC1x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x13y15C1Ev();
extern void _ZN3ccc9CC1x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x13y15E[] = {
  NSPAIR(_ZN3ccc9CC1x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC1x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x13y15E[];
Class_Descriptor cd__ZN3ccc9CC1x13y15E = {  "_ZN3ccc9CC1x13y15E", // class name
  bases__ZN3ccc9CC1x13y15E, 2,
  &(vtc__ZN3ccc9CC1x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y0  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y03pqrEv
  ~CC1x14y0(); // tgen
  CC1x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y0E) C1{ BC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y03abcEv");}
void  ccc::CC1x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y03efgEv");}
void  ccc::CC1x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y03pqrEv");}
ccc::CC1x14y0 ::~CC1x14y0(){ note_dtor("_ZN3ccc8CC1x14y0E", this);} // tgen
ccc::CC1x14y0 ::CC1x14y0(){ note_ctor("_ZN3ccc8CC1x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y0E, buf);
    ::ccc::CC1x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y0E);
    dp->::ccc::CC1x14y0::~CC1x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y0E(Test__ZN3ccc8CC1x14y0E, "_ZN3ccc8CC1x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y0C1Ev();
extern void _ZN3ccc8CC1x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y0E[] = {
  NSPAIR(_ZN3ccc8CC1x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y0E[];
extern void _ZN3ccc8CC1x14y03abcEv();
extern void _ZN3ccc8CC1x14y03pqrEv();
extern void _ZN3ccc8CC1x14y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y03pqrEv,_ZThn4_N3ccc8CC1x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y03pqrEv,_ZThn4_N3ccc8CC1x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y0E[];
Class_Descriptor cd__ZN3ccc8CC1x14y0E = {  "_ZN3ccc8CC1x14y0E", // class name
  bases__ZN3ccc8CC1x14y0E, 2,
  &(vtc__ZN3ccc8CC1x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y1  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x14y13efgEv
  ~CC1x14y1(); // tgen
  CC1x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y1E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y13abcEv");}
void  ccc::CC1x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y13pqrEv");}
void  ccc::CC1x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y13efgEv");}
ccc::CC1x14y1 ::~CC1x14y1(){ note_dtor("_ZN3ccc8CC1x14y1E", this);} // tgen
ccc::CC1x14y1 ::CC1x14y1(){ note_ctor("_ZN3ccc8CC1x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y1E, buf);
    ::ccc::CC1x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y1E);
    dp->::ccc::CC1x14y1::~CC1x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y1E(Test__ZN3ccc8CC1x14y1E, "_ZN3ccc8CC1x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y1C1Ev();
extern void _ZN3ccc8CC1x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y1E[] = {
  NSPAIR(_ZN3ccc8CC1x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y1E[];
extern void _ZN3ccc8CC1x14y13abcEv();
extern void _ZN3ccc8CC1x14y13pqrEv();
extern void _ZN3ccc8CC1x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y13pqrEv,_ZThn4_N3ccc8CC1x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y13pqrEv,_ZThn4_N3ccc8CC1x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y1E[];
Class_Descriptor cd__ZN3ccc8CC1x14y1E = {  "_ZN3ccc8CC1x14y1E", // class name
  bases__ZN3ccc8CC1x14y1E, 2,
  &(vtc__ZN3ccc8CC1x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y2  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y23pqrEv
  ~CC1x14y2(); // tgen
  CC1x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y2E) C1{ BC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y23efgEv");}
void  ccc::CC1x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y23abcEv");}
void  ccc::CC1x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y23pqrEv");}
ccc::CC1x14y2 ::~CC1x14y2(){ note_dtor("_ZN3ccc8CC1x14y2E", this);} // tgen
ccc::CC1x14y2 ::CC1x14y2(){ note_ctor("_ZN3ccc8CC1x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y2E, buf);
    ::ccc::CC1x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y2E);
    dp->::ccc::CC1x14y2::~CC1x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y2E(Test__ZN3ccc8CC1x14y2E, "_ZN3ccc8CC1x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y2C1Ev();
extern void _ZN3ccc8CC1x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y2E[] = {
  NSPAIR(_ZN3ccc8CC1x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y2E[];
extern void _ZN3ccc8CC1x14y23abcEv();
extern void _ZN3ccc8CC1x14y23pqrEv();
extern void _ZN3ccc8CC1x14y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y23pqrEv,_ZThn4_N3ccc8CC1x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y23pqrEv,_ZThn4_N3ccc8CC1x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y2E[];
Class_Descriptor cd__ZN3ccc8CC1x14y2E = {  "_ZN3ccc8CC1x14y2E", // class name
  bases__ZN3ccc8CC1x14y2E, 2,
  &(vtc__ZN3ccc8CC1x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y3  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x14y33abcEv
  ~CC1x14y3(); // tgen
  CC1x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y3E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y33efgEv");}
void  ccc::CC1x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y33pqrEv");}
void  ccc::CC1x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y33abcEv");}
ccc::CC1x14y3 ::~CC1x14y3(){ note_dtor("_ZN3ccc8CC1x14y3E", this);} // tgen
ccc::CC1x14y3 ::CC1x14y3(){ note_ctor("_ZN3ccc8CC1x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y3E, buf);
    ::ccc::CC1x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y3E);
    dp->::ccc::CC1x14y3::~CC1x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y3E(Test__ZN3ccc8CC1x14y3E, "_ZN3ccc8CC1x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y3C1Ev();
extern void _ZN3ccc8CC1x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y3E[] = {
  NSPAIR(_ZN3ccc8CC1x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y3E[];
extern void _ZN3ccc8CC1x14y33abcEv();
extern void _ZN3ccc8CC1x14y33pqrEv();
extern void _ZN3ccc8CC1x14y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y33pqrEv,_ZThn4_N3ccc8CC1x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y33pqrEv,_ZThn4_N3ccc8CC1x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y3E[];
Class_Descriptor cd__ZN3ccc8CC1x14y3E = {  "_ZN3ccc8CC1x14y3E", // class name
  bases__ZN3ccc8CC1x14y3E, 2,
  &(vtc__ZN3ccc8CC1x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y4  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC1x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y43efgEv
  ~CC1x14y4(); // tgen
  CC1x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y4E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y43pqrEv");}
void  ccc::CC1x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y43abcEv");}
void  ccc::CC1x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y43efgEv");}
ccc::CC1x14y4 ::~CC1x14y4(){ note_dtor("_ZN3ccc8CC1x14y4E", this);} // tgen
ccc::CC1x14y4 ::CC1x14y4(){ note_ctor("_ZN3ccc8CC1x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y4E, buf);
    ::ccc::CC1x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y4E);
    dp->::ccc::CC1x14y4::~CC1x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y4E(Test__ZN3ccc8CC1x14y4E, "_ZN3ccc8CC1x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y4C1Ev();
extern void _ZN3ccc8CC1x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y4E[] = {
  NSPAIR(_ZN3ccc8CC1x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y4E[];
extern void _ZN3ccc8CC1x14y43abcEv();
extern void _ZN3ccc8CC1x14y43pqrEv();
extern void _ZN3ccc8CC1x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y43pqrEv,_ZThn4_N3ccc8CC1x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y43pqrEv,_ZThn4_N3ccc8CC1x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y4E[];
Class_Descriptor cd__ZN3ccc8CC1x14y4E = {  "_ZN3ccc8CC1x14y4E", // class name
  bases__ZN3ccc8CC1x14y4E, 2,
  &(vtc__ZN3ccc8CC1x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y5  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC1x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y53abcEv
  ~CC1x14y5(); // tgen
  CC1x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y5E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y53pqrEv");}
void  ccc::CC1x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y53efgEv");}
void  ccc::CC1x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y53abcEv");}
ccc::CC1x14y5 ::~CC1x14y5(){ note_dtor("_ZN3ccc8CC1x14y5E", this);} // tgen
ccc::CC1x14y5 ::CC1x14y5(){ note_ctor("_ZN3ccc8CC1x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y5E, buf);
    ::ccc::CC1x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y5E);
    dp->::ccc::CC1x14y5::~CC1x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y5E(Test__ZN3ccc8CC1x14y5E, "_ZN3ccc8CC1x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y5C1Ev();
extern void _ZN3ccc8CC1x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y5E[] = {
  NSPAIR(_ZN3ccc8CC1x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y5E[];
extern void _ZN3ccc8CC1x14y53abcEv();
extern void _ZN3ccc8CC1x14y53pqrEv();
extern void _ZN3ccc8CC1x14y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y53pqrEv,_ZThn4_N3ccc8CC1x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y53pqrEv,_ZThn4_N3ccc8CC1x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y5E[];
Class_Descriptor cd__ZN3ccc8CC1x14y5E = {  "_ZN3ccc8CC1x14y5E", // class name
  bases__ZN3ccc8CC1x14y5E, 2,
  &(vtc__ZN3ccc8CC1x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y6  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x14y63efgEv
  ~CC1x14y6(); // tgen
  CC1x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y6E) C1{ BC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y63abcEv");}
void  ccc::CC1x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y63efgEv");}
ccc::CC1x14y6 ::~CC1x14y6(){ note_dtor("_ZN3ccc8CC1x14y6E", this);} // tgen
ccc::CC1x14y6 ::CC1x14y6(){ note_ctor("_ZN3ccc8CC1x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y6E, buf);
    ::ccc::CC1x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y6E);
    dp->::ccc::CC1x14y6::~CC1x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y6E(Test__ZN3ccc8CC1x14y6E, "_ZN3ccc8CC1x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y6C1Ev();
extern void _ZN3ccc8CC1x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y6E[] = {
  NSPAIR(_ZN3ccc8CC1x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y6E[];
extern void _ZN3ccc8CC1x14y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y6E[];
Class_Descriptor cd__ZN3ccc8CC1x14y6E = {  "_ZN3ccc8CC1x14y6E", // class name
  bases__ZN3ccc8CC1x14y6E, 2,
  &(vtc__ZN3ccc8CC1x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y7  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC1x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y73pqrEv
  ~CC1x14y7(); // tgen
  CC1x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y7E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y73abcEv");}
void  ccc::CC1x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y73pqrEv");}
ccc::CC1x14y7 ::~CC1x14y7(){ note_dtor("_ZN3ccc8CC1x14y7E", this);} // tgen
ccc::CC1x14y7 ::CC1x14y7(){ note_ctor("_ZN3ccc8CC1x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y7E, buf);
    ::ccc::CC1x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y7E);
    dp->::ccc::CC1x14y7::~CC1x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y7E(Test__ZN3ccc8CC1x14y7E, "_ZN3ccc8CC1x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y7C1Ev();
extern void _ZN3ccc8CC1x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y7E[] = {
  NSPAIR(_ZN3ccc8CC1x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y7E[];
extern void _ZN3ccc8CC1x14y73abcEv();
extern void _ZN3ccc8CC1x14y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y73pqrEv,_ZThn4_N3ccc8CC1x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y73pqrEv,_ZThn4_N3ccc8CC1x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y7E[];
Class_Descriptor cd__ZN3ccc8CC1x14y7E = {  "_ZN3ccc8CC1x14y7E", // class name
  bases__ZN3ccc8CC1x14y7E, 2,
  &(vtc__ZN3ccc8CC1x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y8  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x14y83abcEv
  ~CC1x14y8(); // tgen
  CC1x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y8E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y83efgEv");}
void  ccc::CC1x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x14y83abcEv");}
ccc::CC1x14y8 ::~CC1x14y8(){ note_dtor("_ZN3ccc8CC1x14y8E", this);} // tgen
ccc::CC1x14y8 ::CC1x14y8(){ note_ctor("_ZN3ccc8CC1x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y8E, buf);
    ::ccc::CC1x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y8E);
    dp->::ccc::CC1x14y8::~CC1x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y8E(Test__ZN3ccc8CC1x14y8E, "_ZN3ccc8CC1x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y8C1Ev();
extern void _ZN3ccc8CC1x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y8E[] = {
  NSPAIR(_ZN3ccc8CC1x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y8E[];
extern void _ZN3ccc8CC1x14y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y8E[];
Class_Descriptor cd__ZN3ccc8CC1x14y8E = {  "_ZN3ccc8CC1x14y8E", // class name
  bases__ZN3ccc8CC1x14y8E, 2,
  &(vtc__ZN3ccc8CC1x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y9  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC1x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x14y93pqrEv
  ~CC1x14y9(); // tgen
  CC1x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x14y9E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x14y93efgEv");}
void  ccc::CC1x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x14y93pqrEv");}
ccc::CC1x14y9 ::~CC1x14y9(){ note_dtor("_ZN3ccc8CC1x14y9E", this);} // tgen
ccc::CC1x14y9 ::CC1x14y9(){ note_ctor("_ZN3ccc8CC1x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC1x14y9E, buf);
    ::ccc::CC1x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC1x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x14y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC1x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x14y9E);
    dp->::ccc::CC1x14y9::~CC1x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x14y9E(Test__ZN3ccc8CC1x14y9E, "_ZN3ccc8CC1x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC1x14y9C1Ev();
extern void _ZN3ccc8CC1x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x14y9E[] = {
  NSPAIR(_ZN3ccc8CC1x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC1x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x14y93pqrEv();
extern void _ZN3ccc8CC1x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC1x14y93pqrEv,_ZThn4_N3ccc8CC1x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC1x14y93pqrEv,_ZThn4_N3ccc8CC1x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x14y9E[];
Class_Descriptor cd__ZN3ccc8CC1x14y9E = {  "_ZN3ccc8CC1x14y9E", // class name
  bases__ZN3ccc8CC1x14y9E, 2,
  &(vtc__ZN3ccc8CC1x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC1x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y10  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x14y103abcEv
  ~CC1x14y10(); // tgen
  CC1x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y10E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y103pqrEv");}
void  ccc::CC1x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x14y103abcEv");}
ccc::CC1x14y10 ::~CC1x14y10(){ note_dtor("_ZN3ccc9CC1x14y10E", this);} // tgen
ccc::CC1x14y10 ::CC1x14y10(){ note_ctor("_ZN3ccc9CC1x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y10E, buf);
    ::ccc::CC1x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y10E);
    dp->::ccc::CC1x14y10::~CC1x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y10E(Test__ZN3ccc9CC1x14y10E, "_ZN3ccc9CC1x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y10C1Ev();
extern void _ZN3ccc9CC1x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y10E[] = {
  NSPAIR(_ZN3ccc9CC1x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y10E[];
extern void _ZN3ccc9CC1x14y103abcEv();
extern void _ZN3ccc9CC1x14y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y103pqrEv,_ZThn4_N3ccc9CC1x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x14y103pqrEv,_ZThn4_N3ccc9CC1x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y10E[];
Class_Descriptor cd__ZN3ccc9CC1x14y10E = {  "_ZN3ccc9CC1x14y10E", // class name
  bases__ZN3ccc9CC1x14y10E, 2,
  &(vtc__ZN3ccc9CC1x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y11  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x14y113efgEv
  ~CC1x14y11(); // tgen
  CC1x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y11E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC1x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y113pqrEv");}
void  ccc::CC1x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x14y113efgEv");}
ccc::CC1x14y11 ::~CC1x14y11(){ note_dtor("_ZN3ccc9CC1x14y11E", this);} // tgen
ccc::CC1x14y11 ::CC1x14y11(){ note_ctor("_ZN3ccc9CC1x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y11E, buf);
    ::ccc::CC1x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y11E);
    dp->::ccc::CC1x14y11::~CC1x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y11E(Test__ZN3ccc9CC1x14y11E, "_ZN3ccc9CC1x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y11C1Ev();
extern void _ZN3ccc9CC1x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y11E[] = {
  NSPAIR(_ZN3ccc9CC1x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x14y113pqrEv();
extern void _ZN3ccc9CC1x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y113pqrEv,_ZThn4_N3ccc9CC1x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x14y113pqrEv,_ZThn4_N3ccc9CC1x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y11E[];
Class_Descriptor cd__ZN3ccc9CC1x14y11E = {  "_ZN3ccc9CC1x14y11E", // class name
  bases__ZN3ccc9CC1x14y11E, 2,
  &(vtc__ZN3ccc9CC1x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y12  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC1x14y123abcEv
  ~CC1x14y12(); // tgen
  CC1x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y12E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x14y123abcEv");}
ccc::CC1x14y12 ::~CC1x14y12(){ note_dtor("_ZN3ccc9CC1x14y12E", this);} // tgen
ccc::CC1x14y12 ::CC1x14y12(){ note_ctor("_ZN3ccc9CC1x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y12E, buf);
    ::ccc::CC1x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y12E);
    dp->::ccc::CC1x14y12::~CC1x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y12E(Test__ZN3ccc9CC1x14y12E, "_ZN3ccc9CC1x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y12C1Ev();
extern void _ZN3ccc9CC1x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y12E[] = {
  NSPAIR(_ZN3ccc9CC1x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y12E[];
extern void _ZN3ccc9CC1x14y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y12E[];
Class_Descriptor cd__ZN3ccc9CC1x14y12E = {  "_ZN3ccc9CC1x14y12E", // class name
  bases__ZN3ccc9CC1x14y12E, 2,
  &(vtc__ZN3ccc9CC1x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y13  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC1x14y133efgEv
  ~CC1x14y13(); // tgen
  CC1x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y13E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC1x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x14y133efgEv");}
ccc::CC1x14y13 ::~CC1x14y13(){ note_dtor("_ZN3ccc9CC1x14y13E", this);} // tgen
ccc::CC1x14y13 ::CC1x14y13(){ note_ctor("_ZN3ccc9CC1x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y13E, buf);
    ::ccc::CC1x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y13E);
    dp->::ccc::CC1x14y13::~CC1x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y13E(Test__ZN3ccc9CC1x14y13E, "_ZN3ccc9CC1x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y13C1Ev();
extern void _ZN3ccc9CC1x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y13E[] = {
  NSPAIR(_ZN3ccc9CC1x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y13E[];
Class_Descriptor cd__ZN3ccc9CC1x14y13E = {  "_ZN3ccc9CC1x14y13E", // class name
  bases__ZN3ccc9CC1x14y13E, 2,
  &(vtc__ZN3ccc9CC1x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y14  : ::ccc::AA1 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC1x14y143pqrEv
  ~CC1x14y14(); // tgen
  CC1x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y14E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC1x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x14y143pqrEv");}
ccc::CC1x14y14 ::~CC1x14y14(){ note_dtor("_ZN3ccc9CC1x14y14E", this);} // tgen
ccc::CC1x14y14 ::CC1x14y14(){ note_ctor("_ZN3ccc9CC1x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y14E, buf);
    ::ccc::CC1x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y14E);
    dp->::ccc::CC1x14y14::~CC1x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y14E(Test__ZN3ccc9CC1x14y14E, "_ZN3ccc9CC1x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y14C1Ev();
extern void _ZN3ccc9CC1x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y14E[] = {
  NSPAIR(_ZN3ccc9CC1x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x14y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC1x14y143pqrEv,_ZThn4_N3ccc9CC1x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC1x14y143pqrEv,_ZThn4_N3ccc9CC1x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y14E[];
Class_Descriptor cd__ZN3ccc9CC1x14y14E = {  "_ZN3ccc9CC1x14y14E", // class name
  bases__ZN3ccc9CC1x14y14E, 2,
  &(vtc__ZN3ccc9CC1x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x14y15  : ::ccc::AA1 , ::ccc::BB14 {
  ~CC1x14y15(); // tgen
  CC1x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x14y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC1x14y15 ::~CC1x14y15(){ note_dtor("_ZN3ccc9CC1x14y15E", this);} // tgen
ccc::CC1x14y15 ::CC1x14y15(){ note_ctor("_ZN3ccc9CC1x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC1x14y15E, buf);
    ::ccc::CC1x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC1x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x14y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC1x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x14y15E);
    dp->::ccc::CC1x14y15::~CC1x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x14y15E(Test__ZN3ccc9CC1x14y15E, "_ZN3ccc9CC1x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC1x14y15C1Ev();
extern void _ZN3ccc9CC1x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x14y15E[] = {
  NSPAIR(_ZN3ccc9CC1x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC1x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x14y15E[];
Class_Descriptor cd__ZN3ccc9CC1x14y15E = {  "_ZN3ccc9CC1x14y15E", // class name
  bases__ZN3ccc9CC1x14y15E, 2,
  &(vtc__ZN3ccc9CC1x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC1x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y0  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y03pqrEv
  ~CC1x15y0(); // tgen
  CC1x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y0E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y03abcEv");}
void  ccc::CC1x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y03efgEv");}
void  ccc::CC1x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y03pqrEv");}
ccc::CC1x15y0 ::~CC1x15y0(){ note_dtor("_ZN3ccc8CC1x15y0E", this);} // tgen
ccc::CC1x15y0 ::CC1x15y0(){ note_ctor("_ZN3ccc8CC1x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y0E, buf);
    ::ccc::CC1x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y0E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y0E);
    dp->::ccc::CC1x15y0::~CC1x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y0E(Test__ZN3ccc8CC1x15y0E, "_ZN3ccc8CC1x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y0C1Ev();
extern void _ZN3ccc8CC1x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y0E[] = {
  NSPAIR(_ZN3ccc8CC1x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y0E[];
extern void _ZN3ccc8CC1x15y03abcEv();
extern void _ZN3ccc8CC1x15y03pqrEv();
extern void _ZN3ccc8CC1x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y0E[];
Class_Descriptor cd__ZN3ccc8CC1x15y0E = {  "_ZN3ccc8CC1x15y0E", // class name
  bases__ZN3ccc8CC1x15y0E, 2,
  &(vtc__ZN3ccc8CC1x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y1  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x15y13efgEv
  ~CC1x15y1(); // tgen
  CC1x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y1E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y13abcEv");}
void  ccc::CC1x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y13pqrEv");}
void  ccc::CC1x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y13efgEv");}
ccc::CC1x15y1 ::~CC1x15y1(){ note_dtor("_ZN3ccc8CC1x15y1E", this);} // tgen
ccc::CC1x15y1 ::CC1x15y1(){ note_ctor("_ZN3ccc8CC1x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y1E, buf);
    ::ccc::CC1x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y1E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y1E);
    dp->::ccc::CC1x15y1::~CC1x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y1E(Test__ZN3ccc8CC1x15y1E, "_ZN3ccc8CC1x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y1C1Ev();
extern void _ZN3ccc8CC1x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y1E[] = {
  NSPAIR(_ZN3ccc8CC1x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y1E[];
extern void _ZN3ccc8CC1x15y13abcEv();
extern void _ZN3ccc8CC1x15y13pqrEv();
extern void _ZN3ccc8CC1x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y1E[];
Class_Descriptor cd__ZN3ccc8CC1x15y1E = {  "_ZN3ccc8CC1x15y1E", // class name
  bases__ZN3ccc8CC1x15y1E, 2,
  &(vtc__ZN3ccc8CC1x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y2  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y23pqrEv
  ~CC1x15y2(); // tgen
  CC1x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y2E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y23efgEv");}
void  ccc::CC1x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y23abcEv");}
void  ccc::CC1x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y23pqrEv");}
ccc::CC1x15y2 ::~CC1x15y2(){ note_dtor("_ZN3ccc8CC1x15y2E", this);} // tgen
ccc::CC1x15y2 ::CC1x15y2(){ note_ctor("_ZN3ccc8CC1x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y2E, buf);
    ::ccc::CC1x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y2E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y2E);
    dp->::ccc::CC1x15y2::~CC1x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y2E(Test__ZN3ccc8CC1x15y2E, "_ZN3ccc8CC1x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y2C1Ev();
extern void _ZN3ccc8CC1x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y2E[] = {
  NSPAIR(_ZN3ccc8CC1x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y2E[];
extern void _ZN3ccc8CC1x15y23abcEv();
extern void _ZN3ccc8CC1x15y23pqrEv();
extern void _ZN3ccc8CC1x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y2E[];
Class_Descriptor cd__ZN3ccc8CC1x15y2E = {  "_ZN3ccc8CC1x15y2E", // class name
  bases__ZN3ccc8CC1x15y2E, 2,
  &(vtc__ZN3ccc8CC1x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y3  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x15y33abcEv
  ~CC1x15y3(); // tgen
  CC1x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y3E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y33efgEv");}
void  ccc::CC1x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y33pqrEv");}
void  ccc::CC1x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y33abcEv");}
ccc::CC1x15y3 ::~CC1x15y3(){ note_dtor("_ZN3ccc8CC1x15y3E", this);} // tgen
ccc::CC1x15y3 ::CC1x15y3(){ note_ctor("_ZN3ccc8CC1x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y3E, buf);
    ::ccc::CC1x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y3E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y3E);
    dp->::ccc::CC1x15y3::~CC1x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y3E(Test__ZN3ccc8CC1x15y3E, "_ZN3ccc8CC1x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y3C1Ev();
extern void _ZN3ccc8CC1x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y3E[] = {
  NSPAIR(_ZN3ccc8CC1x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y3E[];
extern void _ZN3ccc8CC1x15y33abcEv();
extern void _ZN3ccc8CC1x15y33pqrEv();
extern void _ZN3ccc8CC1x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y3E[];
Class_Descriptor cd__ZN3ccc8CC1x15y3E = {  "_ZN3ccc8CC1x15y3E", // class name
  bases__ZN3ccc8CC1x15y3E, 2,
  &(vtc__ZN3ccc8CC1x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y4  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC1x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC1x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y43efgEv
  ~CC1x15y4(); // tgen
  CC1x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y4E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y43pqrEv");}
void  ccc::CC1x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y43abcEv");}
void  ccc::CC1x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y43efgEv");}
ccc::CC1x15y4 ::~CC1x15y4(){ note_dtor("_ZN3ccc8CC1x15y4E", this);} // tgen
ccc::CC1x15y4 ::CC1x15y4(){ note_ctor("_ZN3ccc8CC1x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y4E, buf);
    ::ccc::CC1x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y4E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y4E);
    dp->::ccc::CC1x15y4::~CC1x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y4E(Test__ZN3ccc8CC1x15y4E, "_ZN3ccc8CC1x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y4C1Ev();
extern void _ZN3ccc8CC1x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y4E[] = {
  NSPAIR(_ZN3ccc8CC1x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y4E[];
extern void _ZN3ccc8CC1x15y43abcEv();
extern void _ZN3ccc8CC1x15y43pqrEv();
extern void _ZN3ccc8CC1x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y4E[];
Class_Descriptor cd__ZN3ccc8CC1x15y4E = {  "_ZN3ccc8CC1x15y4E", // class name
  bases__ZN3ccc8CC1x15y4E, 2,
  &(vtc__ZN3ccc8CC1x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y5  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC1x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC1x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y53abcEv
  ~CC1x15y5(); // tgen
  CC1x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y5E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC1x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y53pqrEv");}
void  ccc::CC1x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y53efgEv");}
void  ccc::CC1x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y53abcEv");}
ccc::CC1x15y5 ::~CC1x15y5(){ note_dtor("_ZN3ccc8CC1x15y5E", this);} // tgen
ccc::CC1x15y5 ::CC1x15y5(){ note_ctor("_ZN3ccc8CC1x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y5E, buf);
    ::ccc::CC1x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y5E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y5E);
    dp->::ccc::CC1x15y5::~CC1x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y5E(Test__ZN3ccc8CC1x15y5E, "_ZN3ccc8CC1x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y5C1Ev();
extern void _ZN3ccc8CC1x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y5E[] = {
  NSPAIR(_ZN3ccc8CC1x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y5E[];
extern void _ZN3ccc8CC1x15y53abcEv();
extern void _ZN3ccc8CC1x15y53pqrEv();
extern void _ZN3ccc8CC1x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y5E[];
Class_Descriptor cd__ZN3ccc8CC1x15y5E = {  "_ZN3ccc8CC1x15y5E", // class name
  bases__ZN3ccc8CC1x15y5E, 2,
  &(vtc__ZN3ccc8CC1x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y6  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC1x15y63efgEv
  ~CC1x15y6(); // tgen
  CC1x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y6E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y63abcEv");}
void  ccc::CC1x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y63efgEv");}
ccc::CC1x15y6 ::~CC1x15y6(){ note_dtor("_ZN3ccc8CC1x15y6E", this);} // tgen
ccc::CC1x15y6 ::CC1x15y6(){ note_ctor("_ZN3ccc8CC1x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y6E, buf);
    ::ccc::CC1x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y6E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y6E);
    dp->::ccc::CC1x15y6::~CC1x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y6E(Test__ZN3ccc8CC1x15y6E, "_ZN3ccc8CC1x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y6C1Ev();
extern void _ZN3ccc8CC1x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y6E[] = {
  NSPAIR(_ZN3ccc8CC1x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y6E[];
extern void _ZN3ccc8CC1x15y63abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y6E[];
Class_Descriptor cd__ZN3ccc8CC1x15y6E = {  "_ZN3ccc8CC1x15y6E", // class name
  bases__ZN3ccc8CC1x15y6E, 2,
  &(vtc__ZN3ccc8CC1x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y7  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC1x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y73pqrEv
  ~CC1x15y7(); // tgen
  CC1x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y7E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y73abcEv");}
void  ccc::CC1x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y73pqrEv");}
ccc::CC1x15y7 ::~CC1x15y7(){ note_dtor("_ZN3ccc8CC1x15y7E", this);} // tgen
ccc::CC1x15y7 ::CC1x15y7(){ note_ctor("_ZN3ccc8CC1x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y7E, buf);
    ::ccc::CC1x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y7E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y7E);
    dp->::ccc::CC1x15y7::~CC1x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y7E(Test__ZN3ccc8CC1x15y7E, "_ZN3ccc8CC1x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y7C1Ev();
extern void _ZN3ccc8CC1x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y7E[] = {
  NSPAIR(_ZN3ccc8CC1x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y7E[];
extern void _ZN3ccc8CC1x15y73abcEv();
extern void _ZN3ccc8CC1x15y73pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y7E[];
Class_Descriptor cd__ZN3ccc8CC1x15y7E = {  "_ZN3ccc8CC1x15y7E", // class name
  bases__ZN3ccc8CC1x15y7E, 2,
  &(vtc__ZN3ccc8CC1x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y8  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC1x15y83abcEv
  ~CC1x15y8(); // tgen
  CC1x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y8E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y83efgEv");}
void  ccc::CC1x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC1x15y83abcEv");}
ccc::CC1x15y8 ::~CC1x15y8(){ note_dtor("_ZN3ccc8CC1x15y8E", this);} // tgen
ccc::CC1x15y8 ::CC1x15y8(){ note_ctor("_ZN3ccc8CC1x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y8E, buf);
    ::ccc::CC1x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y8E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y8E);
    dp->::ccc::CC1x15y8::~CC1x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y8E(Test__ZN3ccc8CC1x15y8E, "_ZN3ccc8CC1x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y8C1Ev();
extern void _ZN3ccc8CC1x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y8E[] = {
  NSPAIR(_ZN3ccc8CC1x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y8E[];
extern void _ZN3ccc8CC1x15y83abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc8CC1x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y8E[];
Class_Descriptor cd__ZN3ccc8CC1x15y8E = {  "_ZN3ccc8CC1x15y8E", // class name
  bases__ZN3ccc8CC1x15y8E, 2,
  &(vtc__ZN3ccc8CC1x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y9  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC1x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC1x15y93pqrEv
  ~CC1x15y9(); // tgen
  CC1x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC1x15y9E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC1x15y93efgEv");}
void  ccc::CC1x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC1x15y93pqrEv");}
ccc::CC1x15y9 ::~CC1x15y9(){ note_dtor("_ZN3ccc8CC1x15y9E", this);} // tgen
ccc::CC1x15y9 ::CC1x15y9(){ note_ctor("_ZN3ccc8CC1x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC1x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC1x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC1x15y9E, buf);
    ::ccc::CC1x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC1x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC1x15y9E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc8CC1x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC1x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC1x15y9E);
    dp->::ccc::CC1x15y9::~CC1x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC1x15y9E(Test__ZN3ccc8CC1x15y9E, "_ZN3ccc8CC1x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC1x15y9C1Ev();
extern void _ZN3ccc8CC1x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC1x15y9E[] = {
  NSPAIR(_ZN3ccc8CC1x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC1x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC1x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y9E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc8CC1x15y93pqrEv();
extern void _ZN3ccc8CC1x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC1x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC1x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC1x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC1x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC1x15y9E[];
Class_Descriptor cd__ZN3ccc8CC1x15y9E = {  "_ZN3ccc8CC1x15y9E", // class name
  bases__ZN3ccc8CC1x15y9E, 2,
  &(vtc__ZN3ccc8CC1x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC1x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC1x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y10  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC1x15y103abcEv
  ~CC1x15y10(); // tgen
  CC1x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y10E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y103pqrEv");}
void  ccc::CC1x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x15y103abcEv");}
ccc::CC1x15y10 ::~CC1x15y10(){ note_dtor("_ZN3ccc9CC1x15y10E", this);} // tgen
ccc::CC1x15y10 ::CC1x15y10(){ note_ctor("_ZN3ccc9CC1x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y10E, buf);
    ::ccc::CC1x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y10E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y10E);
    dp->::ccc::CC1x15y10::~CC1x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y10E(Test__ZN3ccc9CC1x15y10E, "_ZN3ccc9CC1x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y10C1Ev();
extern void _ZN3ccc9CC1x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y10E[] = {
  NSPAIR(_ZN3ccc9CC1x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y10E[];
extern void _ZN3ccc9CC1x15y103abcEv();
extern void _ZN3ccc9CC1x15y103pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y10E[];
Class_Descriptor cd__ZN3ccc9CC1x15y10E = {  "_ZN3ccc9CC1x15y10E", // class name
  bases__ZN3ccc9CC1x15y10E, 2,
  &(vtc__ZN3ccc9CC1x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y11  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC1x15y113efgEv
  ~CC1x15y11(); // tgen
  CC1x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y11E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC1x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y113pqrEv");}
void  ccc::CC1x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x15y113efgEv");}
ccc::CC1x15y11 ::~CC1x15y11(){ note_dtor("_ZN3ccc9CC1x15y11E", this);} // tgen
ccc::CC1x15y11 ::CC1x15y11(){ note_ctor("_ZN3ccc9CC1x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y11E, buf);
    ::ccc::CC1x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y11E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y11E);
    dp->::ccc::CC1x15y11::~CC1x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y11E(Test__ZN3ccc9CC1x15y11E, "_ZN3ccc9CC1x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y11C1Ev();
extern void _ZN3ccc9CC1x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y11E[] = {
  NSPAIR(_ZN3ccc9CC1x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y11E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x15y113pqrEv();
extern void _ZN3ccc9CC1x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y11E[];
Class_Descriptor cd__ZN3ccc9CC1x15y11E = {  "_ZN3ccc9CC1x15y11E", // class name
  bases__ZN3ccc9CC1x15y11E, 2,
  &(vtc__ZN3ccc9CC1x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y12  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC1x15y123abcEv
  ~CC1x15y12(); // tgen
  CC1x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y12E) C1{ BC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC1x15y123abcEv");}
ccc::CC1x15y12 ::~CC1x15y12(){ note_dtor("_ZN3ccc9CC1x15y12E", this);} // tgen
ccc::CC1x15y12 ::CC1x15y12(){ note_ctor("_ZN3ccc9CC1x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y12E, buf);
    ::ccc::CC1x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y12E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y12E);
    dp->::ccc::CC1x15y12::~CC1x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y12E(Test__ZN3ccc9CC1x15y12E, "_ZN3ccc9CC1x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y12C1Ev();
extern void _ZN3ccc9CC1x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y12E[] = {
  NSPAIR(_ZN3ccc9CC1x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y12E[];
extern void _ZN3ccc9CC1x15y123abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y12E[];
Class_Descriptor cd__ZN3ccc9CC1x15y12E = {  "_ZN3ccc9CC1x15y12E", // class name
  bases__ZN3ccc9CC1x15y12E, 2,
  &(vtc__ZN3ccc9CC1x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y13  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC1x15y133efgEv
  ~CC1x15y13(); // tgen
  CC1x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y13E) C1{ BC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC1x15y133efgEv");}
ccc::CC1x15y13 ::~CC1x15y13(){ note_dtor("_ZN3ccc9CC1x15y13E", this);} // tgen
ccc::CC1x15y13 ::CC1x15y13(){ note_ctor("_ZN3ccc9CC1x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y13E, buf);
    ::ccc::CC1x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y13E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y13E);
    dp->::ccc::CC1x15y13::~CC1x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y13E(Test__ZN3ccc9CC1x15y13E, "_ZN3ccc9CC1x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y13C1Ev();
extern void _ZN3ccc9CC1x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y13E[] = {
  NSPAIR(_ZN3ccc9CC1x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y13E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc9CC1x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y13E[];
Class_Descriptor cd__ZN3ccc9CC1x15y13E = {  "_ZN3ccc9CC1x15y13E", // class name
  bases__ZN3ccc9CC1x15y13E, 2,
  &(vtc__ZN3ccc9CC1x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y14  : ::ccc::AA1 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC1x15y143pqrEv
  ~CC1x15y14(); // tgen
  CC1x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y14E) C1{ BC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC1x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC1x15y143pqrEv");}
ccc::CC1x15y14 ::~CC1x15y14(){ note_dtor("_ZN3ccc9CC1x15y14E", this);} // tgen
ccc::CC1x15y14 ::CC1x15y14(){ note_ctor("_ZN3ccc9CC1x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y14E, buf);
    ::ccc::CC1x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y14E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y14E);
    dp->::ccc::CC1x15y14::~CC1x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y14E(Test__ZN3ccc9CC1x15y14E, "_ZN3ccc9CC1x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y14C1Ev();
extern void _ZN3ccc9CC1x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y14E[] = {
  NSPAIR(_ZN3ccc9CC1x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y14E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc9CC1x15y143pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC1x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y14E[];
Class_Descriptor cd__ZN3ccc9CC1x15y14E = {  "_ZN3ccc9CC1x15y14E", // class name
  bases__ZN3ccc9CC1x15y14E, 2,
  &(vtc__ZN3ccc9CC1x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC1x15y15  : ::ccc::AA1 , ::ccc::BB15 {
  ~CC1x15y15(); // tgen
  CC1x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC1x15y15E) C1{ BC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC1x15y15 ::~CC1x15y15(){ note_dtor("_ZN3ccc9CC1x15y15E", this);} // tgen
ccc::CC1x15y15 ::CC1x15y15(){ note_ctor("_ZN3ccc9CC1x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC1x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC1x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC1x15y15E, buf);
    ::ccc::CC1x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC1x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC1x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC1x15y15E)");
    check_base_class_offset(lv, (::ccc::AA1*), 0, "_ZN3ccc9CC1x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC1x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC1x15y15E);
    dp->::ccc::CC1x15y15::~CC1x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC1x15y15E(Test__ZN3ccc9CC1x15y15E, "_ZN3ccc9CC1x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC1x15y15C1Ev();
extern void _ZN3ccc9CC1x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC1x15y15E[] = {
  NSPAIR(_ZN3ccc9CC1x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC1x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA1E;
extern VTBL_ENTRY _ZTIN3ccc3AA1E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA1E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC1x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y15E[];
extern void _ZN3ccc3AA13abcEv();
extern void _ZN3ccc3AA13pqrEv();
extern void _ZN3ccc3AA13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC1x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC1x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC1x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC1x15y15E[];
Class_Descriptor cd__ZN3ccc9CC1x15y15E = {  "_ZN3ccc9CC1x15y15E", // class name
  bases__ZN3ccc9CC1x15y15E, 2,
  &(vtc__ZN3ccc9CC1x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC1x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC1x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y0  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y03pqrEv
  ~CC2x0y0(); // tgen
  CC2x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y0E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y03abcEv");}
void  ccc::CC2x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y03efgEv");}
void  ccc::CC2x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y03pqrEv");}
ccc::CC2x0y0 ::~CC2x0y0(){ note_dtor("_ZN3ccc7CC2x0y0E", this);} // tgen
ccc::CC2x0y0 ::CC2x0y0(){ note_ctor("_ZN3ccc7CC2x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y0E, buf);
    ::ccc::CC2x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y0E);
    dp->::ccc::CC2x0y0::~CC2x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y0E(Test__ZN3ccc7CC2x0y0E, "_ZN3ccc7CC2x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y0C1Ev();
extern void _ZN3ccc7CC2x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y0E[] = {
  NSPAIR(_ZN3ccc7CC2x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y0E[];
extern void _ZN3ccc7CC2x0y03efgEv();
extern void _ZN3ccc7CC2x0y03abcEv();
extern void _ZN3ccc7CC2x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03abcEv,_ZThn4_N3ccc7CC2x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03efgEv,_ZThn4_N3ccc7CC2x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y03pqrEv,_ZThn4_N3ccc7CC2x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y03abcEv,_ZThn4_N3ccc7CC2x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y03efgEv,_ZThn4_N3ccc7CC2x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y03pqrEv,_ZThn4_N3ccc7CC2x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y0E[];
Class_Descriptor cd__ZN3ccc7CC2x0y0E = {  "_ZN3ccc7CC2x0y0E", // class name
  bases__ZN3ccc7CC2x0y0E, 2,
  &(vtc__ZN3ccc7CC2x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y1  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x0y13efgEv
  ~CC2x0y1(); // tgen
  CC2x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y1E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y13abcEv");}
void  ccc::CC2x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y13pqrEv");}
void  ccc::CC2x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y13efgEv");}
ccc::CC2x0y1 ::~CC2x0y1(){ note_dtor("_ZN3ccc7CC2x0y1E", this);} // tgen
ccc::CC2x0y1 ::CC2x0y1(){ note_ctor("_ZN3ccc7CC2x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y1E, buf);
    ::ccc::CC2x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y1E);
    dp->::ccc::CC2x0y1::~CC2x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y1E(Test__ZN3ccc7CC2x0y1E, "_ZN3ccc7CC2x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y1C1Ev();
extern void _ZN3ccc7CC2x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y1E[] = {
  NSPAIR(_ZN3ccc7CC2x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y1E[];
extern void _ZN3ccc7CC2x0y13efgEv();
extern void _ZN3ccc7CC2x0y13abcEv();
extern void _ZN3ccc7CC2x0y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13abcEv,_ZThn4_N3ccc7CC2x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13efgEv,_ZThn4_N3ccc7CC2x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y13pqrEv,_ZThn4_N3ccc7CC2x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y13abcEv,_ZThn4_N3ccc7CC2x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y13efgEv,_ZThn4_N3ccc7CC2x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y13pqrEv,_ZThn4_N3ccc7CC2x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y1E[];
Class_Descriptor cd__ZN3ccc7CC2x0y1E = {  "_ZN3ccc7CC2x0y1E", // class name
  bases__ZN3ccc7CC2x0y1E, 2,
  &(vtc__ZN3ccc7CC2x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y2  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y23pqrEv
  ~CC2x0y2(); // tgen
  CC2x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y2E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y23efgEv");}
void  ccc::CC2x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y23abcEv");}
void  ccc::CC2x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y23pqrEv");}
ccc::CC2x0y2 ::~CC2x0y2(){ note_dtor("_ZN3ccc7CC2x0y2E", this);} // tgen
ccc::CC2x0y2 ::CC2x0y2(){ note_ctor("_ZN3ccc7CC2x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y2E, buf);
    ::ccc::CC2x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y2E);
    dp->::ccc::CC2x0y2::~CC2x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y2E(Test__ZN3ccc7CC2x0y2E, "_ZN3ccc7CC2x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y2C1Ev();
extern void _ZN3ccc7CC2x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y2E[] = {
  NSPAIR(_ZN3ccc7CC2x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y2E[];
extern void _ZN3ccc7CC2x0y23efgEv();
extern void _ZN3ccc7CC2x0y23abcEv();
extern void _ZN3ccc7CC2x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23abcEv,_ZThn4_N3ccc7CC2x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23efgEv,_ZThn4_N3ccc7CC2x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y23pqrEv,_ZThn4_N3ccc7CC2x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y23abcEv,_ZThn4_N3ccc7CC2x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y23efgEv,_ZThn4_N3ccc7CC2x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y23pqrEv,_ZThn4_N3ccc7CC2x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y2E[];
Class_Descriptor cd__ZN3ccc7CC2x0y2E = {  "_ZN3ccc7CC2x0y2E", // class name
  bases__ZN3ccc7CC2x0y2E, 2,
  &(vtc__ZN3ccc7CC2x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y3  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x0y33abcEv
  ~CC2x0y3(); // tgen
  CC2x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y3E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y33efgEv");}
void  ccc::CC2x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y33pqrEv");}
void  ccc::CC2x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y33abcEv");}
ccc::CC2x0y3 ::~CC2x0y3(){ note_dtor("_ZN3ccc7CC2x0y3E", this);} // tgen
ccc::CC2x0y3 ::CC2x0y3(){ note_ctor("_ZN3ccc7CC2x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y3E, buf);
    ::ccc::CC2x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y3E);
    dp->::ccc::CC2x0y3::~CC2x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y3E(Test__ZN3ccc7CC2x0y3E, "_ZN3ccc7CC2x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y3C1Ev();
extern void _ZN3ccc7CC2x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y3E[] = {
  NSPAIR(_ZN3ccc7CC2x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y3E[];
extern void _ZN3ccc7CC2x0y33efgEv();
extern void _ZN3ccc7CC2x0y33abcEv();
extern void _ZN3ccc7CC2x0y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33abcEv,_ZThn4_N3ccc7CC2x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33efgEv,_ZThn4_N3ccc7CC2x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y33pqrEv,_ZThn4_N3ccc7CC2x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y33abcEv,_ZThn4_N3ccc7CC2x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y33efgEv,_ZThn4_N3ccc7CC2x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y33pqrEv,_ZThn4_N3ccc7CC2x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y3E[];
Class_Descriptor cd__ZN3ccc7CC2x0y3E = {  "_ZN3ccc7CC2x0y3E", // class name
  bases__ZN3ccc7CC2x0y3E, 2,
  &(vtc__ZN3ccc7CC2x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y4  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC2x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y43efgEv
  ~CC2x0y4(); // tgen
  CC2x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y4E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y43pqrEv");}
void  ccc::CC2x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y43abcEv");}
void  ccc::CC2x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y43efgEv");}
ccc::CC2x0y4 ::~CC2x0y4(){ note_dtor("_ZN3ccc7CC2x0y4E", this);} // tgen
ccc::CC2x0y4 ::CC2x0y4(){ note_ctor("_ZN3ccc7CC2x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y4E, buf);
    ::ccc::CC2x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y4E);
    dp->::ccc::CC2x0y4::~CC2x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y4E(Test__ZN3ccc7CC2x0y4E, "_ZN3ccc7CC2x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y4C1Ev();
extern void _ZN3ccc7CC2x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y4E[] = {
  NSPAIR(_ZN3ccc7CC2x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y4E[];
extern void _ZN3ccc7CC2x0y43efgEv();
extern void _ZN3ccc7CC2x0y43abcEv();
extern void _ZN3ccc7CC2x0y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43abcEv,_ZThn4_N3ccc7CC2x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43efgEv,_ZThn4_N3ccc7CC2x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y43pqrEv,_ZThn4_N3ccc7CC2x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y43abcEv,_ZThn4_N3ccc7CC2x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y43efgEv,_ZThn4_N3ccc7CC2x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y43pqrEv,_ZThn4_N3ccc7CC2x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y4E[];
Class_Descriptor cd__ZN3ccc7CC2x0y4E = {  "_ZN3ccc7CC2x0y4E", // class name
  bases__ZN3ccc7CC2x0y4E, 2,
  &(vtc__ZN3ccc7CC2x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y5  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC2x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y53abcEv
  ~CC2x0y5(); // tgen
  CC2x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y5E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y53pqrEv");}
void  ccc::CC2x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y53efgEv");}
void  ccc::CC2x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y53abcEv");}
ccc::CC2x0y5 ::~CC2x0y5(){ note_dtor("_ZN3ccc7CC2x0y5E", this);} // tgen
ccc::CC2x0y5 ::CC2x0y5(){ note_ctor("_ZN3ccc7CC2x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y5E, buf);
    ::ccc::CC2x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y5E);
    dp->::ccc::CC2x0y5::~CC2x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y5E(Test__ZN3ccc7CC2x0y5E, "_ZN3ccc7CC2x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y5C1Ev();
extern void _ZN3ccc7CC2x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y5E[] = {
  NSPAIR(_ZN3ccc7CC2x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y5E[];
extern void _ZN3ccc7CC2x0y53efgEv();
extern void _ZN3ccc7CC2x0y53abcEv();
extern void _ZN3ccc7CC2x0y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53abcEv,_ZThn4_N3ccc7CC2x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53efgEv,_ZThn4_N3ccc7CC2x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y53pqrEv,_ZThn4_N3ccc7CC2x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y53abcEv,_ZThn4_N3ccc7CC2x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y53efgEv,_ZThn4_N3ccc7CC2x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y53pqrEv,_ZThn4_N3ccc7CC2x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y5E[];
Class_Descriptor cd__ZN3ccc7CC2x0y5E = {  "_ZN3ccc7CC2x0y5E", // class name
  bases__ZN3ccc7CC2x0y5E, 2,
  &(vtc__ZN3ccc7CC2x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y6  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x0y63efgEv
  ~CC2x0y6(); // tgen
  CC2x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y6E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y63abcEv");}
void  ccc::CC2x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y63efgEv");}
ccc::CC2x0y6 ::~CC2x0y6(){ note_dtor("_ZN3ccc7CC2x0y6E", this);} // tgen
ccc::CC2x0y6 ::CC2x0y6(){ note_ctor("_ZN3ccc7CC2x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y6E, buf);
    ::ccc::CC2x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y6E);
    dp->::ccc::CC2x0y6::~CC2x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y6E(Test__ZN3ccc7CC2x0y6E, "_ZN3ccc7CC2x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y6C1Ev();
extern void _ZN3ccc7CC2x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y6E[] = {
  NSPAIR(_ZN3ccc7CC2x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y6E[];
extern void _ZN3ccc7CC2x0y63efgEv();
extern void _ZN3ccc7CC2x0y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y63abcEv,_ZThn4_N3ccc7CC2x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y63efgEv,_ZThn4_N3ccc7CC2x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y63abcEv,_ZThn4_N3ccc7CC2x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y63efgEv,_ZThn4_N3ccc7CC2x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y6E[];
Class_Descriptor cd__ZN3ccc7CC2x0y6E = {  "_ZN3ccc7CC2x0y6E", // class name
  bases__ZN3ccc7CC2x0y6E, 2,
  &(vtc__ZN3ccc7CC2x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y7  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC2x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y73pqrEv
  ~CC2x0y7(); // tgen
  CC2x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y7E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y73abcEv");}
void  ccc::CC2x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y73pqrEv");}
ccc::CC2x0y7 ::~CC2x0y7(){ note_dtor("_ZN3ccc7CC2x0y7E", this);} // tgen
ccc::CC2x0y7 ::CC2x0y7(){ note_ctor("_ZN3ccc7CC2x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y7E, buf);
    ::ccc::CC2x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y7E);
    dp->::ccc::CC2x0y7::~CC2x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y7E(Test__ZN3ccc7CC2x0y7E, "_ZN3ccc7CC2x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y7C1Ev();
extern void _ZN3ccc7CC2x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y7E[] = {
  NSPAIR(_ZN3ccc7CC2x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x0y73abcEv();
extern void _ZN3ccc7CC2x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y73abcEv,_ZThn4_N3ccc7CC2x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y73pqrEv,_ZThn4_N3ccc7CC2x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y73abcEv,_ZThn4_N3ccc7CC2x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y73pqrEv,_ZThn4_N3ccc7CC2x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y7E[];
Class_Descriptor cd__ZN3ccc7CC2x0y7E = {  "_ZN3ccc7CC2x0y7E", // class name
  bases__ZN3ccc7CC2x0y7E, 2,
  &(vtc__ZN3ccc7CC2x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y8  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x0y83abcEv
  ~CC2x0y8(); // tgen
  CC2x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y8E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y83efgEv");}
void  ccc::CC2x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x0y83abcEv");}
ccc::CC2x0y8 ::~CC2x0y8(){ note_dtor("_ZN3ccc7CC2x0y8E", this);} // tgen
ccc::CC2x0y8 ::CC2x0y8(){ note_ctor("_ZN3ccc7CC2x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y8E, buf);
    ::ccc::CC2x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y8E);
    dp->::ccc::CC2x0y8::~CC2x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y8E(Test__ZN3ccc7CC2x0y8E, "_ZN3ccc7CC2x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y8C1Ev();
extern void _ZN3ccc7CC2x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y8E[] = {
  NSPAIR(_ZN3ccc7CC2x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y8E[];
extern void _ZN3ccc7CC2x0y83efgEv();
extern void _ZN3ccc7CC2x0y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y83abcEv,_ZThn4_N3ccc7CC2x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y83efgEv,_ZThn4_N3ccc7CC2x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y83abcEv,_ZThn4_N3ccc7CC2x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y83efgEv,_ZThn4_N3ccc7CC2x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y8E[];
Class_Descriptor cd__ZN3ccc7CC2x0y8E = {  "_ZN3ccc7CC2x0y8E", // class name
  bases__ZN3ccc7CC2x0y8E, 2,
  &(vtc__ZN3ccc7CC2x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y9  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC2x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x0y93pqrEv
  ~CC2x0y9(); // tgen
  CC2x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x0y9E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x0y93efgEv");}
void  ccc::CC2x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x0y93pqrEv");}
ccc::CC2x0y9 ::~CC2x0y9(){ note_dtor("_ZN3ccc7CC2x0y9E", this);} // tgen
ccc::CC2x0y9 ::CC2x0y9(){ note_ctor("_ZN3ccc7CC2x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x0y9E, buf);
    ::ccc::CC2x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x0y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC2x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x0y9E);
    dp->::ccc::CC2x0y9::~CC2x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x0y9E(Test__ZN3ccc7CC2x0y9E, "_ZN3ccc7CC2x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x0y9C1Ev();
extern void _ZN3ccc7CC2x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x0y9E[] = {
  NSPAIR(_ZN3ccc7CC2x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC2x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y9E[];
extern void _ZN3ccc7CC2x0y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y93efgEv,_ZThn4_N3ccc7CC2x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x0y93pqrEv,_ZThn4_N3ccc7CC2x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y93efgEv,_ZThn4_N3ccc7CC2x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x0y93pqrEv,_ZThn4_N3ccc7CC2x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x0y9E[];
Class_Descriptor cd__ZN3ccc7CC2x0y9E = {  "_ZN3ccc7CC2x0y9E", // class name
  bases__ZN3ccc7CC2x0y9E, 2,
  &(vtc__ZN3ccc7CC2x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y10  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x0y103abcEv
  ~CC2x0y10(); // tgen
  CC2x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y10E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y103pqrEv");}
void  ccc::CC2x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x0y103abcEv");}
ccc::CC2x0y10 ::~CC2x0y10(){ note_dtor("_ZN3ccc8CC2x0y10E", this);} // tgen
ccc::CC2x0y10 ::CC2x0y10(){ note_ctor("_ZN3ccc8CC2x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y10E, buf);
    ::ccc::CC2x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y10E);
    dp->::ccc::CC2x0y10::~CC2x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y10E(Test__ZN3ccc8CC2x0y10E, "_ZN3ccc8CC2x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y10C1Ev();
extern void _ZN3ccc8CC2x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y10E[] = {
  NSPAIR(_ZN3ccc8CC2x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x0y103abcEv();
extern void _ZN3ccc8CC2x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y103abcEv,_ZThn4_N3ccc8CC2x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y103pqrEv,_ZThn4_N3ccc8CC2x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y103abcEv,_ZThn4_N3ccc8CC2x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y103pqrEv,_ZThn4_N3ccc8CC2x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y10E[];
Class_Descriptor cd__ZN3ccc8CC2x0y10E = {  "_ZN3ccc8CC2x0y10E", // class name
  bases__ZN3ccc8CC2x0y10E, 2,
  &(vtc__ZN3ccc8CC2x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y11  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x0y113efgEv
  ~CC2x0y11(); // tgen
  CC2x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y11E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y113pqrEv");}
void  ccc::CC2x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x0y113efgEv");}
ccc::CC2x0y11 ::~CC2x0y11(){ note_dtor("_ZN3ccc8CC2x0y11E", this);} // tgen
ccc::CC2x0y11 ::CC2x0y11(){ note_ctor("_ZN3ccc8CC2x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y11E, buf);
    ::ccc::CC2x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y11E);
    dp->::ccc::CC2x0y11::~CC2x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y11E(Test__ZN3ccc8CC2x0y11E, "_ZN3ccc8CC2x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y11C1Ev();
extern void _ZN3ccc8CC2x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y11E[] = {
  NSPAIR(_ZN3ccc8CC2x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y11E[];
extern void _ZN3ccc8CC2x0y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y113efgEv,_ZThn4_N3ccc8CC2x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y113pqrEv,_ZThn4_N3ccc8CC2x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y113efgEv,_ZThn4_N3ccc8CC2x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y113pqrEv,_ZThn4_N3ccc8CC2x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y11E[];
Class_Descriptor cd__ZN3ccc8CC2x0y11E = {  "_ZN3ccc8CC2x0y11E", // class name
  bases__ZN3ccc8CC2x0y11E, 2,
  &(vtc__ZN3ccc8CC2x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y12  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC2x0y123abcEv
  ~CC2x0y12(); // tgen
  CC2x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x0y123abcEv");}
ccc::CC2x0y12 ::~CC2x0y12(){ note_dtor("_ZN3ccc8CC2x0y12E", this);} // tgen
ccc::CC2x0y12 ::CC2x0y12(){ note_ctor("_ZN3ccc8CC2x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y12E, buf);
    ::ccc::CC2x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y12E);
    dp->::ccc::CC2x0y12::~CC2x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y12E(Test__ZN3ccc8CC2x0y12E, "_ZN3ccc8CC2x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y12C1Ev();
extern void _ZN3ccc8CC2x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y12E[] = {
  NSPAIR(_ZN3ccc8CC2x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x0y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y123abcEv,_ZThn4_N3ccc8CC2x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y123abcEv,_ZThn4_N3ccc8CC2x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y12E[];
Class_Descriptor cd__ZN3ccc8CC2x0y12E = {  "_ZN3ccc8CC2x0y12E", // class name
  bases__ZN3ccc8CC2x0y12E, 2,
  &(vtc__ZN3ccc8CC2x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y13  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC2x0y133efgEv
  ~CC2x0y13(); // tgen
  CC2x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x0y133efgEv");}
ccc::CC2x0y13 ::~CC2x0y13(){ note_dtor("_ZN3ccc8CC2x0y13E", this);} // tgen
ccc::CC2x0y13 ::CC2x0y13(){ note_ctor("_ZN3ccc8CC2x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y13E, buf);
    ::ccc::CC2x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y13E);
    dp->::ccc::CC2x0y13::~CC2x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y13E(Test__ZN3ccc8CC2x0y13E, "_ZN3ccc8CC2x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y13C1Ev();
extern void _ZN3ccc8CC2x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y13E[] = {
  NSPAIR(_ZN3ccc8CC2x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y13E[];
extern void _ZN3ccc8CC2x0y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y133efgEv,_ZThn4_N3ccc8CC2x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y133efgEv,_ZThn4_N3ccc8CC2x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y13E[];
Class_Descriptor cd__ZN3ccc8CC2x0y13E = {  "_ZN3ccc8CC2x0y13E", // class name
  bases__ZN3ccc8CC2x0y13E, 2,
  &(vtc__ZN3ccc8CC2x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y14  : ::ccc::AA2 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC2x0y143pqrEv
  ~CC2x0y14(); // tgen
  CC2x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x0y143pqrEv");}
ccc::CC2x0y14 ::~CC2x0y14(){ note_dtor("_ZN3ccc8CC2x0y14E", this);} // tgen
ccc::CC2x0y14 ::CC2x0y14(){ note_ctor("_ZN3ccc8CC2x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y14E, buf);
    ::ccc::CC2x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y14E);
    dp->::ccc::CC2x0y14::~CC2x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y14E(Test__ZN3ccc8CC2x0y14E, "_ZN3ccc8CC2x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y14C1Ev();
extern void _ZN3ccc8CC2x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y14E[] = {
  NSPAIR(_ZN3ccc8CC2x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x0y143pqrEv,_ZThn4_N3ccc8CC2x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x0y143pqrEv,_ZThn4_N3ccc8CC2x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y14E[];
Class_Descriptor cd__ZN3ccc8CC2x0y14E = {  "_ZN3ccc8CC2x0y14E", // class name
  bases__ZN3ccc8CC2x0y14E, 2,
  &(vtc__ZN3ccc8CC2x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x0y15  : ::ccc::AA2 , ::ccc::BB0 {
  ~CC2x0y15(); // tgen
  CC2x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x0y15 ::~CC2x0y15(){ note_dtor("_ZN3ccc8CC2x0y15E", this);} // tgen
ccc::CC2x0y15 ::CC2x0y15(){ note_ctor("_ZN3ccc8CC2x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x0y15E, buf);
    ::ccc::CC2x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x0y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC2x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x0y15E);
    dp->::ccc::CC2x0y15::~CC2x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x0y15E(Test__ZN3ccc8CC2x0y15E, "_ZN3ccc8CC2x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x0y15C1Ev();
extern void _ZN3ccc8CC2x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x0y15E[] = {
  NSPAIR(_ZN3ccc8CC2x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC2x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x0y15E[];
Class_Descriptor cd__ZN3ccc8CC2x0y15E = {  "_ZN3ccc8CC2x0y15E", // class name
  bases__ZN3ccc8CC2x0y15E, 2,
  &(vtc__ZN3ccc8CC2x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y0  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y03pqrEv
  ~CC2x1y0(); // tgen
  CC2x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y0E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y03abcEv");}
void  ccc::CC2x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y03efgEv");}
void  ccc::CC2x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y03pqrEv");}
ccc::CC2x1y0 ::~CC2x1y0(){ note_dtor("_ZN3ccc7CC2x1y0E", this);} // tgen
ccc::CC2x1y0 ::CC2x1y0(){ note_ctor("_ZN3ccc7CC2x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y0E, buf);
    ::ccc::CC2x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y0E);
    dp->::ccc::CC2x1y0::~CC2x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y0E(Test__ZN3ccc7CC2x1y0E, "_ZN3ccc7CC2x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y0C1Ev();
extern void _ZN3ccc7CC2x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y0E[] = {
  NSPAIR(_ZN3ccc7CC2x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y0E[];
extern void _ZN3ccc7CC2x1y03efgEv();
extern void _ZN3ccc7CC2x1y03abcEv();
extern void _ZN3ccc7CC2x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03abcEv,_ZThn4_N3ccc7CC2x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03pqrEv,_ZThn4_N3ccc7CC2x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y03efgEv,_ZThn4_N3ccc7CC2x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y03abcEv,_ZThn4_N3ccc7CC2x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y03pqrEv,_ZThn4_N3ccc7CC2x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y03efgEv,_ZThn4_N3ccc7CC2x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y0E[];
Class_Descriptor cd__ZN3ccc7CC2x1y0E = {  "_ZN3ccc7CC2x1y0E", // class name
  bases__ZN3ccc7CC2x1y0E, 2,
  &(vtc__ZN3ccc7CC2x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y1  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x1y13efgEv
  ~CC2x1y1(); // tgen
  CC2x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y1E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y13abcEv");}
void  ccc::CC2x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y13pqrEv");}
void  ccc::CC2x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y13efgEv");}
ccc::CC2x1y1 ::~CC2x1y1(){ note_dtor("_ZN3ccc7CC2x1y1E", this);} // tgen
ccc::CC2x1y1 ::CC2x1y1(){ note_ctor("_ZN3ccc7CC2x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y1E, buf);
    ::ccc::CC2x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y1E);
    dp->::ccc::CC2x1y1::~CC2x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y1E(Test__ZN3ccc7CC2x1y1E, "_ZN3ccc7CC2x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y1C1Ev();
extern void _ZN3ccc7CC2x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y1E[] = {
  NSPAIR(_ZN3ccc7CC2x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y1E[];
extern void _ZN3ccc7CC2x1y13efgEv();
extern void _ZN3ccc7CC2x1y13abcEv();
extern void _ZN3ccc7CC2x1y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13abcEv,_ZThn4_N3ccc7CC2x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13pqrEv,_ZThn4_N3ccc7CC2x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y13efgEv,_ZThn4_N3ccc7CC2x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y13abcEv,_ZThn4_N3ccc7CC2x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y13pqrEv,_ZThn4_N3ccc7CC2x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y13efgEv,_ZThn4_N3ccc7CC2x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y1E[];
Class_Descriptor cd__ZN3ccc7CC2x1y1E = {  "_ZN3ccc7CC2x1y1E", // class name
  bases__ZN3ccc7CC2x1y1E, 2,
  &(vtc__ZN3ccc7CC2x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y2  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y23pqrEv
  ~CC2x1y2(); // tgen
  CC2x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y2E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y23efgEv");}
void  ccc::CC2x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y23abcEv");}
void  ccc::CC2x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y23pqrEv");}
ccc::CC2x1y2 ::~CC2x1y2(){ note_dtor("_ZN3ccc7CC2x1y2E", this);} // tgen
ccc::CC2x1y2 ::CC2x1y2(){ note_ctor("_ZN3ccc7CC2x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y2E, buf);
    ::ccc::CC2x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y2E);
    dp->::ccc::CC2x1y2::~CC2x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y2E(Test__ZN3ccc7CC2x1y2E, "_ZN3ccc7CC2x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y2C1Ev();
extern void _ZN3ccc7CC2x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y2E[] = {
  NSPAIR(_ZN3ccc7CC2x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y2E[];
extern void _ZN3ccc7CC2x1y23efgEv();
extern void _ZN3ccc7CC2x1y23abcEv();
extern void _ZN3ccc7CC2x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23abcEv,_ZThn4_N3ccc7CC2x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23pqrEv,_ZThn4_N3ccc7CC2x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y23efgEv,_ZThn4_N3ccc7CC2x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y23abcEv,_ZThn4_N3ccc7CC2x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y23pqrEv,_ZThn4_N3ccc7CC2x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y23efgEv,_ZThn4_N3ccc7CC2x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y2E[];
Class_Descriptor cd__ZN3ccc7CC2x1y2E = {  "_ZN3ccc7CC2x1y2E", // class name
  bases__ZN3ccc7CC2x1y2E, 2,
  &(vtc__ZN3ccc7CC2x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y3  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x1y33abcEv
  ~CC2x1y3(); // tgen
  CC2x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y3E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y33efgEv");}
void  ccc::CC2x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y33pqrEv");}
void  ccc::CC2x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y33abcEv");}
ccc::CC2x1y3 ::~CC2x1y3(){ note_dtor("_ZN3ccc7CC2x1y3E", this);} // tgen
ccc::CC2x1y3 ::CC2x1y3(){ note_ctor("_ZN3ccc7CC2x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y3E, buf);
    ::ccc::CC2x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y3E);
    dp->::ccc::CC2x1y3::~CC2x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y3E(Test__ZN3ccc7CC2x1y3E, "_ZN3ccc7CC2x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y3C1Ev();
extern void _ZN3ccc7CC2x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y3E[] = {
  NSPAIR(_ZN3ccc7CC2x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y3E[];
extern void _ZN3ccc7CC2x1y33efgEv();
extern void _ZN3ccc7CC2x1y33abcEv();
extern void _ZN3ccc7CC2x1y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33abcEv,_ZThn4_N3ccc7CC2x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33pqrEv,_ZThn4_N3ccc7CC2x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y33efgEv,_ZThn4_N3ccc7CC2x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y33abcEv,_ZThn4_N3ccc7CC2x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y33pqrEv,_ZThn4_N3ccc7CC2x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y33efgEv,_ZThn4_N3ccc7CC2x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y3E[];
Class_Descriptor cd__ZN3ccc7CC2x1y3E = {  "_ZN3ccc7CC2x1y3E", // class name
  bases__ZN3ccc7CC2x1y3E, 2,
  &(vtc__ZN3ccc7CC2x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y4  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC2x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y43efgEv
  ~CC2x1y4(); // tgen
  CC2x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y4E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y43pqrEv");}
void  ccc::CC2x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y43abcEv");}
void  ccc::CC2x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y43efgEv");}
ccc::CC2x1y4 ::~CC2x1y4(){ note_dtor("_ZN3ccc7CC2x1y4E", this);} // tgen
ccc::CC2x1y4 ::CC2x1y4(){ note_ctor("_ZN3ccc7CC2x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y4E, buf);
    ::ccc::CC2x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y4E);
    dp->::ccc::CC2x1y4::~CC2x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y4E(Test__ZN3ccc7CC2x1y4E, "_ZN3ccc7CC2x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y4C1Ev();
extern void _ZN3ccc7CC2x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y4E[] = {
  NSPAIR(_ZN3ccc7CC2x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y4E[];
extern void _ZN3ccc7CC2x1y43efgEv();
extern void _ZN3ccc7CC2x1y43abcEv();
extern void _ZN3ccc7CC2x1y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43abcEv,_ZThn4_N3ccc7CC2x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43pqrEv,_ZThn4_N3ccc7CC2x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y43efgEv,_ZThn4_N3ccc7CC2x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y43abcEv,_ZThn4_N3ccc7CC2x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y43pqrEv,_ZThn4_N3ccc7CC2x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y43efgEv,_ZThn4_N3ccc7CC2x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y4E[];
Class_Descriptor cd__ZN3ccc7CC2x1y4E = {  "_ZN3ccc7CC2x1y4E", // class name
  bases__ZN3ccc7CC2x1y4E, 2,
  &(vtc__ZN3ccc7CC2x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y5  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC2x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y53abcEv
  ~CC2x1y5(); // tgen
  CC2x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y5E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y53pqrEv");}
void  ccc::CC2x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y53efgEv");}
void  ccc::CC2x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y53abcEv");}
ccc::CC2x1y5 ::~CC2x1y5(){ note_dtor("_ZN3ccc7CC2x1y5E", this);} // tgen
ccc::CC2x1y5 ::CC2x1y5(){ note_ctor("_ZN3ccc7CC2x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y5E, buf);
    ::ccc::CC2x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y5E);
    dp->::ccc::CC2x1y5::~CC2x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y5E(Test__ZN3ccc7CC2x1y5E, "_ZN3ccc7CC2x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y5C1Ev();
extern void _ZN3ccc7CC2x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y5E[] = {
  NSPAIR(_ZN3ccc7CC2x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y5E[];
extern void _ZN3ccc7CC2x1y53efgEv();
extern void _ZN3ccc7CC2x1y53abcEv();
extern void _ZN3ccc7CC2x1y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53abcEv,_ZThn4_N3ccc7CC2x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53pqrEv,_ZThn4_N3ccc7CC2x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y53efgEv,_ZThn4_N3ccc7CC2x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y53abcEv,_ZThn4_N3ccc7CC2x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y53pqrEv,_ZThn4_N3ccc7CC2x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y53efgEv,_ZThn4_N3ccc7CC2x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y5E[];
Class_Descriptor cd__ZN3ccc7CC2x1y5E = {  "_ZN3ccc7CC2x1y5E", // class name
  bases__ZN3ccc7CC2x1y5E, 2,
  &(vtc__ZN3ccc7CC2x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y6  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x1y63efgEv
  ~CC2x1y6(); // tgen
  CC2x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y6E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y63abcEv");}
void  ccc::CC2x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y63efgEv");}
ccc::CC2x1y6 ::~CC2x1y6(){ note_dtor("_ZN3ccc7CC2x1y6E", this);} // tgen
ccc::CC2x1y6 ::CC2x1y6(){ note_ctor("_ZN3ccc7CC2x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y6E, buf);
    ::ccc::CC2x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y6E);
    dp->::ccc::CC2x1y6::~CC2x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y6E(Test__ZN3ccc7CC2x1y6E, "_ZN3ccc7CC2x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y6C1Ev();
extern void _ZN3ccc7CC2x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y6E[] = {
  NSPAIR(_ZN3ccc7CC2x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y6E[];
extern void _ZN3ccc7CC2x1y63efgEv();
extern void _ZN3ccc7CC2x1y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y63abcEv,_ZThn4_N3ccc7CC2x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y63efgEv,_ZThn4_N3ccc7CC2x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y63abcEv,_ZThn4_N3ccc7CC2x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y63efgEv,_ZThn4_N3ccc7CC2x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y6E[];
Class_Descriptor cd__ZN3ccc7CC2x1y6E = {  "_ZN3ccc7CC2x1y6E", // class name
  bases__ZN3ccc7CC2x1y6E, 2,
  &(vtc__ZN3ccc7CC2x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y7  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC2x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y73pqrEv
  ~CC2x1y7(); // tgen
  CC2x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y7E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y73abcEv");}
void  ccc::CC2x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y73pqrEv");}
ccc::CC2x1y7 ::~CC2x1y7(){ note_dtor("_ZN3ccc7CC2x1y7E", this);} // tgen
ccc::CC2x1y7 ::CC2x1y7(){ note_ctor("_ZN3ccc7CC2x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y7E, buf);
    ::ccc::CC2x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y7E);
    dp->::ccc::CC2x1y7::~CC2x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y7E(Test__ZN3ccc7CC2x1y7E, "_ZN3ccc7CC2x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y7C1Ev();
extern void _ZN3ccc7CC2x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y7E[] = {
  NSPAIR(_ZN3ccc7CC2x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x1y73abcEv();
extern void _ZN3ccc7CC2x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y73abcEv,_ZThn4_N3ccc7CC2x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y73pqrEv,_ZThn4_N3ccc7CC2x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y73abcEv,_ZThn4_N3ccc7CC2x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y73pqrEv,_ZThn4_N3ccc7CC2x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y7E[];
Class_Descriptor cd__ZN3ccc7CC2x1y7E = {  "_ZN3ccc7CC2x1y7E", // class name
  bases__ZN3ccc7CC2x1y7E, 2,
  &(vtc__ZN3ccc7CC2x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y8  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x1y83abcEv
  ~CC2x1y8(); // tgen
  CC2x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y8E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y83efgEv");}
void  ccc::CC2x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x1y83abcEv");}
ccc::CC2x1y8 ::~CC2x1y8(){ note_dtor("_ZN3ccc7CC2x1y8E", this);} // tgen
ccc::CC2x1y8 ::CC2x1y8(){ note_ctor("_ZN3ccc7CC2x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y8E, buf);
    ::ccc::CC2x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y8E);
    dp->::ccc::CC2x1y8::~CC2x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y8E(Test__ZN3ccc7CC2x1y8E, "_ZN3ccc7CC2x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y8C1Ev();
extern void _ZN3ccc7CC2x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y8E[] = {
  NSPAIR(_ZN3ccc7CC2x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y8E[];
extern void _ZN3ccc7CC2x1y83efgEv();
extern void _ZN3ccc7CC2x1y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y83abcEv,_ZThn4_N3ccc7CC2x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y83efgEv,_ZThn4_N3ccc7CC2x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y83abcEv,_ZThn4_N3ccc7CC2x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y83efgEv,_ZThn4_N3ccc7CC2x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y8E[];
Class_Descriptor cd__ZN3ccc7CC2x1y8E = {  "_ZN3ccc7CC2x1y8E", // class name
  bases__ZN3ccc7CC2x1y8E, 2,
  &(vtc__ZN3ccc7CC2x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y9  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC2x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x1y93pqrEv
  ~CC2x1y9(); // tgen
  CC2x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x1y9E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x1y93efgEv");}
void  ccc::CC2x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x1y93pqrEv");}
ccc::CC2x1y9 ::~CC2x1y9(){ note_dtor("_ZN3ccc7CC2x1y9E", this);} // tgen
ccc::CC2x1y9 ::CC2x1y9(){ note_ctor("_ZN3ccc7CC2x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x1y9E, buf);
    ::ccc::CC2x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x1y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC2x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x1y9E);
    dp->::ccc::CC2x1y9::~CC2x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x1y9E(Test__ZN3ccc7CC2x1y9E, "_ZN3ccc7CC2x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x1y9C1Ev();
extern void _ZN3ccc7CC2x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x1y9E[] = {
  NSPAIR(_ZN3ccc7CC2x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC2x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y9E[];
extern void _ZN3ccc7CC2x1y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y93pqrEv,_ZThn4_N3ccc7CC2x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x1y93efgEv,_ZThn4_N3ccc7CC2x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y93pqrEv,_ZThn4_N3ccc7CC2x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x1y93efgEv,_ZThn4_N3ccc7CC2x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x1y9E[];
Class_Descriptor cd__ZN3ccc7CC2x1y9E = {  "_ZN3ccc7CC2x1y9E", // class name
  bases__ZN3ccc7CC2x1y9E, 2,
  &(vtc__ZN3ccc7CC2x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y10  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x1y103abcEv
  ~CC2x1y10(); // tgen
  CC2x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y10E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y103pqrEv");}
void  ccc::CC2x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x1y103abcEv");}
ccc::CC2x1y10 ::~CC2x1y10(){ note_dtor("_ZN3ccc8CC2x1y10E", this);} // tgen
ccc::CC2x1y10 ::CC2x1y10(){ note_ctor("_ZN3ccc8CC2x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y10E, buf);
    ::ccc::CC2x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y10E);
    dp->::ccc::CC2x1y10::~CC2x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y10E(Test__ZN3ccc8CC2x1y10E, "_ZN3ccc8CC2x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y10C1Ev();
extern void _ZN3ccc8CC2x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y10E[] = {
  NSPAIR(_ZN3ccc8CC2x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x1y103abcEv();
extern void _ZN3ccc8CC2x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y103abcEv,_ZThn4_N3ccc8CC2x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y103pqrEv,_ZThn4_N3ccc8CC2x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y103abcEv,_ZThn4_N3ccc8CC2x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y103pqrEv,_ZThn4_N3ccc8CC2x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y10E[];
Class_Descriptor cd__ZN3ccc8CC2x1y10E = {  "_ZN3ccc8CC2x1y10E", // class name
  bases__ZN3ccc8CC2x1y10E, 2,
  &(vtc__ZN3ccc8CC2x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y11  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x1y113efgEv
  ~CC2x1y11(); // tgen
  CC2x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y11E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y113pqrEv");}
void  ccc::CC2x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x1y113efgEv");}
ccc::CC2x1y11 ::~CC2x1y11(){ note_dtor("_ZN3ccc8CC2x1y11E", this);} // tgen
ccc::CC2x1y11 ::CC2x1y11(){ note_ctor("_ZN3ccc8CC2x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y11E, buf);
    ::ccc::CC2x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y11E);
    dp->::ccc::CC2x1y11::~CC2x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y11E(Test__ZN3ccc8CC2x1y11E, "_ZN3ccc8CC2x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y11C1Ev();
extern void _ZN3ccc8CC2x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y11E[] = {
  NSPAIR(_ZN3ccc8CC2x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y11E[];
extern void _ZN3ccc8CC2x1y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y113pqrEv,_ZThn4_N3ccc8CC2x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y113efgEv,_ZThn4_N3ccc8CC2x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y113pqrEv,_ZThn4_N3ccc8CC2x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y113efgEv,_ZThn4_N3ccc8CC2x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y11E[];
Class_Descriptor cd__ZN3ccc8CC2x1y11E = {  "_ZN3ccc8CC2x1y11E", // class name
  bases__ZN3ccc8CC2x1y11E, 2,
  &(vtc__ZN3ccc8CC2x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y12  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC2x1y123abcEv
  ~CC2x1y12(); // tgen
  CC2x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x1y123abcEv");}
ccc::CC2x1y12 ::~CC2x1y12(){ note_dtor("_ZN3ccc8CC2x1y12E", this);} // tgen
ccc::CC2x1y12 ::CC2x1y12(){ note_ctor("_ZN3ccc8CC2x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y12E, buf);
    ::ccc::CC2x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y12E);
    dp->::ccc::CC2x1y12::~CC2x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y12E(Test__ZN3ccc8CC2x1y12E, "_ZN3ccc8CC2x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y12C1Ev();
extern void _ZN3ccc8CC2x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y12E[] = {
  NSPAIR(_ZN3ccc8CC2x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x1y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y123abcEv,_ZThn4_N3ccc8CC2x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y123abcEv,_ZThn4_N3ccc8CC2x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y12E[];
Class_Descriptor cd__ZN3ccc8CC2x1y12E = {  "_ZN3ccc8CC2x1y12E", // class name
  bases__ZN3ccc8CC2x1y12E, 2,
  &(vtc__ZN3ccc8CC2x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y13  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC2x1y133efgEv
  ~CC2x1y13(); // tgen
  CC2x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x1y133efgEv");}
ccc::CC2x1y13 ::~CC2x1y13(){ note_dtor("_ZN3ccc8CC2x1y13E", this);} // tgen
ccc::CC2x1y13 ::CC2x1y13(){ note_ctor("_ZN3ccc8CC2x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y13E, buf);
    ::ccc::CC2x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y13E);
    dp->::ccc::CC2x1y13::~CC2x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y13E(Test__ZN3ccc8CC2x1y13E, "_ZN3ccc8CC2x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y13C1Ev();
extern void _ZN3ccc8CC2x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y13E[] = {
  NSPAIR(_ZN3ccc8CC2x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y13E[];
extern void _ZN3ccc8CC2x1y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y133efgEv,_ZThn4_N3ccc8CC2x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y133efgEv,_ZThn4_N3ccc8CC2x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y13E[];
Class_Descriptor cd__ZN3ccc8CC2x1y13E = {  "_ZN3ccc8CC2x1y13E", // class name
  bases__ZN3ccc8CC2x1y13E, 2,
  &(vtc__ZN3ccc8CC2x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y14  : ::ccc::AA2 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC2x1y143pqrEv
  ~CC2x1y14(); // tgen
  CC2x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x1y143pqrEv");}
ccc::CC2x1y14 ::~CC2x1y14(){ note_dtor("_ZN3ccc8CC2x1y14E", this);} // tgen
ccc::CC2x1y14 ::CC2x1y14(){ note_ctor("_ZN3ccc8CC2x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y14E, buf);
    ::ccc::CC2x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y14E);
    dp->::ccc::CC2x1y14::~CC2x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y14E(Test__ZN3ccc8CC2x1y14E, "_ZN3ccc8CC2x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y14C1Ev();
extern void _ZN3ccc8CC2x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y14E[] = {
  NSPAIR(_ZN3ccc8CC2x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x1y143pqrEv,_ZThn4_N3ccc8CC2x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x1y143pqrEv,_ZThn4_N3ccc8CC2x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y14E[];
Class_Descriptor cd__ZN3ccc8CC2x1y14E = {  "_ZN3ccc8CC2x1y14E", // class name
  bases__ZN3ccc8CC2x1y14E, 2,
  &(vtc__ZN3ccc8CC2x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x1y15  : ::ccc::AA2 , ::ccc::BB1 {
  ~CC2x1y15(); // tgen
  CC2x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x1y15 ::~CC2x1y15(){ note_dtor("_ZN3ccc8CC2x1y15E", this);} // tgen
ccc::CC2x1y15 ::CC2x1y15(){ note_ctor("_ZN3ccc8CC2x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x1y15E, buf);
    ::ccc::CC2x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x1y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC2x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x1y15E);
    dp->::ccc::CC2x1y15::~CC2x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x1y15E(Test__ZN3ccc8CC2x1y15E, "_ZN3ccc8CC2x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x1y15C1Ev();
extern void _ZN3ccc8CC2x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x1y15E[] = {
  NSPAIR(_ZN3ccc8CC2x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC2x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x1y15E[];
Class_Descriptor cd__ZN3ccc8CC2x1y15E = {  "_ZN3ccc8CC2x1y15E", // class name
  bases__ZN3ccc8CC2x1y15E, 2,
  &(vtc__ZN3ccc8CC2x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y0  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y03pqrEv
  ~CC2x2y0(); // tgen
  CC2x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y0E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y03abcEv");}
void  ccc::CC2x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y03efgEv");}
void  ccc::CC2x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y03pqrEv");}
ccc::CC2x2y0 ::~CC2x2y0(){ note_dtor("_ZN3ccc7CC2x2y0E", this);} // tgen
ccc::CC2x2y0 ::CC2x2y0(){ note_ctor("_ZN3ccc7CC2x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y0E, buf);
    ::ccc::CC2x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y0E);
    dp->::ccc::CC2x2y0::~CC2x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y0E(Test__ZN3ccc7CC2x2y0E, "_ZN3ccc7CC2x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y0C1Ev();
extern void _ZN3ccc7CC2x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y0E[] = {
  NSPAIR(_ZN3ccc7CC2x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y0E[];
extern void _ZN3ccc7CC2x2y03efgEv();
extern void _ZN3ccc7CC2x2y03abcEv();
extern void _ZN3ccc7CC2x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03efgEv,_ZThn4_N3ccc7CC2x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03abcEv,_ZThn4_N3ccc7CC2x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y03pqrEv,_ZThn4_N3ccc7CC2x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y03efgEv,_ZThn4_N3ccc7CC2x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y03abcEv,_ZThn4_N3ccc7CC2x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y03pqrEv,_ZThn4_N3ccc7CC2x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y0E[];
Class_Descriptor cd__ZN3ccc7CC2x2y0E = {  "_ZN3ccc7CC2x2y0E", // class name
  bases__ZN3ccc7CC2x2y0E, 2,
  &(vtc__ZN3ccc7CC2x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y1  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x2y13efgEv
  ~CC2x2y1(); // tgen
  CC2x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y1E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y13abcEv");}
void  ccc::CC2x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y13pqrEv");}
void  ccc::CC2x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y13efgEv");}
ccc::CC2x2y1 ::~CC2x2y1(){ note_dtor("_ZN3ccc7CC2x2y1E", this);} // tgen
ccc::CC2x2y1 ::CC2x2y1(){ note_ctor("_ZN3ccc7CC2x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y1E, buf);
    ::ccc::CC2x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y1E);
    dp->::ccc::CC2x2y1::~CC2x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y1E(Test__ZN3ccc7CC2x2y1E, "_ZN3ccc7CC2x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y1C1Ev();
extern void _ZN3ccc7CC2x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y1E[] = {
  NSPAIR(_ZN3ccc7CC2x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y1E[];
extern void _ZN3ccc7CC2x2y13efgEv();
extern void _ZN3ccc7CC2x2y13abcEv();
extern void _ZN3ccc7CC2x2y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13efgEv,_ZThn4_N3ccc7CC2x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13abcEv,_ZThn4_N3ccc7CC2x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y13pqrEv,_ZThn4_N3ccc7CC2x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y13efgEv,_ZThn4_N3ccc7CC2x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y13abcEv,_ZThn4_N3ccc7CC2x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y13pqrEv,_ZThn4_N3ccc7CC2x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y1E[];
Class_Descriptor cd__ZN3ccc7CC2x2y1E = {  "_ZN3ccc7CC2x2y1E", // class name
  bases__ZN3ccc7CC2x2y1E, 2,
  &(vtc__ZN3ccc7CC2x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y2  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y23pqrEv
  ~CC2x2y2(); // tgen
  CC2x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y2E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y23efgEv");}
void  ccc::CC2x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y23abcEv");}
void  ccc::CC2x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y23pqrEv");}
ccc::CC2x2y2 ::~CC2x2y2(){ note_dtor("_ZN3ccc7CC2x2y2E", this);} // tgen
ccc::CC2x2y2 ::CC2x2y2(){ note_ctor("_ZN3ccc7CC2x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y2E, buf);
    ::ccc::CC2x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y2E);
    dp->::ccc::CC2x2y2::~CC2x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y2E(Test__ZN3ccc7CC2x2y2E, "_ZN3ccc7CC2x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y2C1Ev();
extern void _ZN3ccc7CC2x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y2E[] = {
  NSPAIR(_ZN3ccc7CC2x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y2E[];
extern void _ZN3ccc7CC2x2y23efgEv();
extern void _ZN3ccc7CC2x2y23abcEv();
extern void _ZN3ccc7CC2x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23efgEv,_ZThn4_N3ccc7CC2x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23abcEv,_ZThn4_N3ccc7CC2x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y23pqrEv,_ZThn4_N3ccc7CC2x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y23efgEv,_ZThn4_N3ccc7CC2x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y23abcEv,_ZThn4_N3ccc7CC2x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y23pqrEv,_ZThn4_N3ccc7CC2x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y2E[];
Class_Descriptor cd__ZN3ccc7CC2x2y2E = {  "_ZN3ccc7CC2x2y2E", // class name
  bases__ZN3ccc7CC2x2y2E, 2,
  &(vtc__ZN3ccc7CC2x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y3  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x2y33abcEv
  ~CC2x2y3(); // tgen
  CC2x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y3E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y33efgEv");}
void  ccc::CC2x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y33pqrEv");}
void  ccc::CC2x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y33abcEv");}
ccc::CC2x2y3 ::~CC2x2y3(){ note_dtor("_ZN3ccc7CC2x2y3E", this);} // tgen
ccc::CC2x2y3 ::CC2x2y3(){ note_ctor("_ZN3ccc7CC2x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y3E, buf);
    ::ccc::CC2x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y3E);
    dp->::ccc::CC2x2y3::~CC2x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y3E(Test__ZN3ccc7CC2x2y3E, "_ZN3ccc7CC2x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y3C1Ev();
extern void _ZN3ccc7CC2x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y3E[] = {
  NSPAIR(_ZN3ccc7CC2x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y3E[];
extern void _ZN3ccc7CC2x2y33efgEv();
extern void _ZN3ccc7CC2x2y33abcEv();
extern void _ZN3ccc7CC2x2y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33efgEv,_ZThn4_N3ccc7CC2x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33abcEv,_ZThn4_N3ccc7CC2x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y33pqrEv,_ZThn4_N3ccc7CC2x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y33efgEv,_ZThn4_N3ccc7CC2x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y33abcEv,_ZThn4_N3ccc7CC2x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y33pqrEv,_ZThn4_N3ccc7CC2x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y3E[];
Class_Descriptor cd__ZN3ccc7CC2x2y3E = {  "_ZN3ccc7CC2x2y3E", // class name
  bases__ZN3ccc7CC2x2y3E, 2,
  &(vtc__ZN3ccc7CC2x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y4  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC2x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y43efgEv
  ~CC2x2y4(); // tgen
  CC2x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y4E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y43pqrEv");}
void  ccc::CC2x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y43abcEv");}
void  ccc::CC2x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y43efgEv");}
ccc::CC2x2y4 ::~CC2x2y4(){ note_dtor("_ZN3ccc7CC2x2y4E", this);} // tgen
ccc::CC2x2y4 ::CC2x2y4(){ note_ctor("_ZN3ccc7CC2x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y4E, buf);
    ::ccc::CC2x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y4E);
    dp->::ccc::CC2x2y4::~CC2x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y4E(Test__ZN3ccc7CC2x2y4E, "_ZN3ccc7CC2x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y4C1Ev();
extern void _ZN3ccc7CC2x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y4E[] = {
  NSPAIR(_ZN3ccc7CC2x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y4E[];
extern void _ZN3ccc7CC2x2y43efgEv();
extern void _ZN3ccc7CC2x2y43abcEv();
extern void _ZN3ccc7CC2x2y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43efgEv,_ZThn4_N3ccc7CC2x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43abcEv,_ZThn4_N3ccc7CC2x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y43pqrEv,_ZThn4_N3ccc7CC2x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y43efgEv,_ZThn4_N3ccc7CC2x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y43abcEv,_ZThn4_N3ccc7CC2x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y43pqrEv,_ZThn4_N3ccc7CC2x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y4E[];
Class_Descriptor cd__ZN3ccc7CC2x2y4E = {  "_ZN3ccc7CC2x2y4E", // class name
  bases__ZN3ccc7CC2x2y4E, 2,
  &(vtc__ZN3ccc7CC2x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y5  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC2x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y53abcEv
  ~CC2x2y5(); // tgen
  CC2x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y5E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y53pqrEv");}
void  ccc::CC2x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y53efgEv");}
void  ccc::CC2x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y53abcEv");}
ccc::CC2x2y5 ::~CC2x2y5(){ note_dtor("_ZN3ccc7CC2x2y5E", this);} // tgen
ccc::CC2x2y5 ::CC2x2y5(){ note_ctor("_ZN3ccc7CC2x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y5E, buf);
    ::ccc::CC2x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y5E);
    dp->::ccc::CC2x2y5::~CC2x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y5E(Test__ZN3ccc7CC2x2y5E, "_ZN3ccc7CC2x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y5C1Ev();
extern void _ZN3ccc7CC2x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y5E[] = {
  NSPAIR(_ZN3ccc7CC2x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y5E[];
extern void _ZN3ccc7CC2x2y53efgEv();
extern void _ZN3ccc7CC2x2y53abcEv();
extern void _ZN3ccc7CC2x2y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53efgEv,_ZThn4_N3ccc7CC2x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53abcEv,_ZThn4_N3ccc7CC2x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y53pqrEv,_ZThn4_N3ccc7CC2x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y53efgEv,_ZThn4_N3ccc7CC2x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y53abcEv,_ZThn4_N3ccc7CC2x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y53pqrEv,_ZThn4_N3ccc7CC2x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y5E[];
Class_Descriptor cd__ZN3ccc7CC2x2y5E = {  "_ZN3ccc7CC2x2y5E", // class name
  bases__ZN3ccc7CC2x2y5E, 2,
  &(vtc__ZN3ccc7CC2x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y6  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x2y63efgEv
  ~CC2x2y6(); // tgen
  CC2x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y6E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y63abcEv");}
void  ccc::CC2x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y63efgEv");}
ccc::CC2x2y6 ::~CC2x2y6(){ note_dtor("_ZN3ccc7CC2x2y6E", this);} // tgen
ccc::CC2x2y6 ::CC2x2y6(){ note_ctor("_ZN3ccc7CC2x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y6E, buf);
    ::ccc::CC2x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y6E);
    dp->::ccc::CC2x2y6::~CC2x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y6E(Test__ZN3ccc7CC2x2y6E, "_ZN3ccc7CC2x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y6C1Ev();
extern void _ZN3ccc7CC2x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y6E[] = {
  NSPAIR(_ZN3ccc7CC2x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y6E[];
extern void _ZN3ccc7CC2x2y63efgEv();
extern void _ZN3ccc7CC2x2y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y63efgEv,_ZThn4_N3ccc7CC2x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y63abcEv,_ZThn4_N3ccc7CC2x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y63efgEv,_ZThn4_N3ccc7CC2x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y63abcEv,_ZThn4_N3ccc7CC2x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y6E[];
Class_Descriptor cd__ZN3ccc7CC2x2y6E = {  "_ZN3ccc7CC2x2y6E", // class name
  bases__ZN3ccc7CC2x2y6E, 2,
  &(vtc__ZN3ccc7CC2x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y7  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC2x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y73pqrEv
  ~CC2x2y7(); // tgen
  CC2x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y7E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y73abcEv");}
void  ccc::CC2x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y73pqrEv");}
ccc::CC2x2y7 ::~CC2x2y7(){ note_dtor("_ZN3ccc7CC2x2y7E", this);} // tgen
ccc::CC2x2y7 ::CC2x2y7(){ note_ctor("_ZN3ccc7CC2x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y7E, buf);
    ::ccc::CC2x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y7E);
    dp->::ccc::CC2x2y7::~CC2x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y7E(Test__ZN3ccc7CC2x2y7E, "_ZN3ccc7CC2x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y7C1Ev();
extern void _ZN3ccc7CC2x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y7E[] = {
  NSPAIR(_ZN3ccc7CC2x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x2y73abcEv();
extern void _ZN3ccc7CC2x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y73abcEv,_ZThn4_N3ccc7CC2x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y73pqrEv,_ZThn4_N3ccc7CC2x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y73abcEv,_ZThn4_N3ccc7CC2x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y73pqrEv,_ZThn4_N3ccc7CC2x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y7E[];
Class_Descriptor cd__ZN3ccc7CC2x2y7E = {  "_ZN3ccc7CC2x2y7E", // class name
  bases__ZN3ccc7CC2x2y7E, 2,
  &(vtc__ZN3ccc7CC2x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y8  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x2y83abcEv
  ~CC2x2y8(); // tgen
  CC2x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y8E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y83efgEv");}
void  ccc::CC2x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x2y83abcEv");}
ccc::CC2x2y8 ::~CC2x2y8(){ note_dtor("_ZN3ccc7CC2x2y8E", this);} // tgen
ccc::CC2x2y8 ::CC2x2y8(){ note_ctor("_ZN3ccc7CC2x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y8E, buf);
    ::ccc::CC2x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y8E);
    dp->::ccc::CC2x2y8::~CC2x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y8E(Test__ZN3ccc7CC2x2y8E, "_ZN3ccc7CC2x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y8C1Ev();
extern void _ZN3ccc7CC2x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y8E[] = {
  NSPAIR(_ZN3ccc7CC2x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y8E[];
extern void _ZN3ccc7CC2x2y83efgEv();
extern void _ZN3ccc7CC2x2y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y83efgEv,_ZThn4_N3ccc7CC2x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y83abcEv,_ZThn4_N3ccc7CC2x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y83efgEv,_ZThn4_N3ccc7CC2x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y83abcEv,_ZThn4_N3ccc7CC2x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y8E[];
Class_Descriptor cd__ZN3ccc7CC2x2y8E = {  "_ZN3ccc7CC2x2y8E", // class name
  bases__ZN3ccc7CC2x2y8E, 2,
  &(vtc__ZN3ccc7CC2x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y9  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC2x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x2y93pqrEv
  ~CC2x2y9(); // tgen
  CC2x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x2y9E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x2y93efgEv");}
void  ccc::CC2x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x2y93pqrEv");}
ccc::CC2x2y9 ::~CC2x2y9(){ note_dtor("_ZN3ccc7CC2x2y9E", this);} // tgen
ccc::CC2x2y9 ::CC2x2y9(){ note_ctor("_ZN3ccc7CC2x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x2y9E, buf);
    ::ccc::CC2x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x2y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC2x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x2y9E);
    dp->::ccc::CC2x2y9::~CC2x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x2y9E(Test__ZN3ccc7CC2x2y9E, "_ZN3ccc7CC2x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x2y9C1Ev();
extern void _ZN3ccc7CC2x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x2y9E[] = {
  NSPAIR(_ZN3ccc7CC2x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC2x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y9E[];
extern void _ZN3ccc7CC2x2y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y93efgEv,_ZThn4_N3ccc7CC2x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x2y93pqrEv,_ZThn4_N3ccc7CC2x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y93efgEv,_ZThn4_N3ccc7CC2x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x2y93pqrEv,_ZThn4_N3ccc7CC2x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x2y9E[];
Class_Descriptor cd__ZN3ccc7CC2x2y9E = {  "_ZN3ccc7CC2x2y9E", // class name
  bases__ZN3ccc7CC2x2y9E, 2,
  &(vtc__ZN3ccc7CC2x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y10  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x2y103abcEv
  ~CC2x2y10(); // tgen
  CC2x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y10E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y103pqrEv");}
void  ccc::CC2x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x2y103abcEv");}
ccc::CC2x2y10 ::~CC2x2y10(){ note_dtor("_ZN3ccc8CC2x2y10E", this);} // tgen
ccc::CC2x2y10 ::CC2x2y10(){ note_ctor("_ZN3ccc8CC2x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y10E, buf);
    ::ccc::CC2x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y10E);
    dp->::ccc::CC2x2y10::~CC2x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y10E(Test__ZN3ccc8CC2x2y10E, "_ZN3ccc8CC2x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y10C1Ev();
extern void _ZN3ccc8CC2x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y10E[] = {
  NSPAIR(_ZN3ccc8CC2x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x2y103abcEv();
extern void _ZN3ccc8CC2x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y103abcEv,_ZThn4_N3ccc8CC2x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y103pqrEv,_ZThn4_N3ccc8CC2x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y103abcEv,_ZThn4_N3ccc8CC2x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y103pqrEv,_ZThn4_N3ccc8CC2x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y10E[];
Class_Descriptor cd__ZN3ccc8CC2x2y10E = {  "_ZN3ccc8CC2x2y10E", // class name
  bases__ZN3ccc8CC2x2y10E, 2,
  &(vtc__ZN3ccc8CC2x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y11  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x2y113efgEv
  ~CC2x2y11(); // tgen
  CC2x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y11E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y113pqrEv");}
void  ccc::CC2x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x2y113efgEv");}
ccc::CC2x2y11 ::~CC2x2y11(){ note_dtor("_ZN3ccc8CC2x2y11E", this);} // tgen
ccc::CC2x2y11 ::CC2x2y11(){ note_ctor("_ZN3ccc8CC2x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y11E, buf);
    ::ccc::CC2x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y11E);
    dp->::ccc::CC2x2y11::~CC2x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y11E(Test__ZN3ccc8CC2x2y11E, "_ZN3ccc8CC2x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y11C1Ev();
extern void _ZN3ccc8CC2x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y11E[] = {
  NSPAIR(_ZN3ccc8CC2x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y11E[];
extern void _ZN3ccc8CC2x2y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y113efgEv,_ZThn4_N3ccc8CC2x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y113pqrEv,_ZThn4_N3ccc8CC2x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y113efgEv,_ZThn4_N3ccc8CC2x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y113pqrEv,_ZThn4_N3ccc8CC2x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y11E[];
Class_Descriptor cd__ZN3ccc8CC2x2y11E = {  "_ZN3ccc8CC2x2y11E", // class name
  bases__ZN3ccc8CC2x2y11E, 2,
  &(vtc__ZN3ccc8CC2x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y12  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC2x2y123abcEv
  ~CC2x2y12(); // tgen
  CC2x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x2y123abcEv");}
ccc::CC2x2y12 ::~CC2x2y12(){ note_dtor("_ZN3ccc8CC2x2y12E", this);} // tgen
ccc::CC2x2y12 ::CC2x2y12(){ note_ctor("_ZN3ccc8CC2x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y12E, buf);
    ::ccc::CC2x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y12E);
    dp->::ccc::CC2x2y12::~CC2x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y12E(Test__ZN3ccc8CC2x2y12E, "_ZN3ccc8CC2x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y12C1Ev();
extern void _ZN3ccc8CC2x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y12E[] = {
  NSPAIR(_ZN3ccc8CC2x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x2y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y123abcEv,_ZThn4_N3ccc8CC2x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y123abcEv,_ZThn4_N3ccc8CC2x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y12E[];
Class_Descriptor cd__ZN3ccc8CC2x2y12E = {  "_ZN3ccc8CC2x2y12E", // class name
  bases__ZN3ccc8CC2x2y12E, 2,
  &(vtc__ZN3ccc8CC2x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y13  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC2x2y133efgEv
  ~CC2x2y13(); // tgen
  CC2x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x2y133efgEv");}
ccc::CC2x2y13 ::~CC2x2y13(){ note_dtor("_ZN3ccc8CC2x2y13E", this);} // tgen
ccc::CC2x2y13 ::CC2x2y13(){ note_ctor("_ZN3ccc8CC2x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y13E, buf);
    ::ccc::CC2x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y13E);
    dp->::ccc::CC2x2y13::~CC2x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y13E(Test__ZN3ccc8CC2x2y13E, "_ZN3ccc8CC2x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y13C1Ev();
extern void _ZN3ccc8CC2x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y13E[] = {
  NSPAIR(_ZN3ccc8CC2x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y13E[];
extern void _ZN3ccc8CC2x2y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y133efgEv,_ZThn4_N3ccc8CC2x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y133efgEv,_ZThn4_N3ccc8CC2x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y13E[];
Class_Descriptor cd__ZN3ccc8CC2x2y13E = {  "_ZN3ccc8CC2x2y13E", // class name
  bases__ZN3ccc8CC2x2y13E, 2,
  &(vtc__ZN3ccc8CC2x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y14  : ::ccc::AA2 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC2x2y143pqrEv
  ~CC2x2y14(); // tgen
  CC2x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x2y143pqrEv");}
ccc::CC2x2y14 ::~CC2x2y14(){ note_dtor("_ZN3ccc8CC2x2y14E", this);} // tgen
ccc::CC2x2y14 ::CC2x2y14(){ note_ctor("_ZN3ccc8CC2x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y14E, buf);
    ::ccc::CC2x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y14E);
    dp->::ccc::CC2x2y14::~CC2x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y14E(Test__ZN3ccc8CC2x2y14E, "_ZN3ccc8CC2x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y14C1Ev();
extern void _ZN3ccc8CC2x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y14E[] = {
  NSPAIR(_ZN3ccc8CC2x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x2y143pqrEv,_ZThn4_N3ccc8CC2x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x2y143pqrEv,_ZThn4_N3ccc8CC2x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y14E[];
Class_Descriptor cd__ZN3ccc8CC2x2y14E = {  "_ZN3ccc8CC2x2y14E", // class name
  bases__ZN3ccc8CC2x2y14E, 2,
  &(vtc__ZN3ccc8CC2x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x2y15  : ::ccc::AA2 , ::ccc::BB2 {
  ~CC2x2y15(); // tgen
  CC2x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x2y15 ::~CC2x2y15(){ note_dtor("_ZN3ccc8CC2x2y15E", this);} // tgen
ccc::CC2x2y15 ::CC2x2y15(){ note_ctor("_ZN3ccc8CC2x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x2y15E, buf);
    ::ccc::CC2x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x2y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC2x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x2y15E);
    dp->::ccc::CC2x2y15::~CC2x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x2y15E(Test__ZN3ccc8CC2x2y15E, "_ZN3ccc8CC2x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x2y15C1Ev();
extern void _ZN3ccc8CC2x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x2y15E[] = {
  NSPAIR(_ZN3ccc8CC2x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC2x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x2y15E[];
Class_Descriptor cd__ZN3ccc8CC2x2y15E = {  "_ZN3ccc8CC2x2y15E", // class name
  bases__ZN3ccc8CC2x2y15E, 2,
  &(vtc__ZN3ccc8CC2x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y0  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y03pqrEv
  ~CC2x3y0(); // tgen
  CC2x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y0E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y03abcEv");}
void  ccc::CC2x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y03efgEv");}
void  ccc::CC2x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y03pqrEv");}
ccc::CC2x3y0 ::~CC2x3y0(){ note_dtor("_ZN3ccc7CC2x3y0E", this);} // tgen
ccc::CC2x3y0 ::CC2x3y0(){ note_ctor("_ZN3ccc7CC2x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y0E, buf);
    ::ccc::CC2x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y0E);
    dp->::ccc::CC2x3y0::~CC2x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y0E(Test__ZN3ccc7CC2x3y0E, "_ZN3ccc7CC2x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y0C1Ev();
extern void _ZN3ccc7CC2x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y0E[] = {
  NSPAIR(_ZN3ccc7CC2x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y0E[];
extern void _ZN3ccc7CC2x3y03efgEv();
extern void _ZN3ccc7CC2x3y03abcEv();
extern void _ZN3ccc7CC2x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03efgEv,_ZThn4_N3ccc7CC2x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03pqrEv,_ZThn4_N3ccc7CC2x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y03abcEv,_ZThn4_N3ccc7CC2x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y03efgEv,_ZThn4_N3ccc7CC2x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y03pqrEv,_ZThn4_N3ccc7CC2x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y03abcEv,_ZThn4_N3ccc7CC2x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y0E[];
Class_Descriptor cd__ZN3ccc7CC2x3y0E = {  "_ZN3ccc7CC2x3y0E", // class name
  bases__ZN3ccc7CC2x3y0E, 2,
  &(vtc__ZN3ccc7CC2x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y1  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x3y13efgEv
  ~CC2x3y1(); // tgen
  CC2x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y1E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y13abcEv");}
void  ccc::CC2x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y13pqrEv");}
void  ccc::CC2x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y13efgEv");}
ccc::CC2x3y1 ::~CC2x3y1(){ note_dtor("_ZN3ccc7CC2x3y1E", this);} // tgen
ccc::CC2x3y1 ::CC2x3y1(){ note_ctor("_ZN3ccc7CC2x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y1E, buf);
    ::ccc::CC2x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y1E);
    dp->::ccc::CC2x3y1::~CC2x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y1E(Test__ZN3ccc7CC2x3y1E, "_ZN3ccc7CC2x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y1C1Ev();
extern void _ZN3ccc7CC2x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y1E[] = {
  NSPAIR(_ZN3ccc7CC2x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y1E[];
extern void _ZN3ccc7CC2x3y13efgEv();
extern void _ZN3ccc7CC2x3y13abcEv();
extern void _ZN3ccc7CC2x3y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13efgEv,_ZThn4_N3ccc7CC2x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13pqrEv,_ZThn4_N3ccc7CC2x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y13abcEv,_ZThn4_N3ccc7CC2x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y13efgEv,_ZThn4_N3ccc7CC2x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y13pqrEv,_ZThn4_N3ccc7CC2x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y13abcEv,_ZThn4_N3ccc7CC2x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y1E[];
Class_Descriptor cd__ZN3ccc7CC2x3y1E = {  "_ZN3ccc7CC2x3y1E", // class name
  bases__ZN3ccc7CC2x3y1E, 2,
  &(vtc__ZN3ccc7CC2x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y2  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y23pqrEv
  ~CC2x3y2(); // tgen
  CC2x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y2E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y23efgEv");}
void  ccc::CC2x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y23abcEv");}
void  ccc::CC2x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y23pqrEv");}
ccc::CC2x3y2 ::~CC2x3y2(){ note_dtor("_ZN3ccc7CC2x3y2E", this);} // tgen
ccc::CC2x3y2 ::CC2x3y2(){ note_ctor("_ZN3ccc7CC2x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y2E, buf);
    ::ccc::CC2x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y2E);
    dp->::ccc::CC2x3y2::~CC2x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y2E(Test__ZN3ccc7CC2x3y2E, "_ZN3ccc7CC2x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y2C1Ev();
extern void _ZN3ccc7CC2x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y2E[] = {
  NSPAIR(_ZN3ccc7CC2x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y2E[];
extern void _ZN3ccc7CC2x3y23efgEv();
extern void _ZN3ccc7CC2x3y23abcEv();
extern void _ZN3ccc7CC2x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23efgEv,_ZThn4_N3ccc7CC2x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23pqrEv,_ZThn4_N3ccc7CC2x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y23abcEv,_ZThn4_N3ccc7CC2x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y23efgEv,_ZThn4_N3ccc7CC2x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y23pqrEv,_ZThn4_N3ccc7CC2x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y23abcEv,_ZThn4_N3ccc7CC2x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y2E[];
Class_Descriptor cd__ZN3ccc7CC2x3y2E = {  "_ZN3ccc7CC2x3y2E", // class name
  bases__ZN3ccc7CC2x3y2E, 2,
  &(vtc__ZN3ccc7CC2x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y3  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x3y33abcEv
  ~CC2x3y3(); // tgen
  CC2x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y3E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y33efgEv");}
void  ccc::CC2x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y33pqrEv");}
void  ccc::CC2x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y33abcEv");}
ccc::CC2x3y3 ::~CC2x3y3(){ note_dtor("_ZN3ccc7CC2x3y3E", this);} // tgen
ccc::CC2x3y3 ::CC2x3y3(){ note_ctor("_ZN3ccc7CC2x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y3E, buf);
    ::ccc::CC2x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y3E);
    dp->::ccc::CC2x3y3::~CC2x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y3E(Test__ZN3ccc7CC2x3y3E, "_ZN3ccc7CC2x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y3C1Ev();
extern void _ZN3ccc7CC2x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y3E[] = {
  NSPAIR(_ZN3ccc7CC2x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y3E[];
extern void _ZN3ccc7CC2x3y33efgEv();
extern void _ZN3ccc7CC2x3y33abcEv();
extern void _ZN3ccc7CC2x3y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33efgEv,_ZThn4_N3ccc7CC2x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33pqrEv,_ZThn4_N3ccc7CC2x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y33abcEv,_ZThn4_N3ccc7CC2x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y33efgEv,_ZThn4_N3ccc7CC2x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y33pqrEv,_ZThn4_N3ccc7CC2x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y33abcEv,_ZThn4_N3ccc7CC2x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y3E[];
Class_Descriptor cd__ZN3ccc7CC2x3y3E = {  "_ZN3ccc7CC2x3y3E", // class name
  bases__ZN3ccc7CC2x3y3E, 2,
  &(vtc__ZN3ccc7CC2x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y4  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC2x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y43efgEv
  ~CC2x3y4(); // tgen
  CC2x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y4E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y43pqrEv");}
void  ccc::CC2x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y43abcEv");}
void  ccc::CC2x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y43efgEv");}
ccc::CC2x3y4 ::~CC2x3y4(){ note_dtor("_ZN3ccc7CC2x3y4E", this);} // tgen
ccc::CC2x3y4 ::CC2x3y4(){ note_ctor("_ZN3ccc7CC2x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y4E, buf);
    ::ccc::CC2x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y4E);
    dp->::ccc::CC2x3y4::~CC2x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y4E(Test__ZN3ccc7CC2x3y4E, "_ZN3ccc7CC2x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y4C1Ev();
extern void _ZN3ccc7CC2x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y4E[] = {
  NSPAIR(_ZN3ccc7CC2x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y4E[];
extern void _ZN3ccc7CC2x3y43efgEv();
extern void _ZN3ccc7CC2x3y43abcEv();
extern void _ZN3ccc7CC2x3y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43efgEv,_ZThn4_N3ccc7CC2x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43pqrEv,_ZThn4_N3ccc7CC2x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y43abcEv,_ZThn4_N3ccc7CC2x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y43efgEv,_ZThn4_N3ccc7CC2x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y43pqrEv,_ZThn4_N3ccc7CC2x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y43abcEv,_ZThn4_N3ccc7CC2x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y4E[];
Class_Descriptor cd__ZN3ccc7CC2x3y4E = {  "_ZN3ccc7CC2x3y4E", // class name
  bases__ZN3ccc7CC2x3y4E, 2,
  &(vtc__ZN3ccc7CC2x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y5  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC2x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y53abcEv
  ~CC2x3y5(); // tgen
  CC2x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y5E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y53pqrEv");}
void  ccc::CC2x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y53efgEv");}
void  ccc::CC2x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y53abcEv");}
ccc::CC2x3y5 ::~CC2x3y5(){ note_dtor("_ZN3ccc7CC2x3y5E", this);} // tgen
ccc::CC2x3y5 ::CC2x3y5(){ note_ctor("_ZN3ccc7CC2x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y5E, buf);
    ::ccc::CC2x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y5E);
    dp->::ccc::CC2x3y5::~CC2x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y5E(Test__ZN3ccc7CC2x3y5E, "_ZN3ccc7CC2x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y5C1Ev();
extern void _ZN3ccc7CC2x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y5E[] = {
  NSPAIR(_ZN3ccc7CC2x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y5E[];
extern void _ZN3ccc7CC2x3y53efgEv();
extern void _ZN3ccc7CC2x3y53abcEv();
extern void _ZN3ccc7CC2x3y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53efgEv,_ZThn4_N3ccc7CC2x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53pqrEv,_ZThn4_N3ccc7CC2x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y53abcEv,_ZThn4_N3ccc7CC2x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y53efgEv,_ZThn4_N3ccc7CC2x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y53pqrEv,_ZThn4_N3ccc7CC2x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y53abcEv,_ZThn4_N3ccc7CC2x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y5E[];
Class_Descriptor cd__ZN3ccc7CC2x3y5E = {  "_ZN3ccc7CC2x3y5E", // class name
  bases__ZN3ccc7CC2x3y5E, 2,
  &(vtc__ZN3ccc7CC2x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y6  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x3y63efgEv
  ~CC2x3y6(); // tgen
  CC2x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y6E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y63abcEv");}
void  ccc::CC2x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y63efgEv");}
ccc::CC2x3y6 ::~CC2x3y6(){ note_dtor("_ZN3ccc7CC2x3y6E", this);} // tgen
ccc::CC2x3y6 ::CC2x3y6(){ note_ctor("_ZN3ccc7CC2x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y6E, buf);
    ::ccc::CC2x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y6E);
    dp->::ccc::CC2x3y6::~CC2x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y6E(Test__ZN3ccc7CC2x3y6E, "_ZN3ccc7CC2x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y6C1Ev();
extern void _ZN3ccc7CC2x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y6E[] = {
  NSPAIR(_ZN3ccc7CC2x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y6E[];
extern void _ZN3ccc7CC2x3y63efgEv();
extern void _ZN3ccc7CC2x3y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y63efgEv,_ZThn4_N3ccc7CC2x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y63abcEv,_ZThn4_N3ccc7CC2x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y63efgEv,_ZThn4_N3ccc7CC2x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y63abcEv,_ZThn4_N3ccc7CC2x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y6E[];
Class_Descriptor cd__ZN3ccc7CC2x3y6E = {  "_ZN3ccc7CC2x3y6E", // class name
  bases__ZN3ccc7CC2x3y6E, 2,
  &(vtc__ZN3ccc7CC2x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y7  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC2x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y73pqrEv
  ~CC2x3y7(); // tgen
  CC2x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y7E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y73abcEv");}
void  ccc::CC2x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y73pqrEv");}
ccc::CC2x3y7 ::~CC2x3y7(){ note_dtor("_ZN3ccc7CC2x3y7E", this);} // tgen
ccc::CC2x3y7 ::CC2x3y7(){ note_ctor("_ZN3ccc7CC2x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y7E, buf);
    ::ccc::CC2x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y7E);
    dp->::ccc::CC2x3y7::~CC2x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y7E(Test__ZN3ccc7CC2x3y7E, "_ZN3ccc7CC2x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y7C1Ev();
extern void _ZN3ccc7CC2x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y7E[] = {
  NSPAIR(_ZN3ccc7CC2x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x3y73abcEv();
extern void _ZN3ccc7CC2x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y73pqrEv,_ZThn4_N3ccc7CC2x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y73abcEv,_ZThn4_N3ccc7CC2x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y73pqrEv,_ZThn4_N3ccc7CC2x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y73abcEv,_ZThn4_N3ccc7CC2x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y7E[];
Class_Descriptor cd__ZN3ccc7CC2x3y7E = {  "_ZN3ccc7CC2x3y7E", // class name
  bases__ZN3ccc7CC2x3y7E, 2,
  &(vtc__ZN3ccc7CC2x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y8  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x3y83abcEv
  ~CC2x3y8(); // tgen
  CC2x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y8E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y83efgEv");}
void  ccc::CC2x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x3y83abcEv");}
ccc::CC2x3y8 ::~CC2x3y8(){ note_dtor("_ZN3ccc7CC2x3y8E", this);} // tgen
ccc::CC2x3y8 ::CC2x3y8(){ note_ctor("_ZN3ccc7CC2x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y8E, buf);
    ::ccc::CC2x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y8E);
    dp->::ccc::CC2x3y8::~CC2x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y8E(Test__ZN3ccc7CC2x3y8E, "_ZN3ccc7CC2x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y8C1Ev();
extern void _ZN3ccc7CC2x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y8E[] = {
  NSPAIR(_ZN3ccc7CC2x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y8E[];
extern void _ZN3ccc7CC2x3y83efgEv();
extern void _ZN3ccc7CC2x3y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y83efgEv,_ZThn4_N3ccc7CC2x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y83abcEv,_ZThn4_N3ccc7CC2x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y83efgEv,_ZThn4_N3ccc7CC2x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y83abcEv,_ZThn4_N3ccc7CC2x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y8E[];
Class_Descriptor cd__ZN3ccc7CC2x3y8E = {  "_ZN3ccc7CC2x3y8E", // class name
  bases__ZN3ccc7CC2x3y8E, 2,
  &(vtc__ZN3ccc7CC2x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y9  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC2x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x3y93pqrEv
  ~CC2x3y9(); // tgen
  CC2x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x3y9E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x3y93efgEv");}
void  ccc::CC2x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x3y93pqrEv");}
ccc::CC2x3y9 ::~CC2x3y9(){ note_dtor("_ZN3ccc7CC2x3y9E", this);} // tgen
ccc::CC2x3y9 ::CC2x3y9(){ note_ctor("_ZN3ccc7CC2x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x3y9E, buf);
    ::ccc::CC2x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x3y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC2x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x3y9E);
    dp->::ccc::CC2x3y9::~CC2x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x3y9E(Test__ZN3ccc7CC2x3y9E, "_ZN3ccc7CC2x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x3y9C1Ev();
extern void _ZN3ccc7CC2x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x3y9E[] = {
  NSPAIR(_ZN3ccc7CC2x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC2x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y9E[];
extern void _ZN3ccc7CC2x3y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y93efgEv,_ZThn4_N3ccc7CC2x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x3y93pqrEv,_ZThn4_N3ccc7CC2x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y93efgEv,_ZThn4_N3ccc7CC2x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x3y93pqrEv,_ZThn4_N3ccc7CC2x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x3y9E[];
Class_Descriptor cd__ZN3ccc7CC2x3y9E = {  "_ZN3ccc7CC2x3y9E", // class name
  bases__ZN3ccc7CC2x3y9E, 2,
  &(vtc__ZN3ccc7CC2x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y10  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x3y103abcEv
  ~CC2x3y10(); // tgen
  CC2x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y10E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y103pqrEv");}
void  ccc::CC2x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x3y103abcEv");}
ccc::CC2x3y10 ::~CC2x3y10(){ note_dtor("_ZN3ccc8CC2x3y10E", this);} // tgen
ccc::CC2x3y10 ::CC2x3y10(){ note_ctor("_ZN3ccc8CC2x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y10E, buf);
    ::ccc::CC2x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y10E);
    dp->::ccc::CC2x3y10::~CC2x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y10E(Test__ZN3ccc8CC2x3y10E, "_ZN3ccc8CC2x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y10C1Ev();
extern void _ZN3ccc8CC2x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y10E[] = {
  NSPAIR(_ZN3ccc8CC2x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x3y103abcEv();
extern void _ZN3ccc8CC2x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y103pqrEv,_ZThn4_N3ccc8CC2x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y103abcEv,_ZThn4_N3ccc8CC2x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y103pqrEv,_ZThn4_N3ccc8CC2x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y103abcEv,_ZThn4_N3ccc8CC2x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y10E[];
Class_Descriptor cd__ZN3ccc8CC2x3y10E = {  "_ZN3ccc8CC2x3y10E", // class name
  bases__ZN3ccc8CC2x3y10E, 2,
  &(vtc__ZN3ccc8CC2x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y11  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x3y113efgEv
  ~CC2x3y11(); // tgen
  CC2x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y11E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y113pqrEv");}
void  ccc::CC2x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x3y113efgEv");}
ccc::CC2x3y11 ::~CC2x3y11(){ note_dtor("_ZN3ccc8CC2x3y11E", this);} // tgen
ccc::CC2x3y11 ::CC2x3y11(){ note_ctor("_ZN3ccc8CC2x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y11E, buf);
    ::ccc::CC2x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y11E);
    dp->::ccc::CC2x3y11::~CC2x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y11E(Test__ZN3ccc8CC2x3y11E, "_ZN3ccc8CC2x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y11C1Ev();
extern void _ZN3ccc8CC2x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y11E[] = {
  NSPAIR(_ZN3ccc8CC2x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y11E[];
extern void _ZN3ccc8CC2x3y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y113efgEv,_ZThn4_N3ccc8CC2x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y113pqrEv,_ZThn4_N3ccc8CC2x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y113efgEv,_ZThn4_N3ccc8CC2x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y113pqrEv,_ZThn4_N3ccc8CC2x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y11E[];
Class_Descriptor cd__ZN3ccc8CC2x3y11E = {  "_ZN3ccc8CC2x3y11E", // class name
  bases__ZN3ccc8CC2x3y11E, 2,
  &(vtc__ZN3ccc8CC2x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y12  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC2x3y123abcEv
  ~CC2x3y12(); // tgen
  CC2x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x3y123abcEv");}
ccc::CC2x3y12 ::~CC2x3y12(){ note_dtor("_ZN3ccc8CC2x3y12E", this);} // tgen
ccc::CC2x3y12 ::CC2x3y12(){ note_ctor("_ZN3ccc8CC2x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y12E, buf);
    ::ccc::CC2x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y12E);
    dp->::ccc::CC2x3y12::~CC2x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y12E(Test__ZN3ccc8CC2x3y12E, "_ZN3ccc8CC2x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y12C1Ev();
extern void _ZN3ccc8CC2x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y12E[] = {
  NSPAIR(_ZN3ccc8CC2x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x3y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y123abcEv,_ZThn4_N3ccc8CC2x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y123abcEv,_ZThn4_N3ccc8CC2x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y12E[];
Class_Descriptor cd__ZN3ccc8CC2x3y12E = {  "_ZN3ccc8CC2x3y12E", // class name
  bases__ZN3ccc8CC2x3y12E, 2,
  &(vtc__ZN3ccc8CC2x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y13  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC2x3y133efgEv
  ~CC2x3y13(); // tgen
  CC2x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x3y133efgEv");}
ccc::CC2x3y13 ::~CC2x3y13(){ note_dtor("_ZN3ccc8CC2x3y13E", this);} // tgen
ccc::CC2x3y13 ::CC2x3y13(){ note_ctor("_ZN3ccc8CC2x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y13E, buf);
    ::ccc::CC2x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y13E);
    dp->::ccc::CC2x3y13::~CC2x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y13E(Test__ZN3ccc8CC2x3y13E, "_ZN3ccc8CC2x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y13C1Ev();
extern void _ZN3ccc8CC2x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y13E[] = {
  NSPAIR(_ZN3ccc8CC2x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y13E[];
extern void _ZN3ccc8CC2x3y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y133efgEv,_ZThn4_N3ccc8CC2x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y133efgEv,_ZThn4_N3ccc8CC2x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y13E[];
Class_Descriptor cd__ZN3ccc8CC2x3y13E = {  "_ZN3ccc8CC2x3y13E", // class name
  bases__ZN3ccc8CC2x3y13E, 2,
  &(vtc__ZN3ccc8CC2x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y14  : ::ccc::AA2 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC2x3y143pqrEv
  ~CC2x3y14(); // tgen
  CC2x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x3y143pqrEv");}
ccc::CC2x3y14 ::~CC2x3y14(){ note_dtor("_ZN3ccc8CC2x3y14E", this);} // tgen
ccc::CC2x3y14 ::CC2x3y14(){ note_ctor("_ZN3ccc8CC2x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y14E, buf);
    ::ccc::CC2x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y14E);
    dp->::ccc::CC2x3y14::~CC2x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y14E(Test__ZN3ccc8CC2x3y14E, "_ZN3ccc8CC2x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y14C1Ev();
extern void _ZN3ccc8CC2x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y14E[] = {
  NSPAIR(_ZN3ccc8CC2x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x3y143pqrEv,_ZThn4_N3ccc8CC2x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x3y143pqrEv,_ZThn4_N3ccc8CC2x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y14E[];
Class_Descriptor cd__ZN3ccc8CC2x3y14E = {  "_ZN3ccc8CC2x3y14E", // class name
  bases__ZN3ccc8CC2x3y14E, 2,
  &(vtc__ZN3ccc8CC2x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x3y15  : ::ccc::AA2 , ::ccc::BB3 {
  ~CC2x3y15(); // tgen
  CC2x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x3y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x3y15 ::~CC2x3y15(){ note_dtor("_ZN3ccc8CC2x3y15E", this);} // tgen
ccc::CC2x3y15 ::CC2x3y15(){ note_ctor("_ZN3ccc8CC2x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x3y15E, buf);
    ::ccc::CC2x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x3y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC2x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x3y15E);
    dp->::ccc::CC2x3y15::~CC2x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x3y15E(Test__ZN3ccc8CC2x3y15E, "_ZN3ccc8CC2x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x3y15C1Ev();
extern void _ZN3ccc8CC2x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x3y15E[] = {
  NSPAIR(_ZN3ccc8CC2x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC2x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x3y15E[];
Class_Descriptor cd__ZN3ccc8CC2x3y15E = {  "_ZN3ccc8CC2x3y15E", // class name
  bases__ZN3ccc8CC2x3y15E, 2,
  &(vtc__ZN3ccc8CC2x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y0  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y03pqrEv
  ~CC2x4y0(); // tgen
  CC2x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y0E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y03abcEv");}
void  ccc::CC2x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y03efgEv");}
void  ccc::CC2x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y03pqrEv");}
ccc::CC2x4y0 ::~CC2x4y0(){ note_dtor("_ZN3ccc7CC2x4y0E", this);} // tgen
ccc::CC2x4y0 ::CC2x4y0(){ note_ctor("_ZN3ccc7CC2x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y0E, buf);
    ::ccc::CC2x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y0E);
    dp->::ccc::CC2x4y0::~CC2x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y0E(Test__ZN3ccc7CC2x4y0E, "_ZN3ccc7CC2x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y0C1Ev();
extern void _ZN3ccc7CC2x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y0E[] = {
  NSPAIR(_ZN3ccc7CC2x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y0E[];
extern void _ZN3ccc7CC2x4y03efgEv();
extern void _ZN3ccc7CC2x4y03abcEv();
extern void _ZN3ccc7CC2x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03pqrEv,_ZThn4_N3ccc7CC2x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03abcEv,_ZThn4_N3ccc7CC2x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y03efgEv,_ZThn4_N3ccc7CC2x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y03pqrEv,_ZThn4_N3ccc7CC2x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y03abcEv,_ZThn4_N3ccc7CC2x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y03efgEv,_ZThn4_N3ccc7CC2x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y0E[];
Class_Descriptor cd__ZN3ccc7CC2x4y0E = {  "_ZN3ccc7CC2x4y0E", // class name
  bases__ZN3ccc7CC2x4y0E, 2,
  &(vtc__ZN3ccc7CC2x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y1  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x4y13efgEv
  ~CC2x4y1(); // tgen
  CC2x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y1E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y13abcEv");}
void  ccc::CC2x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y13pqrEv");}
void  ccc::CC2x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y13efgEv");}
ccc::CC2x4y1 ::~CC2x4y1(){ note_dtor("_ZN3ccc7CC2x4y1E", this);} // tgen
ccc::CC2x4y1 ::CC2x4y1(){ note_ctor("_ZN3ccc7CC2x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y1E, buf);
    ::ccc::CC2x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y1E);
    dp->::ccc::CC2x4y1::~CC2x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y1E(Test__ZN3ccc7CC2x4y1E, "_ZN3ccc7CC2x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y1C1Ev();
extern void _ZN3ccc7CC2x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y1E[] = {
  NSPAIR(_ZN3ccc7CC2x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y1E[];
extern void _ZN3ccc7CC2x4y13efgEv();
extern void _ZN3ccc7CC2x4y13abcEv();
extern void _ZN3ccc7CC2x4y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13pqrEv,_ZThn4_N3ccc7CC2x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13abcEv,_ZThn4_N3ccc7CC2x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y13efgEv,_ZThn4_N3ccc7CC2x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y13pqrEv,_ZThn4_N3ccc7CC2x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y13abcEv,_ZThn4_N3ccc7CC2x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y13efgEv,_ZThn4_N3ccc7CC2x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y1E[];
Class_Descriptor cd__ZN3ccc7CC2x4y1E = {  "_ZN3ccc7CC2x4y1E", // class name
  bases__ZN3ccc7CC2x4y1E, 2,
  &(vtc__ZN3ccc7CC2x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y2  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y23pqrEv
  ~CC2x4y2(); // tgen
  CC2x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y2E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y23efgEv");}
void  ccc::CC2x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y23abcEv");}
void  ccc::CC2x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y23pqrEv");}
ccc::CC2x4y2 ::~CC2x4y2(){ note_dtor("_ZN3ccc7CC2x4y2E", this);} // tgen
ccc::CC2x4y2 ::CC2x4y2(){ note_ctor("_ZN3ccc7CC2x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y2E, buf);
    ::ccc::CC2x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y2E);
    dp->::ccc::CC2x4y2::~CC2x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y2E(Test__ZN3ccc7CC2x4y2E, "_ZN3ccc7CC2x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y2C1Ev();
extern void _ZN3ccc7CC2x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y2E[] = {
  NSPAIR(_ZN3ccc7CC2x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y2E[];
extern void _ZN3ccc7CC2x4y23efgEv();
extern void _ZN3ccc7CC2x4y23abcEv();
extern void _ZN3ccc7CC2x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23pqrEv,_ZThn4_N3ccc7CC2x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23abcEv,_ZThn4_N3ccc7CC2x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y23efgEv,_ZThn4_N3ccc7CC2x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y23pqrEv,_ZThn4_N3ccc7CC2x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y23abcEv,_ZThn4_N3ccc7CC2x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y23efgEv,_ZThn4_N3ccc7CC2x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y2E[];
Class_Descriptor cd__ZN3ccc7CC2x4y2E = {  "_ZN3ccc7CC2x4y2E", // class name
  bases__ZN3ccc7CC2x4y2E, 2,
  &(vtc__ZN3ccc7CC2x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y3  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x4y33abcEv
  ~CC2x4y3(); // tgen
  CC2x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y3E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y33efgEv");}
void  ccc::CC2x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y33pqrEv");}
void  ccc::CC2x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y33abcEv");}
ccc::CC2x4y3 ::~CC2x4y3(){ note_dtor("_ZN3ccc7CC2x4y3E", this);} // tgen
ccc::CC2x4y3 ::CC2x4y3(){ note_ctor("_ZN3ccc7CC2x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y3E, buf);
    ::ccc::CC2x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y3E);
    dp->::ccc::CC2x4y3::~CC2x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y3E(Test__ZN3ccc7CC2x4y3E, "_ZN3ccc7CC2x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y3C1Ev();
extern void _ZN3ccc7CC2x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y3E[] = {
  NSPAIR(_ZN3ccc7CC2x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y3E[];
extern void _ZN3ccc7CC2x4y33efgEv();
extern void _ZN3ccc7CC2x4y33abcEv();
extern void _ZN3ccc7CC2x4y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33pqrEv,_ZThn4_N3ccc7CC2x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33abcEv,_ZThn4_N3ccc7CC2x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y33efgEv,_ZThn4_N3ccc7CC2x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y33pqrEv,_ZThn4_N3ccc7CC2x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y33abcEv,_ZThn4_N3ccc7CC2x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y33efgEv,_ZThn4_N3ccc7CC2x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y3E[];
Class_Descriptor cd__ZN3ccc7CC2x4y3E = {  "_ZN3ccc7CC2x4y3E", // class name
  bases__ZN3ccc7CC2x4y3E, 2,
  &(vtc__ZN3ccc7CC2x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y4  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC2x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y43efgEv
  ~CC2x4y4(); // tgen
  CC2x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y4E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y43pqrEv");}
void  ccc::CC2x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y43abcEv");}
void  ccc::CC2x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y43efgEv");}
ccc::CC2x4y4 ::~CC2x4y4(){ note_dtor("_ZN3ccc7CC2x4y4E", this);} // tgen
ccc::CC2x4y4 ::CC2x4y4(){ note_ctor("_ZN3ccc7CC2x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y4E, buf);
    ::ccc::CC2x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y4E);
    dp->::ccc::CC2x4y4::~CC2x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y4E(Test__ZN3ccc7CC2x4y4E, "_ZN3ccc7CC2x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y4C1Ev();
extern void _ZN3ccc7CC2x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y4E[] = {
  NSPAIR(_ZN3ccc7CC2x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y4E[];
extern void _ZN3ccc7CC2x4y43efgEv();
extern void _ZN3ccc7CC2x4y43abcEv();
extern void _ZN3ccc7CC2x4y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43pqrEv,_ZThn4_N3ccc7CC2x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43abcEv,_ZThn4_N3ccc7CC2x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y43efgEv,_ZThn4_N3ccc7CC2x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y43pqrEv,_ZThn4_N3ccc7CC2x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y43abcEv,_ZThn4_N3ccc7CC2x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y43efgEv,_ZThn4_N3ccc7CC2x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y4E[];
Class_Descriptor cd__ZN3ccc7CC2x4y4E = {  "_ZN3ccc7CC2x4y4E", // class name
  bases__ZN3ccc7CC2x4y4E, 2,
  &(vtc__ZN3ccc7CC2x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y5  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC2x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y53abcEv
  ~CC2x4y5(); // tgen
  CC2x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y5E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y53pqrEv");}
void  ccc::CC2x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y53efgEv");}
void  ccc::CC2x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y53abcEv");}
ccc::CC2x4y5 ::~CC2x4y5(){ note_dtor("_ZN3ccc7CC2x4y5E", this);} // tgen
ccc::CC2x4y5 ::CC2x4y5(){ note_ctor("_ZN3ccc7CC2x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y5E, buf);
    ::ccc::CC2x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y5E);
    dp->::ccc::CC2x4y5::~CC2x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y5E(Test__ZN3ccc7CC2x4y5E, "_ZN3ccc7CC2x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y5C1Ev();
extern void _ZN3ccc7CC2x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y5E[] = {
  NSPAIR(_ZN3ccc7CC2x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y5E[];
extern void _ZN3ccc7CC2x4y53efgEv();
extern void _ZN3ccc7CC2x4y53abcEv();
extern void _ZN3ccc7CC2x4y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53pqrEv,_ZThn4_N3ccc7CC2x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53abcEv,_ZThn4_N3ccc7CC2x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y53efgEv,_ZThn4_N3ccc7CC2x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y53pqrEv,_ZThn4_N3ccc7CC2x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y53abcEv,_ZThn4_N3ccc7CC2x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y53efgEv,_ZThn4_N3ccc7CC2x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y5E[];
Class_Descriptor cd__ZN3ccc7CC2x4y5E = {  "_ZN3ccc7CC2x4y5E", // class name
  bases__ZN3ccc7CC2x4y5E, 2,
  &(vtc__ZN3ccc7CC2x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y6  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x4y63efgEv
  ~CC2x4y6(); // tgen
  CC2x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y6E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y63abcEv");}
void  ccc::CC2x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y63efgEv");}
ccc::CC2x4y6 ::~CC2x4y6(){ note_dtor("_ZN3ccc7CC2x4y6E", this);} // tgen
ccc::CC2x4y6 ::CC2x4y6(){ note_ctor("_ZN3ccc7CC2x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y6E, buf);
    ::ccc::CC2x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y6E);
    dp->::ccc::CC2x4y6::~CC2x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y6E(Test__ZN3ccc7CC2x4y6E, "_ZN3ccc7CC2x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y6C1Ev();
extern void _ZN3ccc7CC2x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y6E[] = {
  NSPAIR(_ZN3ccc7CC2x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y6E[];
extern void _ZN3ccc7CC2x4y63efgEv();
extern void _ZN3ccc7CC2x4y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y63abcEv,_ZThn4_N3ccc7CC2x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y63efgEv,_ZThn4_N3ccc7CC2x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y63abcEv,_ZThn4_N3ccc7CC2x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y63efgEv,_ZThn4_N3ccc7CC2x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y6E[];
Class_Descriptor cd__ZN3ccc7CC2x4y6E = {  "_ZN3ccc7CC2x4y6E", // class name
  bases__ZN3ccc7CC2x4y6E, 2,
  &(vtc__ZN3ccc7CC2x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y7  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC2x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y73pqrEv
  ~CC2x4y7(); // tgen
  CC2x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y7E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y73abcEv");}
void  ccc::CC2x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y73pqrEv");}
ccc::CC2x4y7 ::~CC2x4y7(){ note_dtor("_ZN3ccc7CC2x4y7E", this);} // tgen
ccc::CC2x4y7 ::CC2x4y7(){ note_ctor("_ZN3ccc7CC2x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y7E, buf);
    ::ccc::CC2x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y7E);
    dp->::ccc::CC2x4y7::~CC2x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y7E(Test__ZN3ccc7CC2x4y7E, "_ZN3ccc7CC2x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y7C1Ev();
extern void _ZN3ccc7CC2x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y7E[] = {
  NSPAIR(_ZN3ccc7CC2x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x4y73abcEv();
extern void _ZN3ccc7CC2x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y73pqrEv,_ZThn4_N3ccc7CC2x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y73abcEv,_ZThn4_N3ccc7CC2x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y73pqrEv,_ZThn4_N3ccc7CC2x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y73abcEv,_ZThn4_N3ccc7CC2x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y7E[];
Class_Descriptor cd__ZN3ccc7CC2x4y7E = {  "_ZN3ccc7CC2x4y7E", // class name
  bases__ZN3ccc7CC2x4y7E, 2,
  &(vtc__ZN3ccc7CC2x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y8  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x4y83abcEv
  ~CC2x4y8(); // tgen
  CC2x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y8E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y83efgEv");}
void  ccc::CC2x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x4y83abcEv");}
ccc::CC2x4y8 ::~CC2x4y8(){ note_dtor("_ZN3ccc7CC2x4y8E", this);} // tgen
ccc::CC2x4y8 ::CC2x4y8(){ note_ctor("_ZN3ccc7CC2x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y8E, buf);
    ::ccc::CC2x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y8E);
    dp->::ccc::CC2x4y8::~CC2x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y8E(Test__ZN3ccc7CC2x4y8E, "_ZN3ccc7CC2x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y8C1Ev();
extern void _ZN3ccc7CC2x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y8E[] = {
  NSPAIR(_ZN3ccc7CC2x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y8E[];
extern void _ZN3ccc7CC2x4y83efgEv();
extern void _ZN3ccc7CC2x4y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y83abcEv,_ZThn4_N3ccc7CC2x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y83efgEv,_ZThn4_N3ccc7CC2x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y83abcEv,_ZThn4_N3ccc7CC2x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y83efgEv,_ZThn4_N3ccc7CC2x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y8E[];
Class_Descriptor cd__ZN3ccc7CC2x4y8E = {  "_ZN3ccc7CC2x4y8E", // class name
  bases__ZN3ccc7CC2x4y8E, 2,
  &(vtc__ZN3ccc7CC2x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y9  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC2x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x4y93pqrEv
  ~CC2x4y9(); // tgen
  CC2x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x4y9E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x4y93efgEv");}
void  ccc::CC2x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x4y93pqrEv");}
ccc::CC2x4y9 ::~CC2x4y9(){ note_dtor("_ZN3ccc7CC2x4y9E", this);} // tgen
ccc::CC2x4y9 ::CC2x4y9(){ note_ctor("_ZN3ccc7CC2x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x4y9E, buf);
    ::ccc::CC2x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x4y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC2x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x4y9E);
    dp->::ccc::CC2x4y9::~CC2x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x4y9E(Test__ZN3ccc7CC2x4y9E, "_ZN3ccc7CC2x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x4y9C1Ev();
extern void _ZN3ccc7CC2x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x4y9E[] = {
  NSPAIR(_ZN3ccc7CC2x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC2x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y9E[];
extern void _ZN3ccc7CC2x4y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y93pqrEv,_ZThn4_N3ccc7CC2x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x4y93efgEv,_ZThn4_N3ccc7CC2x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y93pqrEv,_ZThn4_N3ccc7CC2x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x4y93efgEv,_ZThn4_N3ccc7CC2x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x4y9E[];
Class_Descriptor cd__ZN3ccc7CC2x4y9E = {  "_ZN3ccc7CC2x4y9E", // class name
  bases__ZN3ccc7CC2x4y9E, 2,
  &(vtc__ZN3ccc7CC2x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y10  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x4y103abcEv
  ~CC2x4y10(); // tgen
  CC2x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y10E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y103pqrEv");}
void  ccc::CC2x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x4y103abcEv");}
ccc::CC2x4y10 ::~CC2x4y10(){ note_dtor("_ZN3ccc8CC2x4y10E", this);} // tgen
ccc::CC2x4y10 ::CC2x4y10(){ note_ctor("_ZN3ccc8CC2x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y10E, buf);
    ::ccc::CC2x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y10E);
    dp->::ccc::CC2x4y10::~CC2x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y10E(Test__ZN3ccc8CC2x4y10E, "_ZN3ccc8CC2x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y10C1Ev();
extern void _ZN3ccc8CC2x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y10E[] = {
  NSPAIR(_ZN3ccc8CC2x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x4y103abcEv();
extern void _ZN3ccc8CC2x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y103pqrEv,_ZThn4_N3ccc8CC2x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y103abcEv,_ZThn4_N3ccc8CC2x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y103pqrEv,_ZThn4_N3ccc8CC2x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y103abcEv,_ZThn4_N3ccc8CC2x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y10E[];
Class_Descriptor cd__ZN3ccc8CC2x4y10E = {  "_ZN3ccc8CC2x4y10E", // class name
  bases__ZN3ccc8CC2x4y10E, 2,
  &(vtc__ZN3ccc8CC2x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y11  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x4y113efgEv
  ~CC2x4y11(); // tgen
  CC2x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y11E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y113pqrEv");}
void  ccc::CC2x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x4y113efgEv");}
ccc::CC2x4y11 ::~CC2x4y11(){ note_dtor("_ZN3ccc8CC2x4y11E", this);} // tgen
ccc::CC2x4y11 ::CC2x4y11(){ note_ctor("_ZN3ccc8CC2x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y11E, buf);
    ::ccc::CC2x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y11E);
    dp->::ccc::CC2x4y11::~CC2x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y11E(Test__ZN3ccc8CC2x4y11E, "_ZN3ccc8CC2x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y11C1Ev();
extern void _ZN3ccc8CC2x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y11E[] = {
  NSPAIR(_ZN3ccc8CC2x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y11E[];
extern void _ZN3ccc8CC2x4y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y113pqrEv,_ZThn4_N3ccc8CC2x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y113efgEv,_ZThn4_N3ccc8CC2x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y113pqrEv,_ZThn4_N3ccc8CC2x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y113efgEv,_ZThn4_N3ccc8CC2x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y11E[];
Class_Descriptor cd__ZN3ccc8CC2x4y11E = {  "_ZN3ccc8CC2x4y11E", // class name
  bases__ZN3ccc8CC2x4y11E, 2,
  &(vtc__ZN3ccc8CC2x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y12  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC2x4y123abcEv
  ~CC2x4y12(); // tgen
  CC2x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x4y123abcEv");}
ccc::CC2x4y12 ::~CC2x4y12(){ note_dtor("_ZN3ccc8CC2x4y12E", this);} // tgen
ccc::CC2x4y12 ::CC2x4y12(){ note_ctor("_ZN3ccc8CC2x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y12E, buf);
    ::ccc::CC2x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y12E);
    dp->::ccc::CC2x4y12::~CC2x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y12E(Test__ZN3ccc8CC2x4y12E, "_ZN3ccc8CC2x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y12C1Ev();
extern void _ZN3ccc8CC2x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y12E[] = {
  NSPAIR(_ZN3ccc8CC2x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x4y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y123abcEv,_ZThn4_N3ccc8CC2x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y123abcEv,_ZThn4_N3ccc8CC2x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y12E[];
Class_Descriptor cd__ZN3ccc8CC2x4y12E = {  "_ZN3ccc8CC2x4y12E", // class name
  bases__ZN3ccc8CC2x4y12E, 2,
  &(vtc__ZN3ccc8CC2x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y13  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC2x4y133efgEv
  ~CC2x4y13(); // tgen
  CC2x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x4y133efgEv");}
ccc::CC2x4y13 ::~CC2x4y13(){ note_dtor("_ZN3ccc8CC2x4y13E", this);} // tgen
ccc::CC2x4y13 ::CC2x4y13(){ note_ctor("_ZN3ccc8CC2x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y13E, buf);
    ::ccc::CC2x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y13E);
    dp->::ccc::CC2x4y13::~CC2x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y13E(Test__ZN3ccc8CC2x4y13E, "_ZN3ccc8CC2x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y13C1Ev();
extern void _ZN3ccc8CC2x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y13E[] = {
  NSPAIR(_ZN3ccc8CC2x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y13E[];
extern void _ZN3ccc8CC2x4y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y133efgEv,_ZThn4_N3ccc8CC2x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y133efgEv,_ZThn4_N3ccc8CC2x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y13E[];
Class_Descriptor cd__ZN3ccc8CC2x4y13E = {  "_ZN3ccc8CC2x4y13E", // class name
  bases__ZN3ccc8CC2x4y13E, 2,
  &(vtc__ZN3ccc8CC2x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y14  : ::ccc::AA2 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC2x4y143pqrEv
  ~CC2x4y14(); // tgen
  CC2x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x4y143pqrEv");}
ccc::CC2x4y14 ::~CC2x4y14(){ note_dtor("_ZN3ccc8CC2x4y14E", this);} // tgen
ccc::CC2x4y14 ::CC2x4y14(){ note_ctor("_ZN3ccc8CC2x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y14E, buf);
    ::ccc::CC2x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y14E);
    dp->::ccc::CC2x4y14::~CC2x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y14E(Test__ZN3ccc8CC2x4y14E, "_ZN3ccc8CC2x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y14C1Ev();
extern void _ZN3ccc8CC2x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y14E[] = {
  NSPAIR(_ZN3ccc8CC2x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x4y143pqrEv,_ZThn4_N3ccc8CC2x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x4y143pqrEv,_ZThn4_N3ccc8CC2x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y14E[];
Class_Descriptor cd__ZN3ccc8CC2x4y14E = {  "_ZN3ccc8CC2x4y14E", // class name
  bases__ZN3ccc8CC2x4y14E, 2,
  &(vtc__ZN3ccc8CC2x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x4y15  : ::ccc::AA2 , ::ccc::BB4 {
  ~CC2x4y15(); // tgen
  CC2x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x4y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x4y15 ::~CC2x4y15(){ note_dtor("_ZN3ccc8CC2x4y15E", this);} // tgen
ccc::CC2x4y15 ::CC2x4y15(){ note_ctor("_ZN3ccc8CC2x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x4y15E, buf);
    ::ccc::CC2x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x4y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC2x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x4y15E);
    dp->::ccc::CC2x4y15::~CC2x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x4y15E(Test__ZN3ccc8CC2x4y15E, "_ZN3ccc8CC2x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x4y15C1Ev();
extern void _ZN3ccc8CC2x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x4y15E[] = {
  NSPAIR(_ZN3ccc8CC2x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC2x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x4y15E[];
Class_Descriptor cd__ZN3ccc8CC2x4y15E = {  "_ZN3ccc8CC2x4y15E", // class name
  bases__ZN3ccc8CC2x4y15E, 2,
  &(vtc__ZN3ccc8CC2x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y0  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y03pqrEv
  ~CC2x5y0(); // tgen
  CC2x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y0E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y03abcEv");}
void  ccc::CC2x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y03efgEv");}
void  ccc::CC2x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y03pqrEv");}
ccc::CC2x5y0 ::~CC2x5y0(){ note_dtor("_ZN3ccc7CC2x5y0E", this);} // tgen
ccc::CC2x5y0 ::CC2x5y0(){ note_ctor("_ZN3ccc7CC2x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y0E, buf);
    ::ccc::CC2x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y0E);
    dp->::ccc::CC2x5y0::~CC2x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y0E(Test__ZN3ccc7CC2x5y0E, "_ZN3ccc7CC2x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y0C1Ev();
extern void _ZN3ccc7CC2x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y0E[] = {
  NSPAIR(_ZN3ccc7CC2x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y0E[];
extern void _ZN3ccc7CC2x5y03efgEv();
extern void _ZN3ccc7CC2x5y03abcEv();
extern void _ZN3ccc7CC2x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03pqrEv,_ZThn4_N3ccc7CC2x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03efgEv,_ZThn4_N3ccc7CC2x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y03abcEv,_ZThn4_N3ccc7CC2x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y03pqrEv,_ZThn4_N3ccc7CC2x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y03efgEv,_ZThn4_N3ccc7CC2x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y03abcEv,_ZThn4_N3ccc7CC2x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y0E[];
Class_Descriptor cd__ZN3ccc7CC2x5y0E = {  "_ZN3ccc7CC2x5y0E", // class name
  bases__ZN3ccc7CC2x5y0E, 2,
  &(vtc__ZN3ccc7CC2x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y1  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x5y13efgEv
  ~CC2x5y1(); // tgen
  CC2x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y1E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y13abcEv");}
void  ccc::CC2x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y13pqrEv");}
void  ccc::CC2x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y13efgEv");}
ccc::CC2x5y1 ::~CC2x5y1(){ note_dtor("_ZN3ccc7CC2x5y1E", this);} // tgen
ccc::CC2x5y1 ::CC2x5y1(){ note_ctor("_ZN3ccc7CC2x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y1E, buf);
    ::ccc::CC2x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y1E);
    dp->::ccc::CC2x5y1::~CC2x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y1E(Test__ZN3ccc7CC2x5y1E, "_ZN3ccc7CC2x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y1C1Ev();
extern void _ZN3ccc7CC2x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y1E[] = {
  NSPAIR(_ZN3ccc7CC2x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y1E[];
extern void _ZN3ccc7CC2x5y13efgEv();
extern void _ZN3ccc7CC2x5y13abcEv();
extern void _ZN3ccc7CC2x5y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13pqrEv,_ZThn4_N3ccc7CC2x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13efgEv,_ZThn4_N3ccc7CC2x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y13abcEv,_ZThn4_N3ccc7CC2x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y13pqrEv,_ZThn4_N3ccc7CC2x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y13efgEv,_ZThn4_N3ccc7CC2x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y13abcEv,_ZThn4_N3ccc7CC2x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y1E[];
Class_Descriptor cd__ZN3ccc7CC2x5y1E = {  "_ZN3ccc7CC2x5y1E", // class name
  bases__ZN3ccc7CC2x5y1E, 2,
  &(vtc__ZN3ccc7CC2x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y2  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y23pqrEv
  ~CC2x5y2(); // tgen
  CC2x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y2E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y23efgEv");}
void  ccc::CC2x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y23abcEv");}
void  ccc::CC2x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y23pqrEv");}
ccc::CC2x5y2 ::~CC2x5y2(){ note_dtor("_ZN3ccc7CC2x5y2E", this);} // tgen
ccc::CC2x5y2 ::CC2x5y2(){ note_ctor("_ZN3ccc7CC2x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y2E, buf);
    ::ccc::CC2x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y2E);
    dp->::ccc::CC2x5y2::~CC2x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y2E(Test__ZN3ccc7CC2x5y2E, "_ZN3ccc7CC2x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y2C1Ev();
extern void _ZN3ccc7CC2x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y2E[] = {
  NSPAIR(_ZN3ccc7CC2x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y2E[];
extern void _ZN3ccc7CC2x5y23efgEv();
extern void _ZN3ccc7CC2x5y23abcEv();
extern void _ZN3ccc7CC2x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23pqrEv,_ZThn4_N3ccc7CC2x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23efgEv,_ZThn4_N3ccc7CC2x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y23abcEv,_ZThn4_N3ccc7CC2x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y23pqrEv,_ZThn4_N3ccc7CC2x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y23efgEv,_ZThn4_N3ccc7CC2x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y23abcEv,_ZThn4_N3ccc7CC2x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y2E[];
Class_Descriptor cd__ZN3ccc7CC2x5y2E = {  "_ZN3ccc7CC2x5y2E", // class name
  bases__ZN3ccc7CC2x5y2E, 2,
  &(vtc__ZN3ccc7CC2x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y3  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x5y33abcEv
  ~CC2x5y3(); // tgen
  CC2x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y3E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y33efgEv");}
void  ccc::CC2x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y33pqrEv");}
void  ccc::CC2x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y33abcEv");}
ccc::CC2x5y3 ::~CC2x5y3(){ note_dtor("_ZN3ccc7CC2x5y3E", this);} // tgen
ccc::CC2x5y3 ::CC2x5y3(){ note_ctor("_ZN3ccc7CC2x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y3E, buf);
    ::ccc::CC2x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y3E);
    dp->::ccc::CC2x5y3::~CC2x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y3E(Test__ZN3ccc7CC2x5y3E, "_ZN3ccc7CC2x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y3C1Ev();
extern void _ZN3ccc7CC2x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y3E[] = {
  NSPAIR(_ZN3ccc7CC2x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y3E[];
extern void _ZN3ccc7CC2x5y33efgEv();
extern void _ZN3ccc7CC2x5y33abcEv();
extern void _ZN3ccc7CC2x5y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33pqrEv,_ZThn4_N3ccc7CC2x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33efgEv,_ZThn4_N3ccc7CC2x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y33abcEv,_ZThn4_N3ccc7CC2x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y33pqrEv,_ZThn4_N3ccc7CC2x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y33efgEv,_ZThn4_N3ccc7CC2x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y33abcEv,_ZThn4_N3ccc7CC2x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y3E[];
Class_Descriptor cd__ZN3ccc7CC2x5y3E = {  "_ZN3ccc7CC2x5y3E", // class name
  bases__ZN3ccc7CC2x5y3E, 2,
  &(vtc__ZN3ccc7CC2x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y4  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC2x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y43efgEv
  ~CC2x5y4(); // tgen
  CC2x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y4E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y43pqrEv");}
void  ccc::CC2x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y43abcEv");}
void  ccc::CC2x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y43efgEv");}
ccc::CC2x5y4 ::~CC2x5y4(){ note_dtor("_ZN3ccc7CC2x5y4E", this);} // tgen
ccc::CC2x5y4 ::CC2x5y4(){ note_ctor("_ZN3ccc7CC2x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y4E, buf);
    ::ccc::CC2x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y4E);
    dp->::ccc::CC2x5y4::~CC2x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y4E(Test__ZN3ccc7CC2x5y4E, "_ZN3ccc7CC2x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y4C1Ev();
extern void _ZN3ccc7CC2x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y4E[] = {
  NSPAIR(_ZN3ccc7CC2x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y4E[];
extern void _ZN3ccc7CC2x5y43efgEv();
extern void _ZN3ccc7CC2x5y43abcEv();
extern void _ZN3ccc7CC2x5y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43pqrEv,_ZThn4_N3ccc7CC2x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43efgEv,_ZThn4_N3ccc7CC2x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y43abcEv,_ZThn4_N3ccc7CC2x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y43pqrEv,_ZThn4_N3ccc7CC2x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y43efgEv,_ZThn4_N3ccc7CC2x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y43abcEv,_ZThn4_N3ccc7CC2x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y4E[];
Class_Descriptor cd__ZN3ccc7CC2x5y4E = {  "_ZN3ccc7CC2x5y4E", // class name
  bases__ZN3ccc7CC2x5y4E, 2,
  &(vtc__ZN3ccc7CC2x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y5  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC2x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y53abcEv
  ~CC2x5y5(); // tgen
  CC2x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y5E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y53pqrEv");}
void  ccc::CC2x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y53efgEv");}
void  ccc::CC2x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y53abcEv");}
ccc::CC2x5y5 ::~CC2x5y5(){ note_dtor("_ZN3ccc7CC2x5y5E", this);} // tgen
ccc::CC2x5y5 ::CC2x5y5(){ note_ctor("_ZN3ccc7CC2x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y5E, buf);
    ::ccc::CC2x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y5E);
    dp->::ccc::CC2x5y5::~CC2x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y5E(Test__ZN3ccc7CC2x5y5E, "_ZN3ccc7CC2x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y5C1Ev();
extern void _ZN3ccc7CC2x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y5E[] = {
  NSPAIR(_ZN3ccc7CC2x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y5E[];
extern void _ZN3ccc7CC2x5y53efgEv();
extern void _ZN3ccc7CC2x5y53abcEv();
extern void _ZN3ccc7CC2x5y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53pqrEv,_ZThn4_N3ccc7CC2x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53efgEv,_ZThn4_N3ccc7CC2x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y53abcEv,_ZThn4_N3ccc7CC2x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y53pqrEv,_ZThn4_N3ccc7CC2x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y53efgEv,_ZThn4_N3ccc7CC2x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y53abcEv,_ZThn4_N3ccc7CC2x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y5E[];
Class_Descriptor cd__ZN3ccc7CC2x5y5E = {  "_ZN3ccc7CC2x5y5E", // class name
  bases__ZN3ccc7CC2x5y5E, 2,
  &(vtc__ZN3ccc7CC2x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y6  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x5y63efgEv
  ~CC2x5y6(); // tgen
  CC2x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y6E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y63abcEv");}
void  ccc::CC2x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y63efgEv");}
ccc::CC2x5y6 ::~CC2x5y6(){ note_dtor("_ZN3ccc7CC2x5y6E", this);} // tgen
ccc::CC2x5y6 ::CC2x5y6(){ note_ctor("_ZN3ccc7CC2x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y6E, buf);
    ::ccc::CC2x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y6E);
    dp->::ccc::CC2x5y6::~CC2x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y6E(Test__ZN3ccc7CC2x5y6E, "_ZN3ccc7CC2x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y6C1Ev();
extern void _ZN3ccc7CC2x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y6E[] = {
  NSPAIR(_ZN3ccc7CC2x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y6E[];
extern void _ZN3ccc7CC2x5y63efgEv();
extern void _ZN3ccc7CC2x5y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y63efgEv,_ZThn4_N3ccc7CC2x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y63abcEv,_ZThn4_N3ccc7CC2x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y63efgEv,_ZThn4_N3ccc7CC2x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y63abcEv,_ZThn4_N3ccc7CC2x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y6E[];
Class_Descriptor cd__ZN3ccc7CC2x5y6E = {  "_ZN3ccc7CC2x5y6E", // class name
  bases__ZN3ccc7CC2x5y6E, 2,
  &(vtc__ZN3ccc7CC2x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y7  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC2x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y73pqrEv
  ~CC2x5y7(); // tgen
  CC2x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y7E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y73abcEv");}
void  ccc::CC2x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y73pqrEv");}
ccc::CC2x5y7 ::~CC2x5y7(){ note_dtor("_ZN3ccc7CC2x5y7E", this);} // tgen
ccc::CC2x5y7 ::CC2x5y7(){ note_ctor("_ZN3ccc7CC2x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y7E, buf);
    ::ccc::CC2x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y7E);
    dp->::ccc::CC2x5y7::~CC2x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y7E(Test__ZN3ccc7CC2x5y7E, "_ZN3ccc7CC2x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y7C1Ev();
extern void _ZN3ccc7CC2x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y7E[] = {
  NSPAIR(_ZN3ccc7CC2x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x5y73abcEv();
extern void _ZN3ccc7CC2x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y73pqrEv,_ZThn4_N3ccc7CC2x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y73abcEv,_ZThn4_N3ccc7CC2x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y73pqrEv,_ZThn4_N3ccc7CC2x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y73abcEv,_ZThn4_N3ccc7CC2x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y7E[];
Class_Descriptor cd__ZN3ccc7CC2x5y7E = {  "_ZN3ccc7CC2x5y7E", // class name
  bases__ZN3ccc7CC2x5y7E, 2,
  &(vtc__ZN3ccc7CC2x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y8  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x5y83abcEv
  ~CC2x5y8(); // tgen
  CC2x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y8E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y83efgEv");}
void  ccc::CC2x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x5y83abcEv");}
ccc::CC2x5y8 ::~CC2x5y8(){ note_dtor("_ZN3ccc7CC2x5y8E", this);} // tgen
ccc::CC2x5y8 ::CC2x5y8(){ note_ctor("_ZN3ccc7CC2x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y8E, buf);
    ::ccc::CC2x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y8E);
    dp->::ccc::CC2x5y8::~CC2x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y8E(Test__ZN3ccc7CC2x5y8E, "_ZN3ccc7CC2x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y8C1Ev();
extern void _ZN3ccc7CC2x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y8E[] = {
  NSPAIR(_ZN3ccc7CC2x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y8E[];
extern void _ZN3ccc7CC2x5y83efgEv();
extern void _ZN3ccc7CC2x5y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y83efgEv,_ZThn4_N3ccc7CC2x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y83abcEv,_ZThn4_N3ccc7CC2x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y83efgEv,_ZThn4_N3ccc7CC2x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y83abcEv,_ZThn4_N3ccc7CC2x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y8E[];
Class_Descriptor cd__ZN3ccc7CC2x5y8E = {  "_ZN3ccc7CC2x5y8E", // class name
  bases__ZN3ccc7CC2x5y8E, 2,
  &(vtc__ZN3ccc7CC2x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y9  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC2x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x5y93pqrEv
  ~CC2x5y9(); // tgen
  CC2x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x5y9E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x5y93efgEv");}
void  ccc::CC2x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x5y93pqrEv");}
ccc::CC2x5y9 ::~CC2x5y9(){ note_dtor("_ZN3ccc7CC2x5y9E", this);} // tgen
ccc::CC2x5y9 ::CC2x5y9(){ note_ctor("_ZN3ccc7CC2x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x5y9E, buf);
    ::ccc::CC2x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x5y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC2x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x5y9E);
    dp->::ccc::CC2x5y9::~CC2x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x5y9E(Test__ZN3ccc7CC2x5y9E, "_ZN3ccc7CC2x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x5y9C1Ev();
extern void _ZN3ccc7CC2x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x5y9E[] = {
  NSPAIR(_ZN3ccc7CC2x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC2x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y9E[];
extern void _ZN3ccc7CC2x5y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y93pqrEv,_ZThn4_N3ccc7CC2x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x5y93efgEv,_ZThn4_N3ccc7CC2x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y93pqrEv,_ZThn4_N3ccc7CC2x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x5y93efgEv,_ZThn4_N3ccc7CC2x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x5y9E[];
Class_Descriptor cd__ZN3ccc7CC2x5y9E = {  "_ZN3ccc7CC2x5y9E", // class name
  bases__ZN3ccc7CC2x5y9E, 2,
  &(vtc__ZN3ccc7CC2x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y10  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x5y103abcEv
  ~CC2x5y10(); // tgen
  CC2x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y10E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y103pqrEv");}
void  ccc::CC2x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x5y103abcEv");}
ccc::CC2x5y10 ::~CC2x5y10(){ note_dtor("_ZN3ccc8CC2x5y10E", this);} // tgen
ccc::CC2x5y10 ::CC2x5y10(){ note_ctor("_ZN3ccc8CC2x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y10E, buf);
    ::ccc::CC2x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y10E);
    dp->::ccc::CC2x5y10::~CC2x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y10E(Test__ZN3ccc8CC2x5y10E, "_ZN3ccc8CC2x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y10C1Ev();
extern void _ZN3ccc8CC2x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y10E[] = {
  NSPAIR(_ZN3ccc8CC2x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x5y103abcEv();
extern void _ZN3ccc8CC2x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y103pqrEv,_ZThn4_N3ccc8CC2x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y103abcEv,_ZThn4_N3ccc8CC2x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y103pqrEv,_ZThn4_N3ccc8CC2x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y103abcEv,_ZThn4_N3ccc8CC2x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y10E[];
Class_Descriptor cd__ZN3ccc8CC2x5y10E = {  "_ZN3ccc8CC2x5y10E", // class name
  bases__ZN3ccc8CC2x5y10E, 2,
  &(vtc__ZN3ccc8CC2x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y11  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x5y113efgEv
  ~CC2x5y11(); // tgen
  CC2x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y11E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y113pqrEv");}
void  ccc::CC2x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x5y113efgEv");}
ccc::CC2x5y11 ::~CC2x5y11(){ note_dtor("_ZN3ccc8CC2x5y11E", this);} // tgen
ccc::CC2x5y11 ::CC2x5y11(){ note_ctor("_ZN3ccc8CC2x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y11E, buf);
    ::ccc::CC2x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y11E);
    dp->::ccc::CC2x5y11::~CC2x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y11E(Test__ZN3ccc8CC2x5y11E, "_ZN3ccc8CC2x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y11C1Ev();
extern void _ZN3ccc8CC2x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y11E[] = {
  NSPAIR(_ZN3ccc8CC2x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y11E[];
extern void _ZN3ccc8CC2x5y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y113pqrEv,_ZThn4_N3ccc8CC2x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y113efgEv,_ZThn4_N3ccc8CC2x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y113pqrEv,_ZThn4_N3ccc8CC2x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y113efgEv,_ZThn4_N3ccc8CC2x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y11E[];
Class_Descriptor cd__ZN3ccc8CC2x5y11E = {  "_ZN3ccc8CC2x5y11E", // class name
  bases__ZN3ccc8CC2x5y11E, 2,
  &(vtc__ZN3ccc8CC2x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y12  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC2x5y123abcEv
  ~CC2x5y12(); // tgen
  CC2x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC2x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x5y123abcEv");}
ccc::CC2x5y12 ::~CC2x5y12(){ note_dtor("_ZN3ccc8CC2x5y12E", this);} // tgen
ccc::CC2x5y12 ::CC2x5y12(){ note_ctor("_ZN3ccc8CC2x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y12E, buf);
    ::ccc::CC2x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y12E);
    dp->::ccc::CC2x5y12::~CC2x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y12E(Test__ZN3ccc8CC2x5y12E, "_ZN3ccc8CC2x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y12C1Ev();
extern void _ZN3ccc8CC2x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y12E[] = {
  NSPAIR(_ZN3ccc8CC2x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x5y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y123abcEv,_ZThn4_N3ccc8CC2x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y123abcEv,_ZThn4_N3ccc8CC2x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y12E[];
Class_Descriptor cd__ZN3ccc8CC2x5y12E = {  "_ZN3ccc8CC2x5y12E", // class name
  bases__ZN3ccc8CC2x5y12E, 2,
  &(vtc__ZN3ccc8CC2x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y13  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC2x5y133efgEv
  ~CC2x5y13(); // tgen
  CC2x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC2x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x5y133efgEv");}
ccc::CC2x5y13 ::~CC2x5y13(){ note_dtor("_ZN3ccc8CC2x5y13E", this);} // tgen
ccc::CC2x5y13 ::CC2x5y13(){ note_ctor("_ZN3ccc8CC2x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y13E, buf);
    ::ccc::CC2x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y13E);
    dp->::ccc::CC2x5y13::~CC2x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y13E(Test__ZN3ccc8CC2x5y13E, "_ZN3ccc8CC2x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y13C1Ev();
extern void _ZN3ccc8CC2x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y13E[] = {
  NSPAIR(_ZN3ccc8CC2x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y13E[];
extern void _ZN3ccc8CC2x5y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y133efgEv,_ZThn4_N3ccc8CC2x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y133efgEv,_ZThn4_N3ccc8CC2x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y13E[];
Class_Descriptor cd__ZN3ccc8CC2x5y13E = {  "_ZN3ccc8CC2x5y13E", // class name
  bases__ZN3ccc8CC2x5y13E, 2,
  &(vtc__ZN3ccc8CC2x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y14  : ::ccc::AA2 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC2x5y143pqrEv
  ~CC2x5y14(); // tgen
  CC2x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x5y143pqrEv");}
ccc::CC2x5y14 ::~CC2x5y14(){ note_dtor("_ZN3ccc8CC2x5y14E", this);} // tgen
ccc::CC2x5y14 ::CC2x5y14(){ note_ctor("_ZN3ccc8CC2x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y14E, buf);
    ::ccc::CC2x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y14E);
    dp->::ccc::CC2x5y14::~CC2x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y14E(Test__ZN3ccc8CC2x5y14E, "_ZN3ccc8CC2x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y14C1Ev();
extern void _ZN3ccc8CC2x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y14E[] = {
  NSPAIR(_ZN3ccc8CC2x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x5y143pqrEv,_ZThn4_N3ccc8CC2x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x5y143pqrEv,_ZThn4_N3ccc8CC2x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y14E[];
Class_Descriptor cd__ZN3ccc8CC2x5y14E = {  "_ZN3ccc8CC2x5y14E", // class name
  bases__ZN3ccc8CC2x5y14E, 2,
  &(vtc__ZN3ccc8CC2x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x5y15  : ::ccc::AA2 , ::ccc::BB5 {
  ~CC2x5y15(); // tgen
  CC2x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x5y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC2x5y15 ::~CC2x5y15(){ note_dtor("_ZN3ccc8CC2x5y15E", this);} // tgen
ccc::CC2x5y15 ::CC2x5y15(){ note_ctor("_ZN3ccc8CC2x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x5y15E, buf);
    ::ccc::CC2x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x5y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC2x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x5y15E);
    dp->::ccc::CC2x5y15::~CC2x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x5y15E(Test__ZN3ccc8CC2x5y15E, "_ZN3ccc8CC2x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x5y15C1Ev();
extern void _ZN3ccc8CC2x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x5y15E[] = {
  NSPAIR(_ZN3ccc8CC2x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC2x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x5y15E[];
Class_Descriptor cd__ZN3ccc8CC2x5y15E = {  "_ZN3ccc8CC2x5y15E", // class name
  bases__ZN3ccc8CC2x5y15E, 2,
  &(vtc__ZN3ccc8CC2x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y0  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y03pqrEv
  ~CC2x6y0(); // tgen
  CC2x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y0E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y03abcEv");}
void  ccc::CC2x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y03efgEv");}
void  ccc::CC2x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y03pqrEv");}
ccc::CC2x6y0 ::~CC2x6y0(){ note_dtor("_ZN3ccc7CC2x6y0E", this);} // tgen
ccc::CC2x6y0 ::CC2x6y0(){ note_ctor("_ZN3ccc7CC2x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y0E, buf);
    ::ccc::CC2x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y0E);
    dp->::ccc::CC2x6y0::~CC2x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y0E(Test__ZN3ccc7CC2x6y0E, "_ZN3ccc7CC2x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y0C1Ev();
extern void _ZN3ccc7CC2x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y0E[] = {
  NSPAIR(_ZN3ccc7CC2x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y0E[];
extern void _ZN3ccc7CC2x6y03efgEv();
extern void _ZN3ccc7CC2x6y03abcEv();
extern void _ZN3ccc7CC2x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y03abcEv,_ZThn4_N3ccc7CC2x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y03efgEv,_ZThn4_N3ccc7CC2x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y03abcEv,_ZThn4_N3ccc7CC2x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y03efgEv,_ZThn4_N3ccc7CC2x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y0E[];
Class_Descriptor cd__ZN3ccc7CC2x6y0E = {  "_ZN3ccc7CC2x6y0E", // class name
  bases__ZN3ccc7CC2x6y0E, 2,
  &(vtc__ZN3ccc7CC2x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y1  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x6y13efgEv
  ~CC2x6y1(); // tgen
  CC2x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y1E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y13abcEv");}
void  ccc::CC2x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y13pqrEv");}
void  ccc::CC2x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y13efgEv");}
ccc::CC2x6y1 ::~CC2x6y1(){ note_dtor("_ZN3ccc7CC2x6y1E", this);} // tgen
ccc::CC2x6y1 ::CC2x6y1(){ note_ctor("_ZN3ccc7CC2x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y1E, buf);
    ::ccc::CC2x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y1E);
    dp->::ccc::CC2x6y1::~CC2x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y1E(Test__ZN3ccc7CC2x6y1E, "_ZN3ccc7CC2x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y1C1Ev();
extern void _ZN3ccc7CC2x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y1E[] = {
  NSPAIR(_ZN3ccc7CC2x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y1E[];
extern void _ZN3ccc7CC2x6y13efgEv();
extern void _ZN3ccc7CC2x6y13abcEv();
extern void _ZN3ccc7CC2x6y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y13abcEv,_ZThn4_N3ccc7CC2x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y13efgEv,_ZThn4_N3ccc7CC2x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y13abcEv,_ZThn4_N3ccc7CC2x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y13efgEv,_ZThn4_N3ccc7CC2x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y1E[];
Class_Descriptor cd__ZN3ccc7CC2x6y1E = {  "_ZN3ccc7CC2x6y1E", // class name
  bases__ZN3ccc7CC2x6y1E, 2,
  &(vtc__ZN3ccc7CC2x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y2  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y23pqrEv
  ~CC2x6y2(); // tgen
  CC2x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y2E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y23efgEv");}
void  ccc::CC2x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y23abcEv");}
void  ccc::CC2x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y23pqrEv");}
ccc::CC2x6y2 ::~CC2x6y2(){ note_dtor("_ZN3ccc7CC2x6y2E", this);} // tgen
ccc::CC2x6y2 ::CC2x6y2(){ note_ctor("_ZN3ccc7CC2x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y2E, buf);
    ::ccc::CC2x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y2E);
    dp->::ccc::CC2x6y2::~CC2x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y2E(Test__ZN3ccc7CC2x6y2E, "_ZN3ccc7CC2x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y2C1Ev();
extern void _ZN3ccc7CC2x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y2E[] = {
  NSPAIR(_ZN3ccc7CC2x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y2E[];
extern void _ZN3ccc7CC2x6y23efgEv();
extern void _ZN3ccc7CC2x6y23abcEv();
extern void _ZN3ccc7CC2x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y23abcEv,_ZThn4_N3ccc7CC2x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y23efgEv,_ZThn4_N3ccc7CC2x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y23abcEv,_ZThn4_N3ccc7CC2x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y23efgEv,_ZThn4_N3ccc7CC2x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y2E[];
Class_Descriptor cd__ZN3ccc7CC2x6y2E = {  "_ZN3ccc7CC2x6y2E", // class name
  bases__ZN3ccc7CC2x6y2E, 2,
  &(vtc__ZN3ccc7CC2x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y3  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x6y33abcEv
  ~CC2x6y3(); // tgen
  CC2x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y3E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y33efgEv");}
void  ccc::CC2x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y33pqrEv");}
void  ccc::CC2x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y33abcEv");}
ccc::CC2x6y3 ::~CC2x6y3(){ note_dtor("_ZN3ccc7CC2x6y3E", this);} // tgen
ccc::CC2x6y3 ::CC2x6y3(){ note_ctor("_ZN3ccc7CC2x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y3E, buf);
    ::ccc::CC2x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y3E);
    dp->::ccc::CC2x6y3::~CC2x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y3E(Test__ZN3ccc7CC2x6y3E, "_ZN3ccc7CC2x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y3C1Ev();
extern void _ZN3ccc7CC2x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y3E[] = {
  NSPAIR(_ZN3ccc7CC2x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y3E[];
extern void _ZN3ccc7CC2x6y33efgEv();
extern void _ZN3ccc7CC2x6y33abcEv();
extern void _ZN3ccc7CC2x6y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y33abcEv,_ZThn4_N3ccc7CC2x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y33efgEv,_ZThn4_N3ccc7CC2x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y33abcEv,_ZThn4_N3ccc7CC2x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y33efgEv,_ZThn4_N3ccc7CC2x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y3E[];
Class_Descriptor cd__ZN3ccc7CC2x6y3E = {  "_ZN3ccc7CC2x6y3E", // class name
  bases__ZN3ccc7CC2x6y3E, 2,
  &(vtc__ZN3ccc7CC2x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y4  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC2x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y43efgEv
  ~CC2x6y4(); // tgen
  CC2x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y4E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y43pqrEv");}
void  ccc::CC2x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y43abcEv");}
void  ccc::CC2x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y43efgEv");}
ccc::CC2x6y4 ::~CC2x6y4(){ note_dtor("_ZN3ccc7CC2x6y4E", this);} // tgen
ccc::CC2x6y4 ::CC2x6y4(){ note_ctor("_ZN3ccc7CC2x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y4E, buf);
    ::ccc::CC2x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y4E);
    dp->::ccc::CC2x6y4::~CC2x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y4E(Test__ZN3ccc7CC2x6y4E, "_ZN3ccc7CC2x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y4C1Ev();
extern void _ZN3ccc7CC2x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y4E[] = {
  NSPAIR(_ZN3ccc7CC2x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y4E[];
extern void _ZN3ccc7CC2x6y43efgEv();
extern void _ZN3ccc7CC2x6y43abcEv();
extern void _ZN3ccc7CC2x6y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y43abcEv,_ZThn4_N3ccc7CC2x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y43efgEv,_ZThn4_N3ccc7CC2x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y43abcEv,_ZThn4_N3ccc7CC2x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y43efgEv,_ZThn4_N3ccc7CC2x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y4E[];
Class_Descriptor cd__ZN3ccc7CC2x6y4E = {  "_ZN3ccc7CC2x6y4E", // class name
  bases__ZN3ccc7CC2x6y4E, 2,
  &(vtc__ZN3ccc7CC2x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y5  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC2x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y53abcEv
  ~CC2x6y5(); // tgen
  CC2x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y5E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y53pqrEv");}
void  ccc::CC2x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y53efgEv");}
void  ccc::CC2x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y53abcEv");}
ccc::CC2x6y5 ::~CC2x6y5(){ note_dtor("_ZN3ccc7CC2x6y5E", this);} // tgen
ccc::CC2x6y5 ::CC2x6y5(){ note_ctor("_ZN3ccc7CC2x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y5E, buf);
    ::ccc::CC2x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y5E);
    dp->::ccc::CC2x6y5::~CC2x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y5E(Test__ZN3ccc7CC2x6y5E, "_ZN3ccc7CC2x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y5C1Ev();
extern void _ZN3ccc7CC2x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y5E[] = {
  NSPAIR(_ZN3ccc7CC2x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y5E[];
extern void _ZN3ccc7CC2x6y53efgEv();
extern void _ZN3ccc7CC2x6y53abcEv();
extern void _ZN3ccc7CC2x6y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y53abcEv,_ZThn4_N3ccc7CC2x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y53efgEv,_ZThn4_N3ccc7CC2x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y53abcEv,_ZThn4_N3ccc7CC2x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y53efgEv,_ZThn4_N3ccc7CC2x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y5E[];
Class_Descriptor cd__ZN3ccc7CC2x6y5E = {  "_ZN3ccc7CC2x6y5E", // class name
  bases__ZN3ccc7CC2x6y5E, 2,
  &(vtc__ZN3ccc7CC2x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y6  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x6y63efgEv
  ~CC2x6y6(); // tgen
  CC2x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y6E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y63abcEv");}
void  ccc::CC2x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y63efgEv");}
ccc::CC2x6y6 ::~CC2x6y6(){ note_dtor("_ZN3ccc7CC2x6y6E", this);} // tgen
ccc::CC2x6y6 ::CC2x6y6(){ note_ctor("_ZN3ccc7CC2x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y6E, buf);
    ::ccc::CC2x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y6E);
    dp->::ccc::CC2x6y6::~CC2x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y6E(Test__ZN3ccc7CC2x6y6E, "_ZN3ccc7CC2x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y6C1Ev();
extern void _ZN3ccc7CC2x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y6E[] = {
  NSPAIR(_ZN3ccc7CC2x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y6E[];
extern void _ZN3ccc7CC2x6y63efgEv();
extern void _ZN3ccc7CC2x6y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y63abcEv,_ZThn4_N3ccc7CC2x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y63efgEv,_ZThn4_N3ccc7CC2x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y63abcEv,_ZThn4_N3ccc7CC2x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y63efgEv,_ZThn4_N3ccc7CC2x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y6E[];
Class_Descriptor cd__ZN3ccc7CC2x6y6E = {  "_ZN3ccc7CC2x6y6E", // class name
  bases__ZN3ccc7CC2x6y6E, 2,
  &(vtc__ZN3ccc7CC2x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y7  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC2x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y73pqrEv
  ~CC2x6y7(); // tgen
  CC2x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y7E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y73abcEv");}
void  ccc::CC2x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y73pqrEv");}
ccc::CC2x6y7 ::~CC2x6y7(){ note_dtor("_ZN3ccc7CC2x6y7E", this);} // tgen
ccc::CC2x6y7 ::CC2x6y7(){ note_ctor("_ZN3ccc7CC2x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y7E, buf);
    ::ccc::CC2x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y7E);
    dp->::ccc::CC2x6y7::~CC2x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y7E(Test__ZN3ccc7CC2x6y7E, "_ZN3ccc7CC2x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y7C1Ev();
extern void _ZN3ccc7CC2x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y7E[] = {
  NSPAIR(_ZN3ccc7CC2x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x6y73abcEv();
extern void _ZN3ccc7CC2x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y73abcEv,_ZThn4_N3ccc7CC2x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y73abcEv,_ZThn4_N3ccc7CC2x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y7E[];
Class_Descriptor cd__ZN3ccc7CC2x6y7E = {  "_ZN3ccc7CC2x6y7E", // class name
  bases__ZN3ccc7CC2x6y7E, 2,
  &(vtc__ZN3ccc7CC2x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y8  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x6y83abcEv
  ~CC2x6y8(); // tgen
  CC2x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y8E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y83efgEv");}
void  ccc::CC2x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x6y83abcEv");}
ccc::CC2x6y8 ::~CC2x6y8(){ note_dtor("_ZN3ccc7CC2x6y8E", this);} // tgen
ccc::CC2x6y8 ::CC2x6y8(){ note_ctor("_ZN3ccc7CC2x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y8E, buf);
    ::ccc::CC2x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y8E);
    dp->::ccc::CC2x6y8::~CC2x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y8E(Test__ZN3ccc7CC2x6y8E, "_ZN3ccc7CC2x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y8C1Ev();
extern void _ZN3ccc7CC2x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y8E[] = {
  NSPAIR(_ZN3ccc7CC2x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y8E[];
extern void _ZN3ccc7CC2x6y83efgEv();
extern void _ZN3ccc7CC2x6y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y83abcEv,_ZThn4_N3ccc7CC2x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y83efgEv,_ZThn4_N3ccc7CC2x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y83abcEv,_ZThn4_N3ccc7CC2x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y83efgEv,_ZThn4_N3ccc7CC2x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y8E[];
Class_Descriptor cd__ZN3ccc7CC2x6y8E = {  "_ZN3ccc7CC2x6y8E", // class name
  bases__ZN3ccc7CC2x6y8E, 2,
  &(vtc__ZN3ccc7CC2x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y9  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC2x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x6y93pqrEv
  ~CC2x6y9(); // tgen
  CC2x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x6y9E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x6y93efgEv");}
void  ccc::CC2x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x6y93pqrEv");}
ccc::CC2x6y9 ::~CC2x6y9(){ note_dtor("_ZN3ccc7CC2x6y9E", this);} // tgen
ccc::CC2x6y9 ::CC2x6y9(){ note_ctor("_ZN3ccc7CC2x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x6y9E, buf);
    ::ccc::CC2x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x6y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC2x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x6y9E);
    dp->::ccc::CC2x6y9::~CC2x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x6y9E(Test__ZN3ccc7CC2x6y9E, "_ZN3ccc7CC2x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x6y9C1Ev();
extern void _ZN3ccc7CC2x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x6y9E[] = {
  NSPAIR(_ZN3ccc7CC2x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC2x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y9E[];
extern void _ZN3ccc7CC2x6y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x6y93efgEv,_ZThn4_N3ccc7CC2x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x6y93efgEv,_ZThn4_N3ccc7CC2x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x6y9E[];
Class_Descriptor cd__ZN3ccc7CC2x6y9E = {  "_ZN3ccc7CC2x6y9E", // class name
  bases__ZN3ccc7CC2x6y9E, 2,
  &(vtc__ZN3ccc7CC2x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y10  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x6y103abcEv
  ~CC2x6y10(); // tgen
  CC2x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y10E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y103pqrEv");}
void  ccc::CC2x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x6y103abcEv");}
ccc::CC2x6y10 ::~CC2x6y10(){ note_dtor("_ZN3ccc8CC2x6y10E", this);} // tgen
ccc::CC2x6y10 ::CC2x6y10(){ note_ctor("_ZN3ccc8CC2x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y10E, buf);
    ::ccc::CC2x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y10E);
    dp->::ccc::CC2x6y10::~CC2x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y10E(Test__ZN3ccc8CC2x6y10E, "_ZN3ccc8CC2x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y10C1Ev();
extern void _ZN3ccc8CC2x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y10E[] = {
  NSPAIR(_ZN3ccc8CC2x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x6y103abcEv();
extern void _ZN3ccc8CC2x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y103abcEv,_ZThn4_N3ccc8CC2x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x6y103abcEv,_ZThn4_N3ccc8CC2x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y10E[];
Class_Descriptor cd__ZN3ccc8CC2x6y10E = {  "_ZN3ccc8CC2x6y10E", // class name
  bases__ZN3ccc8CC2x6y10E, 2,
  &(vtc__ZN3ccc8CC2x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y11  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x6y113efgEv
  ~CC2x6y11(); // tgen
  CC2x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y11E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y113pqrEv");}
void  ccc::CC2x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x6y113efgEv");}
ccc::CC2x6y11 ::~CC2x6y11(){ note_dtor("_ZN3ccc8CC2x6y11E", this);} // tgen
ccc::CC2x6y11 ::CC2x6y11(){ note_ctor("_ZN3ccc8CC2x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y11E, buf);
    ::ccc::CC2x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y11E);
    dp->::ccc::CC2x6y11::~CC2x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y11E(Test__ZN3ccc8CC2x6y11E, "_ZN3ccc8CC2x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y11C1Ev();
extern void _ZN3ccc8CC2x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y11E[] = {
  NSPAIR(_ZN3ccc8CC2x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y11E[];
extern void _ZN3ccc8CC2x6y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y113efgEv,_ZThn4_N3ccc8CC2x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x6y113efgEv,_ZThn4_N3ccc8CC2x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y11E[];
Class_Descriptor cd__ZN3ccc8CC2x6y11E = {  "_ZN3ccc8CC2x6y11E", // class name
  bases__ZN3ccc8CC2x6y11E, 2,
  &(vtc__ZN3ccc8CC2x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y12  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC2x6y123abcEv
  ~CC2x6y12(); // tgen
  CC2x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x6y123abcEv");}
ccc::CC2x6y12 ::~CC2x6y12(){ note_dtor("_ZN3ccc8CC2x6y12E", this);} // tgen
ccc::CC2x6y12 ::CC2x6y12(){ note_ctor("_ZN3ccc8CC2x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y12E, buf);
    ::ccc::CC2x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y12E);
    dp->::ccc::CC2x6y12::~CC2x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y12E(Test__ZN3ccc8CC2x6y12E, "_ZN3ccc8CC2x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y12C1Ev();
extern void _ZN3ccc8CC2x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y12E[] = {
  NSPAIR(_ZN3ccc8CC2x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x6y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y123abcEv,_ZThn4_N3ccc8CC2x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x6y123abcEv,_ZThn4_N3ccc8CC2x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y12E[];
Class_Descriptor cd__ZN3ccc8CC2x6y12E = {  "_ZN3ccc8CC2x6y12E", // class name
  bases__ZN3ccc8CC2x6y12E, 2,
  &(vtc__ZN3ccc8CC2x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y13  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC2x6y133efgEv
  ~CC2x6y13(); // tgen
  CC2x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x6y133efgEv");}
ccc::CC2x6y13 ::~CC2x6y13(){ note_dtor("_ZN3ccc8CC2x6y13E", this);} // tgen
ccc::CC2x6y13 ::CC2x6y13(){ note_ctor("_ZN3ccc8CC2x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y13E, buf);
    ::ccc::CC2x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y13E);
    dp->::ccc::CC2x6y13::~CC2x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y13E(Test__ZN3ccc8CC2x6y13E, "_ZN3ccc8CC2x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y13C1Ev();
extern void _ZN3ccc8CC2x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y13E[] = {
  NSPAIR(_ZN3ccc8CC2x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y13E[];
extern void _ZN3ccc8CC2x6y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x6y133efgEv,_ZThn4_N3ccc8CC2x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x6y133efgEv,_ZThn4_N3ccc8CC2x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y13E[];
Class_Descriptor cd__ZN3ccc8CC2x6y13E = {  "_ZN3ccc8CC2x6y13E", // class name
  bases__ZN3ccc8CC2x6y13E, 2,
  &(vtc__ZN3ccc8CC2x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y14  : ::ccc::AA2 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC2x6y143pqrEv
  ~CC2x6y14(); // tgen
  CC2x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x6y143pqrEv");}
ccc::CC2x6y14 ::~CC2x6y14(){ note_dtor("_ZN3ccc8CC2x6y14E", this);} // tgen
ccc::CC2x6y14 ::CC2x6y14(){ note_ctor("_ZN3ccc8CC2x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y14E, buf);
    ::ccc::CC2x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y14E);
    dp->::ccc::CC2x6y14::~CC2x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y14E(Test__ZN3ccc8CC2x6y14E, "_ZN3ccc8CC2x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y14C1Ev();
extern void _ZN3ccc8CC2x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y14E[] = {
  NSPAIR(_ZN3ccc8CC2x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y14E[];
Class_Descriptor cd__ZN3ccc8CC2x6y14E = {  "_ZN3ccc8CC2x6y14E", // class name
  bases__ZN3ccc8CC2x6y14E, 2,
  &(vtc__ZN3ccc8CC2x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x6y15  : ::ccc::AA2 , ::ccc::BB6 {
  ~CC2x6y15(); // tgen
  CC2x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x6y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x6y15 ::~CC2x6y15(){ note_dtor("_ZN3ccc8CC2x6y15E", this);} // tgen
ccc::CC2x6y15 ::CC2x6y15(){ note_ctor("_ZN3ccc8CC2x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x6y15E, buf);
    ::ccc::CC2x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x6y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC2x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x6y15E);
    dp->::ccc::CC2x6y15::~CC2x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x6y15E(Test__ZN3ccc8CC2x6y15E, "_ZN3ccc8CC2x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x6y15C1Ev();
extern void _ZN3ccc8CC2x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x6y15E[] = {
  NSPAIR(_ZN3ccc8CC2x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC2x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x6y15E[];
Class_Descriptor cd__ZN3ccc8CC2x6y15E = {  "_ZN3ccc8CC2x6y15E", // class name
  bases__ZN3ccc8CC2x6y15E, 2,
  &(vtc__ZN3ccc8CC2x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y0  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y03pqrEv
  ~CC2x7y0(); // tgen
  CC2x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y0E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y03abcEv");}
void  ccc::CC2x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y03efgEv");}
void  ccc::CC2x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y03pqrEv");}
ccc::CC2x7y0 ::~CC2x7y0(){ note_dtor("_ZN3ccc7CC2x7y0E", this);} // tgen
ccc::CC2x7y0 ::CC2x7y0(){ note_ctor("_ZN3ccc7CC2x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y0E, buf);
    ::ccc::CC2x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y0E);
    dp->::ccc::CC2x7y0::~CC2x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y0E(Test__ZN3ccc7CC2x7y0E, "_ZN3ccc7CC2x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y0C1Ev();
extern void _ZN3ccc7CC2x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y0E[] = {
  NSPAIR(_ZN3ccc7CC2x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y0E[];
extern void _ZN3ccc7CC2x7y03efgEv();
extern void _ZN3ccc7CC2x7y03abcEv();
extern void _ZN3ccc7CC2x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y03abcEv,_ZThn4_N3ccc7CC2x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y03pqrEv,_ZThn4_N3ccc7CC2x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y03abcEv,_ZThn4_N3ccc7CC2x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y03pqrEv,_ZThn4_N3ccc7CC2x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y0E[];
Class_Descriptor cd__ZN3ccc7CC2x7y0E = {  "_ZN3ccc7CC2x7y0E", // class name
  bases__ZN3ccc7CC2x7y0E, 2,
  &(vtc__ZN3ccc7CC2x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y1  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x7y13efgEv
  ~CC2x7y1(); // tgen
  CC2x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y1E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y13abcEv");}
void  ccc::CC2x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y13pqrEv");}
void  ccc::CC2x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y13efgEv");}
ccc::CC2x7y1 ::~CC2x7y1(){ note_dtor("_ZN3ccc7CC2x7y1E", this);} // tgen
ccc::CC2x7y1 ::CC2x7y1(){ note_ctor("_ZN3ccc7CC2x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y1E, buf);
    ::ccc::CC2x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y1E);
    dp->::ccc::CC2x7y1::~CC2x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y1E(Test__ZN3ccc7CC2x7y1E, "_ZN3ccc7CC2x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y1C1Ev();
extern void _ZN3ccc7CC2x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y1E[] = {
  NSPAIR(_ZN3ccc7CC2x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y1E[];
extern void _ZN3ccc7CC2x7y13efgEv();
extern void _ZN3ccc7CC2x7y13abcEv();
extern void _ZN3ccc7CC2x7y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y13abcEv,_ZThn4_N3ccc7CC2x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y13pqrEv,_ZThn4_N3ccc7CC2x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y13abcEv,_ZThn4_N3ccc7CC2x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y13pqrEv,_ZThn4_N3ccc7CC2x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y1E[];
Class_Descriptor cd__ZN3ccc7CC2x7y1E = {  "_ZN3ccc7CC2x7y1E", // class name
  bases__ZN3ccc7CC2x7y1E, 2,
  &(vtc__ZN3ccc7CC2x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y2  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y23pqrEv
  ~CC2x7y2(); // tgen
  CC2x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y2E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y23efgEv");}
void  ccc::CC2x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y23abcEv");}
void  ccc::CC2x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y23pqrEv");}
ccc::CC2x7y2 ::~CC2x7y2(){ note_dtor("_ZN3ccc7CC2x7y2E", this);} // tgen
ccc::CC2x7y2 ::CC2x7y2(){ note_ctor("_ZN3ccc7CC2x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y2E, buf);
    ::ccc::CC2x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y2E);
    dp->::ccc::CC2x7y2::~CC2x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y2E(Test__ZN3ccc7CC2x7y2E, "_ZN3ccc7CC2x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y2C1Ev();
extern void _ZN3ccc7CC2x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y2E[] = {
  NSPAIR(_ZN3ccc7CC2x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y2E[];
extern void _ZN3ccc7CC2x7y23efgEv();
extern void _ZN3ccc7CC2x7y23abcEv();
extern void _ZN3ccc7CC2x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y23abcEv,_ZThn4_N3ccc7CC2x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y23pqrEv,_ZThn4_N3ccc7CC2x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y23abcEv,_ZThn4_N3ccc7CC2x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y23pqrEv,_ZThn4_N3ccc7CC2x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y2E[];
Class_Descriptor cd__ZN3ccc7CC2x7y2E = {  "_ZN3ccc7CC2x7y2E", // class name
  bases__ZN3ccc7CC2x7y2E, 2,
  &(vtc__ZN3ccc7CC2x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y3  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x7y33abcEv
  ~CC2x7y3(); // tgen
  CC2x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y3E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y33efgEv");}
void  ccc::CC2x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y33pqrEv");}
void  ccc::CC2x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y33abcEv");}
ccc::CC2x7y3 ::~CC2x7y3(){ note_dtor("_ZN3ccc7CC2x7y3E", this);} // tgen
ccc::CC2x7y3 ::CC2x7y3(){ note_ctor("_ZN3ccc7CC2x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y3E, buf);
    ::ccc::CC2x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y3E);
    dp->::ccc::CC2x7y3::~CC2x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y3E(Test__ZN3ccc7CC2x7y3E, "_ZN3ccc7CC2x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y3C1Ev();
extern void _ZN3ccc7CC2x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y3E[] = {
  NSPAIR(_ZN3ccc7CC2x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y3E[];
extern void _ZN3ccc7CC2x7y33efgEv();
extern void _ZN3ccc7CC2x7y33abcEv();
extern void _ZN3ccc7CC2x7y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y33abcEv,_ZThn4_N3ccc7CC2x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y33pqrEv,_ZThn4_N3ccc7CC2x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y33abcEv,_ZThn4_N3ccc7CC2x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y33pqrEv,_ZThn4_N3ccc7CC2x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y3E[];
Class_Descriptor cd__ZN3ccc7CC2x7y3E = {  "_ZN3ccc7CC2x7y3E", // class name
  bases__ZN3ccc7CC2x7y3E, 2,
  &(vtc__ZN3ccc7CC2x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y4  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC2x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y43efgEv
  ~CC2x7y4(); // tgen
  CC2x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y4E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y43pqrEv");}
void  ccc::CC2x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y43abcEv");}
void  ccc::CC2x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y43efgEv");}
ccc::CC2x7y4 ::~CC2x7y4(){ note_dtor("_ZN3ccc7CC2x7y4E", this);} // tgen
ccc::CC2x7y4 ::CC2x7y4(){ note_ctor("_ZN3ccc7CC2x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y4E, buf);
    ::ccc::CC2x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y4E);
    dp->::ccc::CC2x7y4::~CC2x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y4E(Test__ZN3ccc7CC2x7y4E, "_ZN3ccc7CC2x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y4C1Ev();
extern void _ZN3ccc7CC2x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y4E[] = {
  NSPAIR(_ZN3ccc7CC2x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y4E[];
extern void _ZN3ccc7CC2x7y43efgEv();
extern void _ZN3ccc7CC2x7y43abcEv();
extern void _ZN3ccc7CC2x7y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y43abcEv,_ZThn4_N3ccc7CC2x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y43pqrEv,_ZThn4_N3ccc7CC2x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y43abcEv,_ZThn4_N3ccc7CC2x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y43pqrEv,_ZThn4_N3ccc7CC2x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y4E[];
Class_Descriptor cd__ZN3ccc7CC2x7y4E = {  "_ZN3ccc7CC2x7y4E", // class name
  bases__ZN3ccc7CC2x7y4E, 2,
  &(vtc__ZN3ccc7CC2x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y5  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC2x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y53abcEv
  ~CC2x7y5(); // tgen
  CC2x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y5E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y53pqrEv");}
void  ccc::CC2x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y53efgEv");}
void  ccc::CC2x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y53abcEv");}
ccc::CC2x7y5 ::~CC2x7y5(){ note_dtor("_ZN3ccc7CC2x7y5E", this);} // tgen
ccc::CC2x7y5 ::CC2x7y5(){ note_ctor("_ZN3ccc7CC2x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y5E, buf);
    ::ccc::CC2x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y5E);
    dp->::ccc::CC2x7y5::~CC2x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y5E(Test__ZN3ccc7CC2x7y5E, "_ZN3ccc7CC2x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y5C1Ev();
extern void _ZN3ccc7CC2x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y5E[] = {
  NSPAIR(_ZN3ccc7CC2x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y5E[];
extern void _ZN3ccc7CC2x7y53efgEv();
extern void _ZN3ccc7CC2x7y53abcEv();
extern void _ZN3ccc7CC2x7y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y53abcEv,_ZThn4_N3ccc7CC2x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y53pqrEv,_ZThn4_N3ccc7CC2x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y53abcEv,_ZThn4_N3ccc7CC2x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y53pqrEv,_ZThn4_N3ccc7CC2x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y5E[];
Class_Descriptor cd__ZN3ccc7CC2x7y5E = {  "_ZN3ccc7CC2x7y5E", // class name
  bases__ZN3ccc7CC2x7y5E, 2,
  &(vtc__ZN3ccc7CC2x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y6  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x7y63efgEv
  ~CC2x7y6(); // tgen
  CC2x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y6E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y63abcEv");}
void  ccc::CC2x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y63efgEv");}
ccc::CC2x7y6 ::~CC2x7y6(){ note_dtor("_ZN3ccc7CC2x7y6E", this);} // tgen
ccc::CC2x7y6 ::CC2x7y6(){ note_ctor("_ZN3ccc7CC2x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y6E, buf);
    ::ccc::CC2x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y6E);
    dp->::ccc::CC2x7y6::~CC2x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y6E(Test__ZN3ccc7CC2x7y6E, "_ZN3ccc7CC2x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y6C1Ev();
extern void _ZN3ccc7CC2x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y6E[] = {
  NSPAIR(_ZN3ccc7CC2x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y6E[];
extern void _ZN3ccc7CC2x7y63efgEv();
extern void _ZN3ccc7CC2x7y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y63abcEv,_ZThn4_N3ccc7CC2x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y63abcEv,_ZThn4_N3ccc7CC2x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y6E[];
Class_Descriptor cd__ZN3ccc7CC2x7y6E = {  "_ZN3ccc7CC2x7y6E", // class name
  bases__ZN3ccc7CC2x7y6E, 2,
  &(vtc__ZN3ccc7CC2x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y7  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC2x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y73pqrEv
  ~CC2x7y7(); // tgen
  CC2x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y7E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y73abcEv");}
void  ccc::CC2x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y73pqrEv");}
ccc::CC2x7y7 ::~CC2x7y7(){ note_dtor("_ZN3ccc7CC2x7y7E", this);} // tgen
ccc::CC2x7y7 ::CC2x7y7(){ note_ctor("_ZN3ccc7CC2x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y7E, buf);
    ::ccc::CC2x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y7E);
    dp->::ccc::CC2x7y7::~CC2x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y7E(Test__ZN3ccc7CC2x7y7E, "_ZN3ccc7CC2x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y7C1Ev();
extern void _ZN3ccc7CC2x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y7E[] = {
  NSPAIR(_ZN3ccc7CC2x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x7y73abcEv();
extern void _ZN3ccc7CC2x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y73abcEv,_ZThn4_N3ccc7CC2x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y73pqrEv,_ZThn4_N3ccc7CC2x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y73abcEv,_ZThn4_N3ccc7CC2x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y73pqrEv,_ZThn4_N3ccc7CC2x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y7E[];
Class_Descriptor cd__ZN3ccc7CC2x7y7E = {  "_ZN3ccc7CC2x7y7E", // class name
  bases__ZN3ccc7CC2x7y7E, 2,
  &(vtc__ZN3ccc7CC2x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y8  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x7y83abcEv
  ~CC2x7y8(); // tgen
  CC2x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y8E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y83efgEv");}
void  ccc::CC2x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x7y83abcEv");}
ccc::CC2x7y8 ::~CC2x7y8(){ note_dtor("_ZN3ccc7CC2x7y8E", this);} // tgen
ccc::CC2x7y8 ::CC2x7y8(){ note_ctor("_ZN3ccc7CC2x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y8E, buf);
    ::ccc::CC2x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y8E);
    dp->::ccc::CC2x7y8::~CC2x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y8E(Test__ZN3ccc7CC2x7y8E, "_ZN3ccc7CC2x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y8C1Ev();
extern void _ZN3ccc7CC2x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y8E[] = {
  NSPAIR(_ZN3ccc7CC2x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y8E[];
extern void _ZN3ccc7CC2x7y83efgEv();
extern void _ZN3ccc7CC2x7y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y83abcEv,_ZThn4_N3ccc7CC2x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y83abcEv,_ZThn4_N3ccc7CC2x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y8E[];
Class_Descriptor cd__ZN3ccc7CC2x7y8E = {  "_ZN3ccc7CC2x7y8E", // class name
  bases__ZN3ccc7CC2x7y8E, 2,
  &(vtc__ZN3ccc7CC2x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y9  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC2x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x7y93pqrEv
  ~CC2x7y9(); // tgen
  CC2x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x7y9E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x7y93efgEv");}
void  ccc::CC2x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x7y93pqrEv");}
ccc::CC2x7y9 ::~CC2x7y9(){ note_dtor("_ZN3ccc7CC2x7y9E", this);} // tgen
ccc::CC2x7y9 ::CC2x7y9(){ note_ctor("_ZN3ccc7CC2x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x7y9E, buf);
    ::ccc::CC2x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x7y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC2x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x7y9E);
    dp->::ccc::CC2x7y9::~CC2x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x7y9E(Test__ZN3ccc7CC2x7y9E, "_ZN3ccc7CC2x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x7y9C1Ev();
extern void _ZN3ccc7CC2x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x7y9E[] = {
  NSPAIR(_ZN3ccc7CC2x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC2x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y9E[];
extern void _ZN3ccc7CC2x7y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x7y93pqrEv,_ZThn4_N3ccc7CC2x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x7y93pqrEv,_ZThn4_N3ccc7CC2x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x7y9E[];
Class_Descriptor cd__ZN3ccc7CC2x7y9E = {  "_ZN3ccc7CC2x7y9E", // class name
  bases__ZN3ccc7CC2x7y9E, 2,
  &(vtc__ZN3ccc7CC2x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y10  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x7y103abcEv
  ~CC2x7y10(); // tgen
  CC2x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y10E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y103pqrEv");}
void  ccc::CC2x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x7y103abcEv");}
ccc::CC2x7y10 ::~CC2x7y10(){ note_dtor("_ZN3ccc8CC2x7y10E", this);} // tgen
ccc::CC2x7y10 ::CC2x7y10(){ note_ctor("_ZN3ccc8CC2x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y10E, buf);
    ::ccc::CC2x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y10E);
    dp->::ccc::CC2x7y10::~CC2x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y10E(Test__ZN3ccc8CC2x7y10E, "_ZN3ccc8CC2x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y10C1Ev();
extern void _ZN3ccc8CC2x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y10E[] = {
  NSPAIR(_ZN3ccc8CC2x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x7y103abcEv();
extern void _ZN3ccc8CC2x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y103abcEv,_ZThn4_N3ccc8CC2x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y103pqrEv,_ZThn4_N3ccc8CC2x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x7y103abcEv,_ZThn4_N3ccc8CC2x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x7y103pqrEv,_ZThn4_N3ccc8CC2x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y10E[];
Class_Descriptor cd__ZN3ccc8CC2x7y10E = {  "_ZN3ccc8CC2x7y10E", // class name
  bases__ZN3ccc8CC2x7y10E, 2,
  &(vtc__ZN3ccc8CC2x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y11  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x7y113efgEv
  ~CC2x7y11(); // tgen
  CC2x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y11E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y113pqrEv");}
void  ccc::CC2x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x7y113efgEv");}
ccc::CC2x7y11 ::~CC2x7y11(){ note_dtor("_ZN3ccc8CC2x7y11E", this);} // tgen
ccc::CC2x7y11 ::CC2x7y11(){ note_ctor("_ZN3ccc8CC2x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y11E, buf);
    ::ccc::CC2x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y11E);
    dp->::ccc::CC2x7y11::~CC2x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y11E(Test__ZN3ccc8CC2x7y11E, "_ZN3ccc8CC2x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y11C1Ev();
extern void _ZN3ccc8CC2x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y11E[] = {
  NSPAIR(_ZN3ccc8CC2x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y11E[];
extern void _ZN3ccc8CC2x7y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y113pqrEv,_ZThn4_N3ccc8CC2x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x7y113pqrEv,_ZThn4_N3ccc8CC2x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y11E[];
Class_Descriptor cd__ZN3ccc8CC2x7y11E = {  "_ZN3ccc8CC2x7y11E", // class name
  bases__ZN3ccc8CC2x7y11E, 2,
  &(vtc__ZN3ccc8CC2x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y12  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC2x7y123abcEv
  ~CC2x7y12(); // tgen
  CC2x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x7y123abcEv");}
ccc::CC2x7y12 ::~CC2x7y12(){ note_dtor("_ZN3ccc8CC2x7y12E", this);} // tgen
ccc::CC2x7y12 ::CC2x7y12(){ note_ctor("_ZN3ccc8CC2x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y12E, buf);
    ::ccc::CC2x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y12E);
    dp->::ccc::CC2x7y12::~CC2x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y12E(Test__ZN3ccc8CC2x7y12E, "_ZN3ccc8CC2x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y12C1Ev();
extern void _ZN3ccc8CC2x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y12E[] = {
  NSPAIR(_ZN3ccc8CC2x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x7y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y123abcEv,_ZThn4_N3ccc8CC2x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x7y123abcEv,_ZThn4_N3ccc8CC2x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y12E[];
Class_Descriptor cd__ZN3ccc8CC2x7y12E = {  "_ZN3ccc8CC2x7y12E", // class name
  bases__ZN3ccc8CC2x7y12E, 2,
  &(vtc__ZN3ccc8CC2x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y13  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC2x7y133efgEv
  ~CC2x7y13(); // tgen
  CC2x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x7y133efgEv");}
ccc::CC2x7y13 ::~CC2x7y13(){ note_dtor("_ZN3ccc8CC2x7y13E", this);} // tgen
ccc::CC2x7y13 ::CC2x7y13(){ note_ctor("_ZN3ccc8CC2x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y13E, buf);
    ::ccc::CC2x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y13E);
    dp->::ccc::CC2x7y13::~CC2x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y13E(Test__ZN3ccc8CC2x7y13E, "_ZN3ccc8CC2x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y13C1Ev();
extern void _ZN3ccc8CC2x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y13E[] = {
  NSPAIR(_ZN3ccc8CC2x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y13E[];
extern void _ZN3ccc8CC2x7y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y13E[];
Class_Descriptor cd__ZN3ccc8CC2x7y13E = {  "_ZN3ccc8CC2x7y13E", // class name
  bases__ZN3ccc8CC2x7y13E, 2,
  &(vtc__ZN3ccc8CC2x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y14  : ::ccc::AA2 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC2x7y143pqrEv
  ~CC2x7y14(); // tgen
  CC2x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x7y143pqrEv");}
ccc::CC2x7y14 ::~CC2x7y14(){ note_dtor("_ZN3ccc8CC2x7y14E", this);} // tgen
ccc::CC2x7y14 ::CC2x7y14(){ note_ctor("_ZN3ccc8CC2x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y14E, buf);
    ::ccc::CC2x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y14E);
    dp->::ccc::CC2x7y14::~CC2x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y14E(Test__ZN3ccc8CC2x7y14E, "_ZN3ccc8CC2x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y14C1Ev();
extern void _ZN3ccc8CC2x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y14E[] = {
  NSPAIR(_ZN3ccc8CC2x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x7y143pqrEv,_ZThn4_N3ccc8CC2x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x7y143pqrEv,_ZThn4_N3ccc8CC2x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y14E[];
Class_Descriptor cd__ZN3ccc8CC2x7y14E = {  "_ZN3ccc8CC2x7y14E", // class name
  bases__ZN3ccc8CC2x7y14E, 2,
  &(vtc__ZN3ccc8CC2x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x7y15  : ::ccc::AA2 , ::ccc::BB7 {
  ~CC2x7y15(); // tgen
  CC2x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x7y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x7y15 ::~CC2x7y15(){ note_dtor("_ZN3ccc8CC2x7y15E", this);} // tgen
ccc::CC2x7y15 ::CC2x7y15(){ note_ctor("_ZN3ccc8CC2x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x7y15E, buf);
    ::ccc::CC2x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x7y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC2x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x7y15E);
    dp->::ccc::CC2x7y15::~CC2x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x7y15E(Test__ZN3ccc8CC2x7y15E, "_ZN3ccc8CC2x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x7y15C1Ev();
extern void _ZN3ccc8CC2x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x7y15E[] = {
  NSPAIR(_ZN3ccc8CC2x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC2x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x7y15E[];
Class_Descriptor cd__ZN3ccc8CC2x7y15E = {  "_ZN3ccc8CC2x7y15E", // class name
  bases__ZN3ccc8CC2x7y15E, 2,
  &(vtc__ZN3ccc8CC2x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y0  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y03pqrEv
  ~CC2x8y0(); // tgen
  CC2x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y0E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y03abcEv");}
void  ccc::CC2x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y03efgEv");}
void  ccc::CC2x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y03pqrEv");}
ccc::CC2x8y0 ::~CC2x8y0(){ note_dtor("_ZN3ccc7CC2x8y0E", this);} // tgen
ccc::CC2x8y0 ::CC2x8y0(){ note_ctor("_ZN3ccc7CC2x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y0E, buf);
    ::ccc::CC2x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y0E);
    dp->::ccc::CC2x8y0::~CC2x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y0E(Test__ZN3ccc7CC2x8y0E, "_ZN3ccc7CC2x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y0C1Ev();
extern void _ZN3ccc7CC2x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y0E[] = {
  NSPAIR(_ZN3ccc7CC2x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y0E[];
extern void _ZN3ccc7CC2x8y03efgEv();
extern void _ZN3ccc7CC2x8y03abcEv();
extern void _ZN3ccc7CC2x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y03efgEv,_ZThn4_N3ccc7CC2x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y03abcEv,_ZThn4_N3ccc7CC2x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y03efgEv,_ZThn4_N3ccc7CC2x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y03abcEv,_ZThn4_N3ccc7CC2x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y0E[];
Class_Descriptor cd__ZN3ccc7CC2x8y0E = {  "_ZN3ccc7CC2x8y0E", // class name
  bases__ZN3ccc7CC2x8y0E, 2,
  &(vtc__ZN3ccc7CC2x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y1  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x8y13efgEv
  ~CC2x8y1(); // tgen
  CC2x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y1E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y13abcEv");}
void  ccc::CC2x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y13pqrEv");}
void  ccc::CC2x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y13efgEv");}
ccc::CC2x8y1 ::~CC2x8y1(){ note_dtor("_ZN3ccc7CC2x8y1E", this);} // tgen
ccc::CC2x8y1 ::CC2x8y1(){ note_ctor("_ZN3ccc7CC2x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y1E, buf);
    ::ccc::CC2x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y1E);
    dp->::ccc::CC2x8y1::~CC2x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y1E(Test__ZN3ccc7CC2x8y1E, "_ZN3ccc7CC2x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y1C1Ev();
extern void _ZN3ccc7CC2x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y1E[] = {
  NSPAIR(_ZN3ccc7CC2x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y1E[];
extern void _ZN3ccc7CC2x8y13efgEv();
extern void _ZN3ccc7CC2x8y13abcEv();
extern void _ZN3ccc7CC2x8y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y13efgEv,_ZThn4_N3ccc7CC2x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y13abcEv,_ZThn4_N3ccc7CC2x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y13efgEv,_ZThn4_N3ccc7CC2x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y13abcEv,_ZThn4_N3ccc7CC2x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y1E[];
Class_Descriptor cd__ZN3ccc7CC2x8y1E = {  "_ZN3ccc7CC2x8y1E", // class name
  bases__ZN3ccc7CC2x8y1E, 2,
  &(vtc__ZN3ccc7CC2x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y2  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y23pqrEv
  ~CC2x8y2(); // tgen
  CC2x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y2E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y23efgEv");}
void  ccc::CC2x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y23abcEv");}
void  ccc::CC2x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y23pqrEv");}
ccc::CC2x8y2 ::~CC2x8y2(){ note_dtor("_ZN3ccc7CC2x8y2E", this);} // tgen
ccc::CC2x8y2 ::CC2x8y2(){ note_ctor("_ZN3ccc7CC2x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y2E, buf);
    ::ccc::CC2x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y2E);
    dp->::ccc::CC2x8y2::~CC2x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y2E(Test__ZN3ccc7CC2x8y2E, "_ZN3ccc7CC2x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y2C1Ev();
extern void _ZN3ccc7CC2x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y2E[] = {
  NSPAIR(_ZN3ccc7CC2x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y2E[];
extern void _ZN3ccc7CC2x8y23efgEv();
extern void _ZN3ccc7CC2x8y23abcEv();
extern void _ZN3ccc7CC2x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y23efgEv,_ZThn4_N3ccc7CC2x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y23abcEv,_ZThn4_N3ccc7CC2x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y23efgEv,_ZThn4_N3ccc7CC2x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y23abcEv,_ZThn4_N3ccc7CC2x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y2E[];
Class_Descriptor cd__ZN3ccc7CC2x8y2E = {  "_ZN3ccc7CC2x8y2E", // class name
  bases__ZN3ccc7CC2x8y2E, 2,
  &(vtc__ZN3ccc7CC2x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y3  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x8y33abcEv
  ~CC2x8y3(); // tgen
  CC2x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y3E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y33efgEv");}
void  ccc::CC2x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y33pqrEv");}
void  ccc::CC2x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y33abcEv");}
ccc::CC2x8y3 ::~CC2x8y3(){ note_dtor("_ZN3ccc7CC2x8y3E", this);} // tgen
ccc::CC2x8y3 ::CC2x8y3(){ note_ctor("_ZN3ccc7CC2x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y3E, buf);
    ::ccc::CC2x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y3E);
    dp->::ccc::CC2x8y3::~CC2x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y3E(Test__ZN3ccc7CC2x8y3E, "_ZN3ccc7CC2x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y3C1Ev();
extern void _ZN3ccc7CC2x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y3E[] = {
  NSPAIR(_ZN3ccc7CC2x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y3E[];
extern void _ZN3ccc7CC2x8y33efgEv();
extern void _ZN3ccc7CC2x8y33abcEv();
extern void _ZN3ccc7CC2x8y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y33efgEv,_ZThn4_N3ccc7CC2x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y33abcEv,_ZThn4_N3ccc7CC2x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y33efgEv,_ZThn4_N3ccc7CC2x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y33abcEv,_ZThn4_N3ccc7CC2x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y3E[];
Class_Descriptor cd__ZN3ccc7CC2x8y3E = {  "_ZN3ccc7CC2x8y3E", // class name
  bases__ZN3ccc7CC2x8y3E, 2,
  &(vtc__ZN3ccc7CC2x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y4  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC2x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y43efgEv
  ~CC2x8y4(); // tgen
  CC2x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y4E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y43pqrEv");}
void  ccc::CC2x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y43abcEv");}
void  ccc::CC2x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y43efgEv");}
ccc::CC2x8y4 ::~CC2x8y4(){ note_dtor("_ZN3ccc7CC2x8y4E", this);} // tgen
ccc::CC2x8y4 ::CC2x8y4(){ note_ctor("_ZN3ccc7CC2x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y4E, buf);
    ::ccc::CC2x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y4E);
    dp->::ccc::CC2x8y4::~CC2x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y4E(Test__ZN3ccc7CC2x8y4E, "_ZN3ccc7CC2x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y4C1Ev();
extern void _ZN3ccc7CC2x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y4E[] = {
  NSPAIR(_ZN3ccc7CC2x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y4E[];
extern void _ZN3ccc7CC2x8y43efgEv();
extern void _ZN3ccc7CC2x8y43abcEv();
extern void _ZN3ccc7CC2x8y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y43efgEv,_ZThn4_N3ccc7CC2x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y43abcEv,_ZThn4_N3ccc7CC2x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y43efgEv,_ZThn4_N3ccc7CC2x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y43abcEv,_ZThn4_N3ccc7CC2x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y4E[];
Class_Descriptor cd__ZN3ccc7CC2x8y4E = {  "_ZN3ccc7CC2x8y4E", // class name
  bases__ZN3ccc7CC2x8y4E, 2,
  &(vtc__ZN3ccc7CC2x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y5  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC2x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y53abcEv
  ~CC2x8y5(); // tgen
  CC2x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y5E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y53pqrEv");}
void  ccc::CC2x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y53efgEv");}
void  ccc::CC2x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y53abcEv");}
ccc::CC2x8y5 ::~CC2x8y5(){ note_dtor("_ZN3ccc7CC2x8y5E", this);} // tgen
ccc::CC2x8y5 ::CC2x8y5(){ note_ctor("_ZN3ccc7CC2x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y5E, buf);
    ::ccc::CC2x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y5E);
    dp->::ccc::CC2x8y5::~CC2x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y5E(Test__ZN3ccc7CC2x8y5E, "_ZN3ccc7CC2x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y5C1Ev();
extern void _ZN3ccc7CC2x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y5E[] = {
  NSPAIR(_ZN3ccc7CC2x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y5E[];
extern void _ZN3ccc7CC2x8y53efgEv();
extern void _ZN3ccc7CC2x8y53abcEv();
extern void _ZN3ccc7CC2x8y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y53efgEv,_ZThn4_N3ccc7CC2x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y53abcEv,_ZThn4_N3ccc7CC2x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y53efgEv,_ZThn4_N3ccc7CC2x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y53abcEv,_ZThn4_N3ccc7CC2x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y5E[];
Class_Descriptor cd__ZN3ccc7CC2x8y5E = {  "_ZN3ccc7CC2x8y5E", // class name
  bases__ZN3ccc7CC2x8y5E, 2,
  &(vtc__ZN3ccc7CC2x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y6  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x8y63efgEv
  ~CC2x8y6(); // tgen
  CC2x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y6E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y63abcEv");}
void  ccc::CC2x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y63efgEv");}
ccc::CC2x8y6 ::~CC2x8y6(){ note_dtor("_ZN3ccc7CC2x8y6E", this);} // tgen
ccc::CC2x8y6 ::CC2x8y6(){ note_ctor("_ZN3ccc7CC2x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y6E, buf);
    ::ccc::CC2x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y6E);
    dp->::ccc::CC2x8y6::~CC2x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y6E(Test__ZN3ccc7CC2x8y6E, "_ZN3ccc7CC2x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y6C1Ev();
extern void _ZN3ccc7CC2x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y6E[] = {
  NSPAIR(_ZN3ccc7CC2x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y6E[];
extern void _ZN3ccc7CC2x8y63efgEv();
extern void _ZN3ccc7CC2x8y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y63efgEv,_ZThn4_N3ccc7CC2x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y63abcEv,_ZThn4_N3ccc7CC2x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y63efgEv,_ZThn4_N3ccc7CC2x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y63abcEv,_ZThn4_N3ccc7CC2x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y6E[];
Class_Descriptor cd__ZN3ccc7CC2x8y6E = {  "_ZN3ccc7CC2x8y6E", // class name
  bases__ZN3ccc7CC2x8y6E, 2,
  &(vtc__ZN3ccc7CC2x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y7  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC2x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y73pqrEv
  ~CC2x8y7(); // tgen
  CC2x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y7E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y73abcEv");}
void  ccc::CC2x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y73pqrEv");}
ccc::CC2x8y7 ::~CC2x8y7(){ note_dtor("_ZN3ccc7CC2x8y7E", this);} // tgen
ccc::CC2x8y7 ::CC2x8y7(){ note_ctor("_ZN3ccc7CC2x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y7E, buf);
    ::ccc::CC2x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y7E);
    dp->::ccc::CC2x8y7::~CC2x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y7E(Test__ZN3ccc7CC2x8y7E, "_ZN3ccc7CC2x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y7C1Ev();
extern void _ZN3ccc7CC2x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y7E[] = {
  NSPAIR(_ZN3ccc7CC2x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x8y73abcEv();
extern void _ZN3ccc7CC2x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y73abcEv,_ZThn4_N3ccc7CC2x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y73abcEv,_ZThn4_N3ccc7CC2x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y7E[];
Class_Descriptor cd__ZN3ccc7CC2x8y7E = {  "_ZN3ccc7CC2x8y7E", // class name
  bases__ZN3ccc7CC2x8y7E, 2,
  &(vtc__ZN3ccc7CC2x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y8  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x8y83abcEv
  ~CC2x8y8(); // tgen
  CC2x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y8E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y83efgEv");}
void  ccc::CC2x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x8y83abcEv");}
ccc::CC2x8y8 ::~CC2x8y8(){ note_dtor("_ZN3ccc7CC2x8y8E", this);} // tgen
ccc::CC2x8y8 ::CC2x8y8(){ note_ctor("_ZN3ccc7CC2x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y8E, buf);
    ::ccc::CC2x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y8E);
    dp->::ccc::CC2x8y8::~CC2x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y8E(Test__ZN3ccc7CC2x8y8E, "_ZN3ccc7CC2x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y8C1Ev();
extern void _ZN3ccc7CC2x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y8E[] = {
  NSPAIR(_ZN3ccc7CC2x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y8E[];
extern void _ZN3ccc7CC2x8y83efgEv();
extern void _ZN3ccc7CC2x8y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y83efgEv,_ZThn4_N3ccc7CC2x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y83abcEv,_ZThn4_N3ccc7CC2x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y83efgEv,_ZThn4_N3ccc7CC2x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y83abcEv,_ZThn4_N3ccc7CC2x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y8E[];
Class_Descriptor cd__ZN3ccc7CC2x8y8E = {  "_ZN3ccc7CC2x8y8E", // class name
  bases__ZN3ccc7CC2x8y8E, 2,
  &(vtc__ZN3ccc7CC2x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y9  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC2x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x8y93pqrEv
  ~CC2x8y9(); // tgen
  CC2x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x8y9E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x8y93efgEv");}
void  ccc::CC2x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x8y93pqrEv");}
ccc::CC2x8y9 ::~CC2x8y9(){ note_dtor("_ZN3ccc7CC2x8y9E", this);} // tgen
ccc::CC2x8y9 ::CC2x8y9(){ note_ctor("_ZN3ccc7CC2x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x8y9E, buf);
    ::ccc::CC2x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x8y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC2x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x8y9E);
    dp->::ccc::CC2x8y9::~CC2x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x8y9E(Test__ZN3ccc7CC2x8y9E, "_ZN3ccc7CC2x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x8y9C1Ev();
extern void _ZN3ccc7CC2x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x8y9E[] = {
  NSPAIR(_ZN3ccc7CC2x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC2x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y9E[];
extern void _ZN3ccc7CC2x8y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x8y93efgEv,_ZThn4_N3ccc7CC2x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x8y93efgEv,_ZThn4_N3ccc7CC2x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x8y9E[];
Class_Descriptor cd__ZN3ccc7CC2x8y9E = {  "_ZN3ccc7CC2x8y9E", // class name
  bases__ZN3ccc7CC2x8y9E, 2,
  &(vtc__ZN3ccc7CC2x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y10  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x8y103abcEv
  ~CC2x8y10(); // tgen
  CC2x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y10E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y103pqrEv");}
void  ccc::CC2x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x8y103abcEv");}
ccc::CC2x8y10 ::~CC2x8y10(){ note_dtor("_ZN3ccc8CC2x8y10E", this);} // tgen
ccc::CC2x8y10 ::CC2x8y10(){ note_ctor("_ZN3ccc8CC2x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y10E, buf);
    ::ccc::CC2x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y10E);
    dp->::ccc::CC2x8y10::~CC2x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y10E(Test__ZN3ccc8CC2x8y10E, "_ZN3ccc8CC2x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y10C1Ev();
extern void _ZN3ccc8CC2x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y10E[] = {
  NSPAIR(_ZN3ccc8CC2x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x8y103abcEv();
extern void _ZN3ccc8CC2x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y103abcEv,_ZThn4_N3ccc8CC2x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x8y103abcEv,_ZThn4_N3ccc8CC2x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y10E[];
Class_Descriptor cd__ZN3ccc8CC2x8y10E = {  "_ZN3ccc8CC2x8y10E", // class name
  bases__ZN3ccc8CC2x8y10E, 2,
  &(vtc__ZN3ccc8CC2x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y11  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x8y113efgEv
  ~CC2x8y11(); // tgen
  CC2x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y11E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y113pqrEv");}
void  ccc::CC2x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x8y113efgEv");}
ccc::CC2x8y11 ::~CC2x8y11(){ note_dtor("_ZN3ccc8CC2x8y11E", this);} // tgen
ccc::CC2x8y11 ::CC2x8y11(){ note_ctor("_ZN3ccc8CC2x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y11E, buf);
    ::ccc::CC2x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y11E);
    dp->::ccc::CC2x8y11::~CC2x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y11E(Test__ZN3ccc8CC2x8y11E, "_ZN3ccc8CC2x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y11C1Ev();
extern void _ZN3ccc8CC2x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y11E[] = {
  NSPAIR(_ZN3ccc8CC2x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y11E[];
extern void _ZN3ccc8CC2x8y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y113efgEv,_ZThn4_N3ccc8CC2x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x8y113efgEv,_ZThn4_N3ccc8CC2x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y11E[];
Class_Descriptor cd__ZN3ccc8CC2x8y11E = {  "_ZN3ccc8CC2x8y11E", // class name
  bases__ZN3ccc8CC2x8y11E, 2,
  &(vtc__ZN3ccc8CC2x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y12  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC2x8y123abcEv
  ~CC2x8y12(); // tgen
  CC2x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x8y123abcEv");}
ccc::CC2x8y12 ::~CC2x8y12(){ note_dtor("_ZN3ccc8CC2x8y12E", this);} // tgen
ccc::CC2x8y12 ::CC2x8y12(){ note_ctor("_ZN3ccc8CC2x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y12E, buf);
    ::ccc::CC2x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y12E);
    dp->::ccc::CC2x8y12::~CC2x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y12E(Test__ZN3ccc8CC2x8y12E, "_ZN3ccc8CC2x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y12C1Ev();
extern void _ZN3ccc8CC2x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y12E[] = {
  NSPAIR(_ZN3ccc8CC2x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x8y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y123abcEv,_ZThn4_N3ccc8CC2x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x8y123abcEv,_ZThn4_N3ccc8CC2x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y12E[];
Class_Descriptor cd__ZN3ccc8CC2x8y12E = {  "_ZN3ccc8CC2x8y12E", // class name
  bases__ZN3ccc8CC2x8y12E, 2,
  &(vtc__ZN3ccc8CC2x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y13  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC2x8y133efgEv
  ~CC2x8y13(); // tgen
  CC2x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x8y133efgEv");}
ccc::CC2x8y13 ::~CC2x8y13(){ note_dtor("_ZN3ccc8CC2x8y13E", this);} // tgen
ccc::CC2x8y13 ::CC2x8y13(){ note_ctor("_ZN3ccc8CC2x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y13E, buf);
    ::ccc::CC2x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y13E);
    dp->::ccc::CC2x8y13::~CC2x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y13E(Test__ZN3ccc8CC2x8y13E, "_ZN3ccc8CC2x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y13C1Ev();
extern void _ZN3ccc8CC2x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y13E[] = {
  NSPAIR(_ZN3ccc8CC2x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y13E[];
extern void _ZN3ccc8CC2x8y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x8y133efgEv,_ZThn4_N3ccc8CC2x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x8y133efgEv,_ZThn4_N3ccc8CC2x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y13E[];
Class_Descriptor cd__ZN3ccc8CC2x8y13E = {  "_ZN3ccc8CC2x8y13E", // class name
  bases__ZN3ccc8CC2x8y13E, 2,
  &(vtc__ZN3ccc8CC2x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y14  : ::ccc::AA2 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC2x8y143pqrEv
  ~CC2x8y14(); // tgen
  CC2x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x8y143pqrEv");}
ccc::CC2x8y14 ::~CC2x8y14(){ note_dtor("_ZN3ccc8CC2x8y14E", this);} // tgen
ccc::CC2x8y14 ::CC2x8y14(){ note_ctor("_ZN3ccc8CC2x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y14E, buf);
    ::ccc::CC2x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y14E);
    dp->::ccc::CC2x8y14::~CC2x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y14E(Test__ZN3ccc8CC2x8y14E, "_ZN3ccc8CC2x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y14C1Ev();
extern void _ZN3ccc8CC2x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y14E[] = {
  NSPAIR(_ZN3ccc8CC2x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y14E[];
Class_Descriptor cd__ZN3ccc8CC2x8y14E = {  "_ZN3ccc8CC2x8y14E", // class name
  bases__ZN3ccc8CC2x8y14E, 2,
  &(vtc__ZN3ccc8CC2x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x8y15  : ::ccc::AA2 , ::ccc::BB8 {
  ~CC2x8y15(); // tgen
  CC2x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x8y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x8y15 ::~CC2x8y15(){ note_dtor("_ZN3ccc8CC2x8y15E", this);} // tgen
ccc::CC2x8y15 ::CC2x8y15(){ note_ctor("_ZN3ccc8CC2x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x8y15E, buf);
    ::ccc::CC2x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x8y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC2x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x8y15E);
    dp->::ccc::CC2x8y15::~CC2x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x8y15E(Test__ZN3ccc8CC2x8y15E, "_ZN3ccc8CC2x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x8y15C1Ev();
extern void _ZN3ccc8CC2x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x8y15E[] = {
  NSPAIR(_ZN3ccc8CC2x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC2x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x8y15E[];
Class_Descriptor cd__ZN3ccc8CC2x8y15E = {  "_ZN3ccc8CC2x8y15E", // class name
  bases__ZN3ccc8CC2x8y15E, 2,
  &(vtc__ZN3ccc8CC2x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y0  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y03pqrEv
  ~CC2x9y0(); // tgen
  CC2x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y0E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y03abcEv");}
void  ccc::CC2x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y03efgEv");}
void  ccc::CC2x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y03pqrEv");}
ccc::CC2x9y0 ::~CC2x9y0(){ note_dtor("_ZN3ccc7CC2x9y0E", this);} // tgen
ccc::CC2x9y0 ::CC2x9y0(){ note_ctor("_ZN3ccc7CC2x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y0E, buf);
    ::ccc::CC2x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y0E);
    dp->::ccc::CC2x9y0::~CC2x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y0E(Test__ZN3ccc7CC2x9y0E, "_ZN3ccc7CC2x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y0C1Ev();
extern void _ZN3ccc7CC2x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y0E[] = {
  NSPAIR(_ZN3ccc7CC2x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y0E[];
extern void _ZN3ccc7CC2x9y03efgEv();
extern void _ZN3ccc7CC2x9y03abcEv();
extern void _ZN3ccc7CC2x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y03efgEv,_ZThn4_N3ccc7CC2x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y03pqrEv,_ZThn4_N3ccc7CC2x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y03efgEv,_ZThn4_N3ccc7CC2x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y03pqrEv,_ZThn4_N3ccc7CC2x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y0E[];
Class_Descriptor cd__ZN3ccc7CC2x9y0E = {  "_ZN3ccc7CC2x9y0E", // class name
  bases__ZN3ccc7CC2x9y0E, 2,
  &(vtc__ZN3ccc7CC2x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y1  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x9y13efgEv
  ~CC2x9y1(); // tgen
  CC2x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y1E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y13abcEv");}
void  ccc::CC2x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y13pqrEv");}
void  ccc::CC2x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y13efgEv");}
ccc::CC2x9y1 ::~CC2x9y1(){ note_dtor("_ZN3ccc7CC2x9y1E", this);} // tgen
ccc::CC2x9y1 ::CC2x9y1(){ note_ctor("_ZN3ccc7CC2x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y1E, buf);
    ::ccc::CC2x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y1E);
    dp->::ccc::CC2x9y1::~CC2x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y1E(Test__ZN3ccc7CC2x9y1E, "_ZN3ccc7CC2x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y1C1Ev();
extern void _ZN3ccc7CC2x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y1E[] = {
  NSPAIR(_ZN3ccc7CC2x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y1E[];
extern void _ZN3ccc7CC2x9y13efgEv();
extern void _ZN3ccc7CC2x9y13abcEv();
extern void _ZN3ccc7CC2x9y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y13efgEv,_ZThn4_N3ccc7CC2x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y13pqrEv,_ZThn4_N3ccc7CC2x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y13efgEv,_ZThn4_N3ccc7CC2x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y13pqrEv,_ZThn4_N3ccc7CC2x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y1E[];
Class_Descriptor cd__ZN3ccc7CC2x9y1E = {  "_ZN3ccc7CC2x9y1E", // class name
  bases__ZN3ccc7CC2x9y1E, 2,
  &(vtc__ZN3ccc7CC2x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y2  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y23pqrEv
  ~CC2x9y2(); // tgen
  CC2x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y2E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y23efgEv");}
void  ccc::CC2x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y23abcEv");}
void  ccc::CC2x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y23pqrEv");}
ccc::CC2x9y2 ::~CC2x9y2(){ note_dtor("_ZN3ccc7CC2x9y2E", this);} // tgen
ccc::CC2x9y2 ::CC2x9y2(){ note_ctor("_ZN3ccc7CC2x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y2E, buf);
    ::ccc::CC2x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y2E);
    dp->::ccc::CC2x9y2::~CC2x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y2E(Test__ZN3ccc7CC2x9y2E, "_ZN3ccc7CC2x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y2C1Ev();
extern void _ZN3ccc7CC2x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y2E[] = {
  NSPAIR(_ZN3ccc7CC2x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y2E[];
extern void _ZN3ccc7CC2x9y23efgEv();
extern void _ZN3ccc7CC2x9y23abcEv();
extern void _ZN3ccc7CC2x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y23efgEv,_ZThn4_N3ccc7CC2x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y23pqrEv,_ZThn4_N3ccc7CC2x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y23efgEv,_ZThn4_N3ccc7CC2x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y23pqrEv,_ZThn4_N3ccc7CC2x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y2E[];
Class_Descriptor cd__ZN3ccc7CC2x9y2E = {  "_ZN3ccc7CC2x9y2E", // class name
  bases__ZN3ccc7CC2x9y2E, 2,
  &(vtc__ZN3ccc7CC2x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y3  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x9y33abcEv
  ~CC2x9y3(); // tgen
  CC2x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y3E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y33efgEv");}
void  ccc::CC2x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y33pqrEv");}
void  ccc::CC2x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y33abcEv");}
ccc::CC2x9y3 ::~CC2x9y3(){ note_dtor("_ZN3ccc7CC2x9y3E", this);} // tgen
ccc::CC2x9y3 ::CC2x9y3(){ note_ctor("_ZN3ccc7CC2x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y3E, buf);
    ::ccc::CC2x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y3E);
    dp->::ccc::CC2x9y3::~CC2x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y3E(Test__ZN3ccc7CC2x9y3E, "_ZN3ccc7CC2x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y3C1Ev();
extern void _ZN3ccc7CC2x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y3E[] = {
  NSPAIR(_ZN3ccc7CC2x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y3E[];
extern void _ZN3ccc7CC2x9y33efgEv();
extern void _ZN3ccc7CC2x9y33abcEv();
extern void _ZN3ccc7CC2x9y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y33efgEv,_ZThn4_N3ccc7CC2x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y33pqrEv,_ZThn4_N3ccc7CC2x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y33efgEv,_ZThn4_N3ccc7CC2x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y33pqrEv,_ZThn4_N3ccc7CC2x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y3E[];
Class_Descriptor cd__ZN3ccc7CC2x9y3E = {  "_ZN3ccc7CC2x9y3E", // class name
  bases__ZN3ccc7CC2x9y3E, 2,
  &(vtc__ZN3ccc7CC2x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y4  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC2x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC2x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y43efgEv
  ~CC2x9y4(); // tgen
  CC2x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y4E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y43pqrEv");}
void  ccc::CC2x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y43abcEv");}
void  ccc::CC2x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y43efgEv");}
ccc::CC2x9y4 ::~CC2x9y4(){ note_dtor("_ZN3ccc7CC2x9y4E", this);} // tgen
ccc::CC2x9y4 ::CC2x9y4(){ note_ctor("_ZN3ccc7CC2x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y4E, buf);
    ::ccc::CC2x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y4E);
    dp->::ccc::CC2x9y4::~CC2x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y4E(Test__ZN3ccc7CC2x9y4E, "_ZN3ccc7CC2x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y4C1Ev();
extern void _ZN3ccc7CC2x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y4E[] = {
  NSPAIR(_ZN3ccc7CC2x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y4E[];
extern void _ZN3ccc7CC2x9y43efgEv();
extern void _ZN3ccc7CC2x9y43abcEv();
extern void _ZN3ccc7CC2x9y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y43efgEv,_ZThn4_N3ccc7CC2x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y43pqrEv,_ZThn4_N3ccc7CC2x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y43efgEv,_ZThn4_N3ccc7CC2x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y43pqrEv,_ZThn4_N3ccc7CC2x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y4E[];
Class_Descriptor cd__ZN3ccc7CC2x9y4E = {  "_ZN3ccc7CC2x9y4E", // class name
  bases__ZN3ccc7CC2x9y4E, 2,
  &(vtc__ZN3ccc7CC2x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y5  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC2x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC2x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y53abcEv
  ~CC2x9y5(); // tgen
  CC2x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y5E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y53pqrEv");}
void  ccc::CC2x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y53efgEv");}
void  ccc::CC2x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y53abcEv");}
ccc::CC2x9y5 ::~CC2x9y5(){ note_dtor("_ZN3ccc7CC2x9y5E", this);} // tgen
ccc::CC2x9y5 ::CC2x9y5(){ note_ctor("_ZN3ccc7CC2x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y5E, buf);
    ::ccc::CC2x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y5E);
    dp->::ccc::CC2x9y5::~CC2x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y5E(Test__ZN3ccc7CC2x9y5E, "_ZN3ccc7CC2x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y5C1Ev();
extern void _ZN3ccc7CC2x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y5E[] = {
  NSPAIR(_ZN3ccc7CC2x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y5E[];
extern void _ZN3ccc7CC2x9y53efgEv();
extern void _ZN3ccc7CC2x9y53abcEv();
extern void _ZN3ccc7CC2x9y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y53efgEv,_ZThn4_N3ccc7CC2x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y53pqrEv,_ZThn4_N3ccc7CC2x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y53efgEv,_ZThn4_N3ccc7CC2x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y53pqrEv,_ZThn4_N3ccc7CC2x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y5E[];
Class_Descriptor cd__ZN3ccc7CC2x9y5E = {  "_ZN3ccc7CC2x9y5E", // class name
  bases__ZN3ccc7CC2x9y5E, 2,
  &(vtc__ZN3ccc7CC2x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y6  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC2x9y63efgEv
  ~CC2x9y6(); // tgen
  CC2x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y6E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y63abcEv");}
void  ccc::CC2x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y63efgEv");}
ccc::CC2x9y6 ::~CC2x9y6(){ note_dtor("_ZN3ccc7CC2x9y6E", this);} // tgen
ccc::CC2x9y6 ::CC2x9y6(){ note_ctor("_ZN3ccc7CC2x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y6E, buf);
    ::ccc::CC2x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y6E);
    dp->::ccc::CC2x9y6::~CC2x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y6E(Test__ZN3ccc7CC2x9y6E, "_ZN3ccc7CC2x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y6C1Ev();
extern void _ZN3ccc7CC2x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y6E[] = {
  NSPAIR(_ZN3ccc7CC2x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y6E[];
extern void _ZN3ccc7CC2x9y63efgEv();
extern void _ZN3ccc7CC2x9y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y63efgEv,_ZThn4_N3ccc7CC2x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y63efgEv,_ZThn4_N3ccc7CC2x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y6E[];
Class_Descriptor cd__ZN3ccc7CC2x9y6E = {  "_ZN3ccc7CC2x9y6E", // class name
  bases__ZN3ccc7CC2x9y6E, 2,
  &(vtc__ZN3ccc7CC2x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y7  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC2x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y73pqrEv
  ~CC2x9y7(); // tgen
  CC2x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y7E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y73abcEv");}
void  ccc::CC2x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y73pqrEv");}
ccc::CC2x9y7 ::~CC2x9y7(){ note_dtor("_ZN3ccc7CC2x9y7E", this);} // tgen
ccc::CC2x9y7 ::CC2x9y7(){ note_ctor("_ZN3ccc7CC2x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y7E, buf);
    ::ccc::CC2x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y7E);
    dp->::ccc::CC2x9y7::~CC2x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y7E(Test__ZN3ccc7CC2x9y7E, "_ZN3ccc7CC2x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y7C1Ev();
extern void _ZN3ccc7CC2x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y7E[] = {
  NSPAIR(_ZN3ccc7CC2x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc7CC2x9y73abcEv();
extern void _ZN3ccc7CC2x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y73pqrEv,_ZThn4_N3ccc7CC2x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y73pqrEv,_ZThn4_N3ccc7CC2x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y7E[];
Class_Descriptor cd__ZN3ccc7CC2x9y7E = {  "_ZN3ccc7CC2x9y7E", // class name
  bases__ZN3ccc7CC2x9y7E, 2,
  &(vtc__ZN3ccc7CC2x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y8  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC2x9y83abcEv
  ~CC2x9y8(); // tgen
  CC2x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y8E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y83efgEv");}
void  ccc::CC2x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC2x9y83abcEv");}
ccc::CC2x9y8 ::~CC2x9y8(){ note_dtor("_ZN3ccc7CC2x9y8E", this);} // tgen
ccc::CC2x9y8 ::CC2x9y8(){ note_ctor("_ZN3ccc7CC2x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y8E, buf);
    ::ccc::CC2x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y8E);
    dp->::ccc::CC2x9y8::~CC2x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y8E(Test__ZN3ccc7CC2x9y8E, "_ZN3ccc7CC2x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y8C1Ev();
extern void _ZN3ccc7CC2x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y8E[] = {
  NSPAIR(_ZN3ccc7CC2x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y8E[];
extern void _ZN3ccc7CC2x9y83efgEv();
extern void _ZN3ccc7CC2x9y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y83efgEv,_ZThn4_N3ccc7CC2x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y83efgEv,_ZThn4_N3ccc7CC2x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y8E[];
Class_Descriptor cd__ZN3ccc7CC2x9y8E = {  "_ZN3ccc7CC2x9y8E", // class name
  bases__ZN3ccc7CC2x9y8E, 2,
  &(vtc__ZN3ccc7CC2x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y9  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC2x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC2x9y93pqrEv
  ~CC2x9y9(); // tgen
  CC2x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC2x9y9E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC2x9y93efgEv");}
void  ccc::CC2x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC2x9y93pqrEv");}
ccc::CC2x9y9 ::~CC2x9y9(){ note_dtor("_ZN3ccc7CC2x9y9E", this);} // tgen
ccc::CC2x9y9 ::CC2x9y9(){ note_ctor("_ZN3ccc7CC2x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC2x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC2x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC2x9y9E, buf);
    ::ccc::CC2x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC2x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC2x9y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc7CC2x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC2x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC2x9y9E);
    dp->::ccc::CC2x9y9::~CC2x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC2x9y9E(Test__ZN3ccc7CC2x9y9E, "_ZN3ccc7CC2x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC2x9y9C1Ev();
extern void _ZN3ccc7CC2x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC2x9y9E[] = {
  NSPAIR(_ZN3ccc7CC2x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC2x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC2x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y9E[];
extern void _ZN3ccc7CC2x9y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc7CC2x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y93efgEv,_ZThn4_N3ccc7CC2x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC2x9y93pqrEv,_ZThn4_N3ccc7CC2x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC2x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC2x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC2x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y93efgEv,_ZThn4_N3ccc7CC2x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC2x9y93pqrEv,_ZThn4_N3ccc7CC2x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC2x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC2x9y9E[];
Class_Descriptor cd__ZN3ccc7CC2x9y9E = {  "_ZN3ccc7CC2x9y9E", // class name
  bases__ZN3ccc7CC2x9y9E, 2,
  &(vtc__ZN3ccc7CC2x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC2x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC2x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y10  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x9y103abcEv
  ~CC2x9y10(); // tgen
  CC2x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y10E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y103pqrEv");}
void  ccc::CC2x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x9y103abcEv");}
ccc::CC2x9y10 ::~CC2x9y10(){ note_dtor("_ZN3ccc8CC2x9y10E", this);} // tgen
ccc::CC2x9y10 ::CC2x9y10(){ note_ctor("_ZN3ccc8CC2x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y10E, buf);
    ::ccc::CC2x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y10E);
    dp->::ccc::CC2x9y10::~CC2x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y10E(Test__ZN3ccc8CC2x9y10E, "_ZN3ccc8CC2x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y10C1Ev();
extern void _ZN3ccc8CC2x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y10E[] = {
  NSPAIR(_ZN3ccc8CC2x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x9y103abcEv();
extern void _ZN3ccc8CC2x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y103pqrEv,_ZThn4_N3ccc8CC2x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x9y103pqrEv,_ZThn4_N3ccc8CC2x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y10E[];
Class_Descriptor cd__ZN3ccc8CC2x9y10E = {  "_ZN3ccc8CC2x9y10E", // class name
  bases__ZN3ccc8CC2x9y10E, 2,
  &(vtc__ZN3ccc8CC2x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y11  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x9y113efgEv
  ~CC2x9y11(); // tgen
  CC2x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y11E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y113pqrEv");}
void  ccc::CC2x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x9y113efgEv");}
ccc::CC2x9y11 ::~CC2x9y11(){ note_dtor("_ZN3ccc8CC2x9y11E", this);} // tgen
ccc::CC2x9y11 ::CC2x9y11(){ note_ctor("_ZN3ccc8CC2x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y11E, buf);
    ::ccc::CC2x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y11E);
    dp->::ccc::CC2x9y11::~CC2x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y11E(Test__ZN3ccc8CC2x9y11E, "_ZN3ccc8CC2x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y11C1Ev();
extern void _ZN3ccc8CC2x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y11E[] = {
  NSPAIR(_ZN3ccc8CC2x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y11E[];
extern void _ZN3ccc8CC2x9y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y113efgEv,_ZThn4_N3ccc8CC2x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y113pqrEv,_ZThn4_N3ccc8CC2x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x9y113efgEv,_ZThn4_N3ccc8CC2x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x9y113pqrEv,_ZThn4_N3ccc8CC2x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y11E[];
Class_Descriptor cd__ZN3ccc8CC2x9y11E = {  "_ZN3ccc8CC2x9y11E", // class name
  bases__ZN3ccc8CC2x9y11E, 2,
  &(vtc__ZN3ccc8CC2x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y12  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC2x9y123abcEv
  ~CC2x9y12(); // tgen
  CC2x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x9y123abcEv");}
ccc::CC2x9y12 ::~CC2x9y12(){ note_dtor("_ZN3ccc8CC2x9y12E", this);} // tgen
ccc::CC2x9y12 ::CC2x9y12(){ note_ctor("_ZN3ccc8CC2x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y12E, buf);
    ::ccc::CC2x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y12E);
    dp->::ccc::CC2x9y12::~CC2x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y12E(Test__ZN3ccc8CC2x9y12E, "_ZN3ccc8CC2x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y12C1Ev();
extern void _ZN3ccc8CC2x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y12E[] = {
  NSPAIR(_ZN3ccc8CC2x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x9y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y12E[];
Class_Descriptor cd__ZN3ccc8CC2x9y12E = {  "_ZN3ccc8CC2x9y12E", // class name
  bases__ZN3ccc8CC2x9y12E, 2,
  &(vtc__ZN3ccc8CC2x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y13  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC2x9y133efgEv
  ~CC2x9y13(); // tgen
  CC2x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x9y133efgEv");}
ccc::CC2x9y13 ::~CC2x9y13(){ note_dtor("_ZN3ccc8CC2x9y13E", this);} // tgen
ccc::CC2x9y13 ::CC2x9y13(){ note_ctor("_ZN3ccc8CC2x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y13E, buf);
    ::ccc::CC2x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y13E);
    dp->::ccc::CC2x9y13::~CC2x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y13E(Test__ZN3ccc8CC2x9y13E, "_ZN3ccc8CC2x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y13C1Ev();
extern void _ZN3ccc8CC2x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y13E[] = {
  NSPAIR(_ZN3ccc8CC2x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y13E[];
extern void _ZN3ccc8CC2x9y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y133efgEv,_ZThn4_N3ccc8CC2x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x9y133efgEv,_ZThn4_N3ccc8CC2x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y13E[];
Class_Descriptor cd__ZN3ccc8CC2x9y13E = {  "_ZN3ccc8CC2x9y13E", // class name
  bases__ZN3ccc8CC2x9y13E, 2,
  &(vtc__ZN3ccc8CC2x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y14  : ::ccc::AA2 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC2x9y143pqrEv
  ~CC2x9y14(); // tgen
  CC2x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y14E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x9y143pqrEv");}
ccc::CC2x9y14 ::~CC2x9y14(){ note_dtor("_ZN3ccc8CC2x9y14E", this);} // tgen
ccc::CC2x9y14 ::CC2x9y14(){ note_ctor("_ZN3ccc8CC2x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y14E, buf);
    ::ccc::CC2x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y14E);
    dp->::ccc::CC2x9y14::~CC2x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y14E(Test__ZN3ccc8CC2x9y14E, "_ZN3ccc8CC2x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y14C1Ev();
extern void _ZN3ccc8CC2x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y14E[] = {
  NSPAIR(_ZN3ccc8CC2x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x9y143pqrEv,_ZThn4_N3ccc8CC2x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x9y143pqrEv,_ZThn4_N3ccc8CC2x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y14E[];
Class_Descriptor cd__ZN3ccc8CC2x9y14E = {  "_ZN3ccc8CC2x9y14E", // class name
  bases__ZN3ccc8CC2x9y14E, 2,
  &(vtc__ZN3ccc8CC2x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x9y15  : ::ccc::AA2 , ::ccc::BB9 {
  ~CC2x9y15(); // tgen
  CC2x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC2x9y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x9y15 ::~CC2x9y15(){ note_dtor("_ZN3ccc8CC2x9y15E", this);} // tgen
ccc::CC2x9y15 ::CC2x9y15(){ note_ctor("_ZN3ccc8CC2x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC2x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x9y15E, buf);
    ::ccc::CC2x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x9y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC2x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x9y15E);
    dp->::ccc::CC2x9y15::~CC2x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x9y15E(Test__ZN3ccc8CC2x9y15E, "_ZN3ccc8CC2x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x9y15C1Ev();
extern void _ZN3ccc8CC2x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC2x9y15E[] = {
  NSPAIR(_ZN3ccc8CC2x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC2x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC2x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x9y15E[];
Class_Descriptor cd__ZN3ccc8CC2x9y15E = {  "_ZN3ccc8CC2x9y15E", // class name
  bases__ZN3ccc8CC2x9y15E, 2,
  &(vtc__ZN3ccc8CC2x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y0  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y03pqrEv
  ~CC2x10y0(); // tgen
  CC2x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y0E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y03abcEv");}
void  ccc::CC2x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y03efgEv");}
void  ccc::CC2x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y03pqrEv");}
ccc::CC2x10y0 ::~CC2x10y0(){ note_dtor("_ZN3ccc8CC2x10y0E", this);} // tgen
ccc::CC2x10y0 ::CC2x10y0(){ note_ctor("_ZN3ccc8CC2x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y0E, buf);
    ::ccc::CC2x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y0E);
    dp->::ccc::CC2x10y0::~CC2x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y0E(Test__ZN3ccc8CC2x10y0E, "_ZN3ccc8CC2x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y0C1Ev();
extern void _ZN3ccc8CC2x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y0E[] = {
  NSPAIR(_ZN3ccc8CC2x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y0E[];
extern void _ZN3ccc8CC2x10y03efgEv();
extern void _ZN3ccc8CC2x10y03abcEv();
extern void _ZN3ccc8CC2x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y03pqrEv,_ZThn4_N3ccc8CC2x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y03abcEv,_ZThn4_N3ccc8CC2x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y03pqrEv,_ZThn4_N3ccc8CC2x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y03abcEv,_ZThn4_N3ccc8CC2x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y0E[];
Class_Descriptor cd__ZN3ccc8CC2x10y0E = {  "_ZN3ccc8CC2x10y0E", // class name
  bases__ZN3ccc8CC2x10y0E, 2,
  &(vtc__ZN3ccc8CC2x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y1  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x10y13efgEv
  ~CC2x10y1(); // tgen
  CC2x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y1E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y13abcEv");}
void  ccc::CC2x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y13pqrEv");}
void  ccc::CC2x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y13efgEv");}
ccc::CC2x10y1 ::~CC2x10y1(){ note_dtor("_ZN3ccc8CC2x10y1E", this);} // tgen
ccc::CC2x10y1 ::CC2x10y1(){ note_ctor("_ZN3ccc8CC2x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y1E, buf);
    ::ccc::CC2x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y1E);
    dp->::ccc::CC2x10y1::~CC2x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y1E(Test__ZN3ccc8CC2x10y1E, "_ZN3ccc8CC2x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y1C1Ev();
extern void _ZN3ccc8CC2x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y1E[] = {
  NSPAIR(_ZN3ccc8CC2x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y1E[];
extern void _ZN3ccc8CC2x10y13efgEv();
extern void _ZN3ccc8CC2x10y13abcEv();
extern void _ZN3ccc8CC2x10y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y13pqrEv,_ZThn4_N3ccc8CC2x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y13abcEv,_ZThn4_N3ccc8CC2x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y13pqrEv,_ZThn4_N3ccc8CC2x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y13abcEv,_ZThn4_N3ccc8CC2x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y1E[];
Class_Descriptor cd__ZN3ccc8CC2x10y1E = {  "_ZN3ccc8CC2x10y1E", // class name
  bases__ZN3ccc8CC2x10y1E, 2,
  &(vtc__ZN3ccc8CC2x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y2  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y23pqrEv
  ~CC2x10y2(); // tgen
  CC2x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y2E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y23efgEv");}
void  ccc::CC2x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y23abcEv");}
void  ccc::CC2x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y23pqrEv");}
ccc::CC2x10y2 ::~CC2x10y2(){ note_dtor("_ZN3ccc8CC2x10y2E", this);} // tgen
ccc::CC2x10y2 ::CC2x10y2(){ note_ctor("_ZN3ccc8CC2x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y2E, buf);
    ::ccc::CC2x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y2E);
    dp->::ccc::CC2x10y2::~CC2x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y2E(Test__ZN3ccc8CC2x10y2E, "_ZN3ccc8CC2x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y2C1Ev();
extern void _ZN3ccc8CC2x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y2E[] = {
  NSPAIR(_ZN3ccc8CC2x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y2E[];
extern void _ZN3ccc8CC2x10y23efgEv();
extern void _ZN3ccc8CC2x10y23abcEv();
extern void _ZN3ccc8CC2x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y23pqrEv,_ZThn4_N3ccc8CC2x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y23abcEv,_ZThn4_N3ccc8CC2x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y23pqrEv,_ZThn4_N3ccc8CC2x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y23abcEv,_ZThn4_N3ccc8CC2x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y2E[];
Class_Descriptor cd__ZN3ccc8CC2x10y2E = {  "_ZN3ccc8CC2x10y2E", // class name
  bases__ZN3ccc8CC2x10y2E, 2,
  &(vtc__ZN3ccc8CC2x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y3  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x10y33abcEv
  ~CC2x10y3(); // tgen
  CC2x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y3E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y33efgEv");}
void  ccc::CC2x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y33pqrEv");}
void  ccc::CC2x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y33abcEv");}
ccc::CC2x10y3 ::~CC2x10y3(){ note_dtor("_ZN3ccc8CC2x10y3E", this);} // tgen
ccc::CC2x10y3 ::CC2x10y3(){ note_ctor("_ZN3ccc8CC2x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y3E, buf);
    ::ccc::CC2x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y3E);
    dp->::ccc::CC2x10y3::~CC2x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y3E(Test__ZN3ccc8CC2x10y3E, "_ZN3ccc8CC2x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y3C1Ev();
extern void _ZN3ccc8CC2x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y3E[] = {
  NSPAIR(_ZN3ccc8CC2x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y3E[];
extern void _ZN3ccc8CC2x10y33efgEv();
extern void _ZN3ccc8CC2x10y33abcEv();
extern void _ZN3ccc8CC2x10y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y33pqrEv,_ZThn4_N3ccc8CC2x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y33abcEv,_ZThn4_N3ccc8CC2x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y33pqrEv,_ZThn4_N3ccc8CC2x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y33abcEv,_ZThn4_N3ccc8CC2x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y3E[];
Class_Descriptor cd__ZN3ccc8CC2x10y3E = {  "_ZN3ccc8CC2x10y3E", // class name
  bases__ZN3ccc8CC2x10y3E, 2,
  &(vtc__ZN3ccc8CC2x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y4  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC2x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y43efgEv
  ~CC2x10y4(); // tgen
  CC2x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y4E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y43pqrEv");}
void  ccc::CC2x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y43abcEv");}
void  ccc::CC2x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y43efgEv");}
ccc::CC2x10y4 ::~CC2x10y4(){ note_dtor("_ZN3ccc8CC2x10y4E", this);} // tgen
ccc::CC2x10y4 ::CC2x10y4(){ note_ctor("_ZN3ccc8CC2x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y4E, buf);
    ::ccc::CC2x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y4E);
    dp->::ccc::CC2x10y4::~CC2x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y4E(Test__ZN3ccc8CC2x10y4E, "_ZN3ccc8CC2x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y4C1Ev();
extern void _ZN3ccc8CC2x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y4E[] = {
  NSPAIR(_ZN3ccc8CC2x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y4E[];
extern void _ZN3ccc8CC2x10y43efgEv();
extern void _ZN3ccc8CC2x10y43abcEv();
extern void _ZN3ccc8CC2x10y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y43pqrEv,_ZThn4_N3ccc8CC2x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y43abcEv,_ZThn4_N3ccc8CC2x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y43pqrEv,_ZThn4_N3ccc8CC2x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y43abcEv,_ZThn4_N3ccc8CC2x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y4E[];
Class_Descriptor cd__ZN3ccc8CC2x10y4E = {  "_ZN3ccc8CC2x10y4E", // class name
  bases__ZN3ccc8CC2x10y4E, 2,
  &(vtc__ZN3ccc8CC2x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y5  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC2x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y53abcEv
  ~CC2x10y5(); // tgen
  CC2x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y5E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y53pqrEv");}
void  ccc::CC2x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y53efgEv");}
void  ccc::CC2x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y53abcEv");}
ccc::CC2x10y5 ::~CC2x10y5(){ note_dtor("_ZN3ccc8CC2x10y5E", this);} // tgen
ccc::CC2x10y5 ::CC2x10y5(){ note_ctor("_ZN3ccc8CC2x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y5E, buf);
    ::ccc::CC2x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y5E);
    dp->::ccc::CC2x10y5::~CC2x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y5E(Test__ZN3ccc8CC2x10y5E, "_ZN3ccc8CC2x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y5C1Ev();
extern void _ZN3ccc8CC2x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y5E[] = {
  NSPAIR(_ZN3ccc8CC2x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y5E[];
extern void _ZN3ccc8CC2x10y53efgEv();
extern void _ZN3ccc8CC2x10y53abcEv();
extern void _ZN3ccc8CC2x10y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y53pqrEv,_ZThn4_N3ccc8CC2x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y53abcEv,_ZThn4_N3ccc8CC2x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y53pqrEv,_ZThn4_N3ccc8CC2x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y53abcEv,_ZThn4_N3ccc8CC2x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y5E[];
Class_Descriptor cd__ZN3ccc8CC2x10y5E = {  "_ZN3ccc8CC2x10y5E", // class name
  bases__ZN3ccc8CC2x10y5E, 2,
  &(vtc__ZN3ccc8CC2x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y6  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x10y63efgEv
  ~CC2x10y6(); // tgen
  CC2x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y6E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y63abcEv");}
void  ccc::CC2x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y63efgEv");}
ccc::CC2x10y6 ::~CC2x10y6(){ note_dtor("_ZN3ccc8CC2x10y6E", this);} // tgen
ccc::CC2x10y6 ::CC2x10y6(){ note_ctor("_ZN3ccc8CC2x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y6E, buf);
    ::ccc::CC2x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y6E);
    dp->::ccc::CC2x10y6::~CC2x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y6E(Test__ZN3ccc8CC2x10y6E, "_ZN3ccc8CC2x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y6C1Ev();
extern void _ZN3ccc8CC2x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y6E[] = {
  NSPAIR(_ZN3ccc8CC2x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y6E[];
extern void _ZN3ccc8CC2x10y63efgEv();
extern void _ZN3ccc8CC2x10y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y63abcEv,_ZThn4_N3ccc8CC2x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y63abcEv,_ZThn4_N3ccc8CC2x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y6E[];
Class_Descriptor cd__ZN3ccc8CC2x10y6E = {  "_ZN3ccc8CC2x10y6E", // class name
  bases__ZN3ccc8CC2x10y6E, 2,
  &(vtc__ZN3ccc8CC2x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y7  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC2x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y73pqrEv
  ~CC2x10y7(); // tgen
  CC2x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y7E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y73abcEv");}
void  ccc::CC2x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y73pqrEv");}
ccc::CC2x10y7 ::~CC2x10y7(){ note_dtor("_ZN3ccc8CC2x10y7E", this);} // tgen
ccc::CC2x10y7 ::CC2x10y7(){ note_ctor("_ZN3ccc8CC2x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y7E, buf);
    ::ccc::CC2x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y7E);
    dp->::ccc::CC2x10y7::~CC2x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y7E(Test__ZN3ccc8CC2x10y7E, "_ZN3ccc8CC2x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y7C1Ev();
extern void _ZN3ccc8CC2x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y7E[] = {
  NSPAIR(_ZN3ccc8CC2x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x10y73abcEv();
extern void _ZN3ccc8CC2x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y73pqrEv,_ZThn4_N3ccc8CC2x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y73abcEv,_ZThn4_N3ccc8CC2x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y73pqrEv,_ZThn4_N3ccc8CC2x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y73abcEv,_ZThn4_N3ccc8CC2x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y7E[];
Class_Descriptor cd__ZN3ccc8CC2x10y7E = {  "_ZN3ccc8CC2x10y7E", // class name
  bases__ZN3ccc8CC2x10y7E, 2,
  &(vtc__ZN3ccc8CC2x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y8  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x10y83abcEv
  ~CC2x10y8(); // tgen
  CC2x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y8E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y83efgEv");}
void  ccc::CC2x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x10y83abcEv");}
ccc::CC2x10y8 ::~CC2x10y8(){ note_dtor("_ZN3ccc8CC2x10y8E", this);} // tgen
ccc::CC2x10y8 ::CC2x10y8(){ note_ctor("_ZN3ccc8CC2x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y8E, buf);
    ::ccc::CC2x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y8E);
    dp->::ccc::CC2x10y8::~CC2x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y8E(Test__ZN3ccc8CC2x10y8E, "_ZN3ccc8CC2x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y8C1Ev();
extern void _ZN3ccc8CC2x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y8E[] = {
  NSPAIR(_ZN3ccc8CC2x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y8E[];
extern void _ZN3ccc8CC2x10y83efgEv();
extern void _ZN3ccc8CC2x10y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y83abcEv,_ZThn4_N3ccc8CC2x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y83abcEv,_ZThn4_N3ccc8CC2x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y8E[];
Class_Descriptor cd__ZN3ccc8CC2x10y8E = {  "_ZN3ccc8CC2x10y8E", // class name
  bases__ZN3ccc8CC2x10y8E, 2,
  &(vtc__ZN3ccc8CC2x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y9  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC2x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x10y93pqrEv
  ~CC2x10y9(); // tgen
  CC2x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x10y9E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x10y93efgEv");}
void  ccc::CC2x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x10y93pqrEv");}
ccc::CC2x10y9 ::~CC2x10y9(){ note_dtor("_ZN3ccc8CC2x10y9E", this);} // tgen
ccc::CC2x10y9 ::CC2x10y9(){ note_ctor("_ZN3ccc8CC2x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x10y9E, buf);
    ::ccc::CC2x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x10y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC2x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x10y9E);
    dp->::ccc::CC2x10y9::~CC2x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x10y9E(Test__ZN3ccc8CC2x10y9E, "_ZN3ccc8CC2x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x10y9C1Ev();
extern void _ZN3ccc8CC2x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x10y9E[] = {
  NSPAIR(_ZN3ccc8CC2x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC2x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y9E[];
extern void _ZN3ccc8CC2x10y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x10y93pqrEv,_ZThn4_N3ccc8CC2x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x10y93pqrEv,_ZThn4_N3ccc8CC2x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x10y9E[];
Class_Descriptor cd__ZN3ccc8CC2x10y9E = {  "_ZN3ccc8CC2x10y9E", // class name
  bases__ZN3ccc8CC2x10y9E, 2,
  &(vtc__ZN3ccc8CC2x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y10  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x10y103abcEv
  ~CC2x10y10(); // tgen
  CC2x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y10E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y103pqrEv");}
void  ccc::CC2x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x10y103abcEv");}
ccc::CC2x10y10 ::~CC2x10y10(){ note_dtor("_ZN3ccc9CC2x10y10E", this);} // tgen
ccc::CC2x10y10 ::CC2x10y10(){ note_ctor("_ZN3ccc9CC2x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y10E, buf);
    ::ccc::CC2x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y10E);
    dp->::ccc::CC2x10y10::~CC2x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y10E(Test__ZN3ccc9CC2x10y10E, "_ZN3ccc9CC2x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y10C1Ev();
extern void _ZN3ccc9CC2x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y10E[] = {
  NSPAIR(_ZN3ccc9CC2x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x10y103abcEv();
extern void _ZN3ccc9CC2x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y103pqrEv,_ZThn4_N3ccc9CC2x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y103abcEv,_ZThn4_N3ccc9CC2x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x10y103pqrEv,_ZThn4_N3ccc9CC2x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x10y103abcEv,_ZThn4_N3ccc9CC2x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y10E[];
Class_Descriptor cd__ZN3ccc9CC2x10y10E = {  "_ZN3ccc9CC2x10y10E", // class name
  bases__ZN3ccc9CC2x10y10E, 2,
  &(vtc__ZN3ccc9CC2x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y11  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x10y113efgEv
  ~CC2x10y11(); // tgen
  CC2x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y11E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y113pqrEv");}
void  ccc::CC2x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x10y113efgEv");}
ccc::CC2x10y11 ::~CC2x10y11(){ note_dtor("_ZN3ccc9CC2x10y11E", this);} // tgen
ccc::CC2x10y11 ::CC2x10y11(){ note_ctor("_ZN3ccc9CC2x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y11E, buf);
    ::ccc::CC2x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y11E);
    dp->::ccc::CC2x10y11::~CC2x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y11E(Test__ZN3ccc9CC2x10y11E, "_ZN3ccc9CC2x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y11C1Ev();
extern void _ZN3ccc9CC2x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y11E[] = {
  NSPAIR(_ZN3ccc9CC2x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y11E[];
extern void _ZN3ccc9CC2x10y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y113pqrEv,_ZThn4_N3ccc9CC2x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x10y113pqrEv,_ZThn4_N3ccc9CC2x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y11E[];
Class_Descriptor cd__ZN3ccc9CC2x10y11E = {  "_ZN3ccc9CC2x10y11E", // class name
  bases__ZN3ccc9CC2x10y11E, 2,
  &(vtc__ZN3ccc9CC2x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y12  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC2x10y123abcEv
  ~CC2x10y12(); // tgen
  CC2x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x10y123abcEv");}
ccc::CC2x10y12 ::~CC2x10y12(){ note_dtor("_ZN3ccc9CC2x10y12E", this);} // tgen
ccc::CC2x10y12 ::CC2x10y12(){ note_ctor("_ZN3ccc9CC2x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y12E, buf);
    ::ccc::CC2x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y12E);
    dp->::ccc::CC2x10y12::~CC2x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y12E(Test__ZN3ccc9CC2x10y12E, "_ZN3ccc9CC2x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y12C1Ev();
extern void _ZN3ccc9CC2x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y12E[] = {
  NSPAIR(_ZN3ccc9CC2x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x10y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y123abcEv,_ZThn4_N3ccc9CC2x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x10y123abcEv,_ZThn4_N3ccc9CC2x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y12E[];
Class_Descriptor cd__ZN3ccc9CC2x10y12E = {  "_ZN3ccc9CC2x10y12E", // class name
  bases__ZN3ccc9CC2x10y12E, 2,
  &(vtc__ZN3ccc9CC2x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y13  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC2x10y133efgEv
  ~CC2x10y13(); // tgen
  CC2x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x10y133efgEv");}
ccc::CC2x10y13 ::~CC2x10y13(){ note_dtor("_ZN3ccc9CC2x10y13E", this);} // tgen
ccc::CC2x10y13 ::CC2x10y13(){ note_ctor("_ZN3ccc9CC2x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y13E, buf);
    ::ccc::CC2x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y13E);
    dp->::ccc::CC2x10y13::~CC2x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y13E(Test__ZN3ccc9CC2x10y13E, "_ZN3ccc9CC2x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y13C1Ev();
extern void _ZN3ccc9CC2x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y13E[] = {
  NSPAIR(_ZN3ccc9CC2x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y13E[];
extern void _ZN3ccc9CC2x10y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y13E[];
Class_Descriptor cd__ZN3ccc9CC2x10y13E = {  "_ZN3ccc9CC2x10y13E", // class name
  bases__ZN3ccc9CC2x10y13E, 2,
  &(vtc__ZN3ccc9CC2x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y14  : ::ccc::AA2 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC2x10y143pqrEv
  ~CC2x10y14(); // tgen
  CC2x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x10y143pqrEv");}
ccc::CC2x10y14 ::~CC2x10y14(){ note_dtor("_ZN3ccc9CC2x10y14E", this);} // tgen
ccc::CC2x10y14 ::CC2x10y14(){ note_ctor("_ZN3ccc9CC2x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y14E, buf);
    ::ccc::CC2x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y14E);
    dp->::ccc::CC2x10y14::~CC2x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y14E(Test__ZN3ccc9CC2x10y14E, "_ZN3ccc9CC2x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y14C1Ev();
extern void _ZN3ccc9CC2x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y14E[] = {
  NSPAIR(_ZN3ccc9CC2x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x10y143pqrEv,_ZThn4_N3ccc9CC2x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x10y143pqrEv,_ZThn4_N3ccc9CC2x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y14E[];
Class_Descriptor cd__ZN3ccc9CC2x10y14E = {  "_ZN3ccc9CC2x10y14E", // class name
  bases__ZN3ccc9CC2x10y14E, 2,
  &(vtc__ZN3ccc9CC2x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x10y15  : ::ccc::AA2 , ::ccc::BB10 {
  ~CC2x10y15(); // tgen
  CC2x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x10y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x10y15 ::~CC2x10y15(){ note_dtor("_ZN3ccc9CC2x10y15E", this);} // tgen
ccc::CC2x10y15 ::CC2x10y15(){ note_ctor("_ZN3ccc9CC2x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x10y15E, buf);
    ::ccc::CC2x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x10y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC2x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x10y15E);
    dp->::ccc::CC2x10y15::~CC2x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x10y15E(Test__ZN3ccc9CC2x10y15E, "_ZN3ccc9CC2x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x10y15C1Ev();
extern void _ZN3ccc9CC2x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x10y15E[] = {
  NSPAIR(_ZN3ccc9CC2x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC2x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x10y15E[];
Class_Descriptor cd__ZN3ccc9CC2x10y15E = {  "_ZN3ccc9CC2x10y15E", // class name
  bases__ZN3ccc9CC2x10y15E, 2,
  &(vtc__ZN3ccc9CC2x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y0  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y03pqrEv
  ~CC2x11y0(); // tgen
  CC2x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y0E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y03abcEv");}
void  ccc::CC2x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y03efgEv");}
void  ccc::CC2x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y03pqrEv");}
ccc::CC2x11y0 ::~CC2x11y0(){ note_dtor("_ZN3ccc8CC2x11y0E", this);} // tgen
ccc::CC2x11y0 ::CC2x11y0(){ note_ctor("_ZN3ccc8CC2x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y0E, buf);
    ::ccc::CC2x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y0E);
    dp->::ccc::CC2x11y0::~CC2x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y0E(Test__ZN3ccc8CC2x11y0E, "_ZN3ccc8CC2x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y0C1Ev();
extern void _ZN3ccc8CC2x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y0E[] = {
  NSPAIR(_ZN3ccc8CC2x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y0E[];
extern void _ZN3ccc8CC2x11y03efgEv();
extern void _ZN3ccc8CC2x11y03abcEv();
extern void _ZN3ccc8CC2x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y03pqrEv,_ZThn4_N3ccc8CC2x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y03efgEv,_ZThn4_N3ccc8CC2x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y03pqrEv,_ZThn4_N3ccc8CC2x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y03efgEv,_ZThn4_N3ccc8CC2x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y0E[];
Class_Descriptor cd__ZN3ccc8CC2x11y0E = {  "_ZN3ccc8CC2x11y0E", // class name
  bases__ZN3ccc8CC2x11y0E, 2,
  &(vtc__ZN3ccc8CC2x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y1  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x11y13efgEv
  ~CC2x11y1(); // tgen
  CC2x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y1E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y13abcEv");}
void  ccc::CC2x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y13pqrEv");}
void  ccc::CC2x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y13efgEv");}
ccc::CC2x11y1 ::~CC2x11y1(){ note_dtor("_ZN3ccc8CC2x11y1E", this);} // tgen
ccc::CC2x11y1 ::CC2x11y1(){ note_ctor("_ZN3ccc8CC2x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y1E, buf);
    ::ccc::CC2x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y1E);
    dp->::ccc::CC2x11y1::~CC2x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y1E(Test__ZN3ccc8CC2x11y1E, "_ZN3ccc8CC2x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y1C1Ev();
extern void _ZN3ccc8CC2x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y1E[] = {
  NSPAIR(_ZN3ccc8CC2x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y1E[];
extern void _ZN3ccc8CC2x11y13efgEv();
extern void _ZN3ccc8CC2x11y13abcEv();
extern void _ZN3ccc8CC2x11y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y13pqrEv,_ZThn4_N3ccc8CC2x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y13efgEv,_ZThn4_N3ccc8CC2x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y13pqrEv,_ZThn4_N3ccc8CC2x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y13efgEv,_ZThn4_N3ccc8CC2x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y1E[];
Class_Descriptor cd__ZN3ccc8CC2x11y1E = {  "_ZN3ccc8CC2x11y1E", // class name
  bases__ZN3ccc8CC2x11y1E, 2,
  &(vtc__ZN3ccc8CC2x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y2  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y23pqrEv
  ~CC2x11y2(); // tgen
  CC2x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y2E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y23efgEv");}
void  ccc::CC2x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y23abcEv");}
void  ccc::CC2x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y23pqrEv");}
ccc::CC2x11y2 ::~CC2x11y2(){ note_dtor("_ZN3ccc8CC2x11y2E", this);} // tgen
ccc::CC2x11y2 ::CC2x11y2(){ note_ctor("_ZN3ccc8CC2x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y2E, buf);
    ::ccc::CC2x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y2E);
    dp->::ccc::CC2x11y2::~CC2x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y2E(Test__ZN3ccc8CC2x11y2E, "_ZN3ccc8CC2x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y2C1Ev();
extern void _ZN3ccc8CC2x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y2E[] = {
  NSPAIR(_ZN3ccc8CC2x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y2E[];
extern void _ZN3ccc8CC2x11y23efgEv();
extern void _ZN3ccc8CC2x11y23abcEv();
extern void _ZN3ccc8CC2x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y23pqrEv,_ZThn4_N3ccc8CC2x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y23efgEv,_ZThn4_N3ccc8CC2x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y23pqrEv,_ZThn4_N3ccc8CC2x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y23efgEv,_ZThn4_N3ccc8CC2x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y2E[];
Class_Descriptor cd__ZN3ccc8CC2x11y2E = {  "_ZN3ccc8CC2x11y2E", // class name
  bases__ZN3ccc8CC2x11y2E, 2,
  &(vtc__ZN3ccc8CC2x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y3  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x11y33abcEv
  ~CC2x11y3(); // tgen
  CC2x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y3E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y33efgEv");}
void  ccc::CC2x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y33pqrEv");}
void  ccc::CC2x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y33abcEv");}
ccc::CC2x11y3 ::~CC2x11y3(){ note_dtor("_ZN3ccc8CC2x11y3E", this);} // tgen
ccc::CC2x11y3 ::CC2x11y3(){ note_ctor("_ZN3ccc8CC2x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y3E, buf);
    ::ccc::CC2x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y3E);
    dp->::ccc::CC2x11y3::~CC2x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y3E(Test__ZN3ccc8CC2x11y3E, "_ZN3ccc8CC2x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y3C1Ev();
extern void _ZN3ccc8CC2x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y3E[] = {
  NSPAIR(_ZN3ccc8CC2x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y3E[];
extern void _ZN3ccc8CC2x11y33efgEv();
extern void _ZN3ccc8CC2x11y33abcEv();
extern void _ZN3ccc8CC2x11y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y33pqrEv,_ZThn4_N3ccc8CC2x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y33efgEv,_ZThn4_N3ccc8CC2x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y33pqrEv,_ZThn4_N3ccc8CC2x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y33efgEv,_ZThn4_N3ccc8CC2x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y3E[];
Class_Descriptor cd__ZN3ccc8CC2x11y3E = {  "_ZN3ccc8CC2x11y3E", // class name
  bases__ZN3ccc8CC2x11y3E, 2,
  &(vtc__ZN3ccc8CC2x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y4  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC2x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y43efgEv
  ~CC2x11y4(); // tgen
  CC2x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y4E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y43pqrEv");}
void  ccc::CC2x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y43abcEv");}
void  ccc::CC2x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y43efgEv");}
ccc::CC2x11y4 ::~CC2x11y4(){ note_dtor("_ZN3ccc8CC2x11y4E", this);} // tgen
ccc::CC2x11y4 ::CC2x11y4(){ note_ctor("_ZN3ccc8CC2x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y4E, buf);
    ::ccc::CC2x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y4E);
    dp->::ccc::CC2x11y4::~CC2x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y4E(Test__ZN3ccc8CC2x11y4E, "_ZN3ccc8CC2x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y4C1Ev();
extern void _ZN3ccc8CC2x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y4E[] = {
  NSPAIR(_ZN3ccc8CC2x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y4E[];
extern void _ZN3ccc8CC2x11y43efgEv();
extern void _ZN3ccc8CC2x11y43abcEv();
extern void _ZN3ccc8CC2x11y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y43pqrEv,_ZThn4_N3ccc8CC2x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y43efgEv,_ZThn4_N3ccc8CC2x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y43pqrEv,_ZThn4_N3ccc8CC2x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y43efgEv,_ZThn4_N3ccc8CC2x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y4E[];
Class_Descriptor cd__ZN3ccc8CC2x11y4E = {  "_ZN3ccc8CC2x11y4E", // class name
  bases__ZN3ccc8CC2x11y4E, 2,
  &(vtc__ZN3ccc8CC2x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y5  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC2x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y53abcEv
  ~CC2x11y5(); // tgen
  CC2x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y5E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y53pqrEv");}
void  ccc::CC2x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y53efgEv");}
void  ccc::CC2x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y53abcEv");}
ccc::CC2x11y5 ::~CC2x11y5(){ note_dtor("_ZN3ccc8CC2x11y5E", this);} // tgen
ccc::CC2x11y5 ::CC2x11y5(){ note_ctor("_ZN3ccc8CC2x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y5E, buf);
    ::ccc::CC2x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y5E);
    dp->::ccc::CC2x11y5::~CC2x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y5E(Test__ZN3ccc8CC2x11y5E, "_ZN3ccc8CC2x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y5C1Ev();
extern void _ZN3ccc8CC2x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y5E[] = {
  NSPAIR(_ZN3ccc8CC2x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y5E[];
extern void _ZN3ccc8CC2x11y53efgEv();
extern void _ZN3ccc8CC2x11y53abcEv();
extern void _ZN3ccc8CC2x11y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y53pqrEv,_ZThn4_N3ccc8CC2x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y53efgEv,_ZThn4_N3ccc8CC2x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y53pqrEv,_ZThn4_N3ccc8CC2x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y53efgEv,_ZThn4_N3ccc8CC2x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y5E[];
Class_Descriptor cd__ZN3ccc8CC2x11y5E = {  "_ZN3ccc8CC2x11y5E", // class name
  bases__ZN3ccc8CC2x11y5E, 2,
  &(vtc__ZN3ccc8CC2x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y6  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x11y63efgEv
  ~CC2x11y6(); // tgen
  CC2x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y6E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y63abcEv");}
void  ccc::CC2x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y63efgEv");}
ccc::CC2x11y6 ::~CC2x11y6(){ note_dtor("_ZN3ccc8CC2x11y6E", this);} // tgen
ccc::CC2x11y6 ::CC2x11y6(){ note_ctor("_ZN3ccc8CC2x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y6E, buf);
    ::ccc::CC2x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y6E);
    dp->::ccc::CC2x11y6::~CC2x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y6E(Test__ZN3ccc8CC2x11y6E, "_ZN3ccc8CC2x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y6C1Ev();
extern void _ZN3ccc8CC2x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y6E[] = {
  NSPAIR(_ZN3ccc8CC2x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y6E[];
extern void _ZN3ccc8CC2x11y63efgEv();
extern void _ZN3ccc8CC2x11y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y63efgEv,_ZThn4_N3ccc8CC2x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y63efgEv,_ZThn4_N3ccc8CC2x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y6E[];
Class_Descriptor cd__ZN3ccc8CC2x11y6E = {  "_ZN3ccc8CC2x11y6E", // class name
  bases__ZN3ccc8CC2x11y6E, 2,
  &(vtc__ZN3ccc8CC2x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y7  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC2x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y73pqrEv
  ~CC2x11y7(); // tgen
  CC2x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y7E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y73abcEv");}
void  ccc::CC2x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y73pqrEv");}
ccc::CC2x11y7 ::~CC2x11y7(){ note_dtor("_ZN3ccc8CC2x11y7E", this);} // tgen
ccc::CC2x11y7 ::CC2x11y7(){ note_ctor("_ZN3ccc8CC2x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y7E, buf);
    ::ccc::CC2x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y7E);
    dp->::ccc::CC2x11y7::~CC2x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y7E(Test__ZN3ccc8CC2x11y7E, "_ZN3ccc8CC2x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y7C1Ev();
extern void _ZN3ccc8CC2x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y7E[] = {
  NSPAIR(_ZN3ccc8CC2x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x11y73abcEv();
extern void _ZN3ccc8CC2x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y73pqrEv,_ZThn4_N3ccc8CC2x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y73pqrEv,_ZThn4_N3ccc8CC2x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y7E[];
Class_Descriptor cd__ZN3ccc8CC2x11y7E = {  "_ZN3ccc8CC2x11y7E", // class name
  bases__ZN3ccc8CC2x11y7E, 2,
  &(vtc__ZN3ccc8CC2x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y8  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x11y83abcEv
  ~CC2x11y8(); // tgen
  CC2x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y8E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y83efgEv");}
void  ccc::CC2x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x11y83abcEv");}
ccc::CC2x11y8 ::~CC2x11y8(){ note_dtor("_ZN3ccc8CC2x11y8E", this);} // tgen
ccc::CC2x11y8 ::CC2x11y8(){ note_ctor("_ZN3ccc8CC2x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y8E, buf);
    ::ccc::CC2x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y8E);
    dp->::ccc::CC2x11y8::~CC2x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y8E(Test__ZN3ccc8CC2x11y8E, "_ZN3ccc8CC2x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y8C1Ev();
extern void _ZN3ccc8CC2x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y8E[] = {
  NSPAIR(_ZN3ccc8CC2x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y8E[];
extern void _ZN3ccc8CC2x11y83efgEv();
extern void _ZN3ccc8CC2x11y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y83efgEv,_ZThn4_N3ccc8CC2x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y83efgEv,_ZThn4_N3ccc8CC2x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y8E[];
Class_Descriptor cd__ZN3ccc8CC2x11y8E = {  "_ZN3ccc8CC2x11y8E", // class name
  bases__ZN3ccc8CC2x11y8E, 2,
  &(vtc__ZN3ccc8CC2x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y9  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC2x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x11y93pqrEv
  ~CC2x11y9(); // tgen
  CC2x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x11y9E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x11y93efgEv");}
void  ccc::CC2x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x11y93pqrEv");}
ccc::CC2x11y9 ::~CC2x11y9(){ note_dtor("_ZN3ccc8CC2x11y9E", this);} // tgen
ccc::CC2x11y9 ::CC2x11y9(){ note_ctor("_ZN3ccc8CC2x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x11y9E, buf);
    ::ccc::CC2x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x11y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC2x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x11y9E);
    dp->::ccc::CC2x11y9::~CC2x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x11y9E(Test__ZN3ccc8CC2x11y9E, "_ZN3ccc8CC2x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x11y9C1Ev();
extern void _ZN3ccc8CC2x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x11y9E[] = {
  NSPAIR(_ZN3ccc8CC2x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC2x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y9E[];
extern void _ZN3ccc8CC2x11y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y93pqrEv,_ZThn4_N3ccc8CC2x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC2x11y93efgEv,_ZThn4_N3ccc8CC2x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y93pqrEv,_ZThn4_N3ccc8CC2x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x11y93efgEv,_ZThn4_N3ccc8CC2x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x11y9E[];
Class_Descriptor cd__ZN3ccc8CC2x11y9E = {  "_ZN3ccc8CC2x11y9E", // class name
  bases__ZN3ccc8CC2x11y9E, 2,
  &(vtc__ZN3ccc8CC2x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y10  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x11y103abcEv
  ~CC2x11y10(); // tgen
  CC2x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y10E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y103pqrEv");}
void  ccc::CC2x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x11y103abcEv");}
ccc::CC2x11y10 ::~CC2x11y10(){ note_dtor("_ZN3ccc9CC2x11y10E", this);} // tgen
ccc::CC2x11y10 ::CC2x11y10(){ note_ctor("_ZN3ccc9CC2x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y10E, buf);
    ::ccc::CC2x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y10E);
    dp->::ccc::CC2x11y10::~CC2x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y10E(Test__ZN3ccc9CC2x11y10E, "_ZN3ccc9CC2x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y10C1Ev();
extern void _ZN3ccc9CC2x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y10E[] = {
  NSPAIR(_ZN3ccc9CC2x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x11y103abcEv();
extern void _ZN3ccc9CC2x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y103pqrEv,_ZThn4_N3ccc9CC2x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x11y103pqrEv,_ZThn4_N3ccc9CC2x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y10E[];
Class_Descriptor cd__ZN3ccc9CC2x11y10E = {  "_ZN3ccc9CC2x11y10E", // class name
  bases__ZN3ccc9CC2x11y10E, 2,
  &(vtc__ZN3ccc9CC2x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y11  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x11y113efgEv
  ~CC2x11y11(); // tgen
  CC2x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y11E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y113pqrEv");}
void  ccc::CC2x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x11y113efgEv");}
ccc::CC2x11y11 ::~CC2x11y11(){ note_dtor("_ZN3ccc9CC2x11y11E", this);} // tgen
ccc::CC2x11y11 ::CC2x11y11(){ note_ctor("_ZN3ccc9CC2x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y11E, buf);
    ::ccc::CC2x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y11E);
    dp->::ccc::CC2x11y11::~CC2x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y11E(Test__ZN3ccc9CC2x11y11E, "_ZN3ccc9CC2x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y11C1Ev();
extern void _ZN3ccc9CC2x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y11E[] = {
  NSPAIR(_ZN3ccc9CC2x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y11E[];
extern void _ZN3ccc9CC2x11y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y113pqrEv,_ZThn4_N3ccc9CC2x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y113efgEv,_ZThn4_N3ccc9CC2x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x11y113pqrEv,_ZThn4_N3ccc9CC2x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x11y113efgEv,_ZThn4_N3ccc9CC2x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y11E[];
Class_Descriptor cd__ZN3ccc9CC2x11y11E = {  "_ZN3ccc9CC2x11y11E", // class name
  bases__ZN3ccc9CC2x11y11E, 2,
  &(vtc__ZN3ccc9CC2x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y12  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC2x11y123abcEv
  ~CC2x11y12(); // tgen
  CC2x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC2x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x11y123abcEv");}
ccc::CC2x11y12 ::~CC2x11y12(){ note_dtor("_ZN3ccc9CC2x11y12E", this);} // tgen
ccc::CC2x11y12 ::CC2x11y12(){ note_ctor("_ZN3ccc9CC2x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y12E, buf);
    ::ccc::CC2x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y12E);
    dp->::ccc::CC2x11y12::~CC2x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y12E(Test__ZN3ccc9CC2x11y12E, "_ZN3ccc9CC2x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y12C1Ev();
extern void _ZN3ccc9CC2x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y12E[] = {
  NSPAIR(_ZN3ccc9CC2x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x11y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y12E[];
Class_Descriptor cd__ZN3ccc9CC2x11y12E = {  "_ZN3ccc9CC2x11y12E", // class name
  bases__ZN3ccc9CC2x11y12E, 2,
  &(vtc__ZN3ccc9CC2x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y13  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC2x11y133efgEv
  ~CC2x11y13(); // tgen
  CC2x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC2x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x11y133efgEv");}
ccc::CC2x11y13 ::~CC2x11y13(){ note_dtor("_ZN3ccc9CC2x11y13E", this);} // tgen
ccc::CC2x11y13 ::CC2x11y13(){ note_ctor("_ZN3ccc9CC2x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y13E, buf);
    ::ccc::CC2x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y13E);
    dp->::ccc::CC2x11y13::~CC2x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y13E(Test__ZN3ccc9CC2x11y13E, "_ZN3ccc9CC2x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y13C1Ev();
extern void _ZN3ccc9CC2x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y13E[] = {
  NSPAIR(_ZN3ccc9CC2x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y13E[];
extern void _ZN3ccc9CC2x11y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y133efgEv,_ZThn4_N3ccc9CC2x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x11y133efgEv,_ZThn4_N3ccc9CC2x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y13E[];
Class_Descriptor cd__ZN3ccc9CC2x11y13E = {  "_ZN3ccc9CC2x11y13E", // class name
  bases__ZN3ccc9CC2x11y13E, 2,
  &(vtc__ZN3ccc9CC2x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y14  : ::ccc::AA2 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC2x11y143pqrEv
  ~CC2x11y14(); // tgen
  CC2x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y14E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC2x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x11y143pqrEv");}
ccc::CC2x11y14 ::~CC2x11y14(){ note_dtor("_ZN3ccc9CC2x11y14E", this);} // tgen
ccc::CC2x11y14 ::CC2x11y14(){ note_ctor("_ZN3ccc9CC2x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y14E, buf);
    ::ccc::CC2x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y14E);
    dp->::ccc::CC2x11y14::~CC2x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y14E(Test__ZN3ccc9CC2x11y14E, "_ZN3ccc9CC2x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y14C1Ev();
extern void _ZN3ccc9CC2x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y14E[] = {
  NSPAIR(_ZN3ccc9CC2x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x11y143pqrEv,_ZThn4_N3ccc9CC2x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x11y143pqrEv,_ZThn4_N3ccc9CC2x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y14E[];
Class_Descriptor cd__ZN3ccc9CC2x11y14E = {  "_ZN3ccc9CC2x11y14E", // class name
  bases__ZN3ccc9CC2x11y14E, 2,
  &(vtc__ZN3ccc9CC2x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x11y15  : ::ccc::AA2 , ::ccc::BB11 {
  ~CC2x11y15(); // tgen
  CC2x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x11y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC2x11y15 ::~CC2x11y15(){ note_dtor("_ZN3ccc9CC2x11y15E", this);} // tgen
ccc::CC2x11y15 ::CC2x11y15(){ note_ctor("_ZN3ccc9CC2x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x11y15E, buf);
    ::ccc::CC2x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x11y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC2x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x11y15E);
    dp->::ccc::CC2x11y15::~CC2x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x11y15E(Test__ZN3ccc9CC2x11y15E, "_ZN3ccc9CC2x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x11y15C1Ev();
extern void _ZN3ccc9CC2x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x11y15E[] = {
  NSPAIR(_ZN3ccc9CC2x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC2x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x11y15E[];
Class_Descriptor cd__ZN3ccc9CC2x11y15E = {  "_ZN3ccc9CC2x11y15E", // class name
  bases__ZN3ccc9CC2x11y15E, 2,
  &(vtc__ZN3ccc9CC2x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y0  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y03pqrEv
  ~CC2x12y0(); // tgen
  CC2x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y0E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y03abcEv");}
void  ccc::CC2x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y03efgEv");}
void  ccc::CC2x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y03pqrEv");}
ccc::CC2x12y0 ::~CC2x12y0(){ note_dtor("_ZN3ccc8CC2x12y0E", this);} // tgen
ccc::CC2x12y0 ::CC2x12y0(){ note_ctor("_ZN3ccc8CC2x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y0E, buf);
    ::ccc::CC2x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y0E);
    dp->::ccc::CC2x12y0::~CC2x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y0E(Test__ZN3ccc8CC2x12y0E, "_ZN3ccc8CC2x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y0C1Ev();
extern void _ZN3ccc8CC2x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y0E[] = {
  NSPAIR(_ZN3ccc8CC2x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y0E[];
extern void _ZN3ccc8CC2x12y03efgEv();
extern void _ZN3ccc8CC2x12y03abcEv();
extern void _ZN3ccc8CC2x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y03abcEv,_ZThn4_N3ccc8CC2x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y03abcEv,_ZThn4_N3ccc8CC2x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y0E[];
Class_Descriptor cd__ZN3ccc8CC2x12y0E = {  "_ZN3ccc8CC2x12y0E", // class name
  bases__ZN3ccc8CC2x12y0E, 2,
  &(vtc__ZN3ccc8CC2x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y1  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x12y13efgEv
  ~CC2x12y1(); // tgen
  CC2x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y1E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y13abcEv");}
void  ccc::CC2x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y13pqrEv");}
void  ccc::CC2x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y13efgEv");}
ccc::CC2x12y1 ::~CC2x12y1(){ note_dtor("_ZN3ccc8CC2x12y1E", this);} // tgen
ccc::CC2x12y1 ::CC2x12y1(){ note_ctor("_ZN3ccc8CC2x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y1E, buf);
    ::ccc::CC2x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y1E);
    dp->::ccc::CC2x12y1::~CC2x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y1E(Test__ZN3ccc8CC2x12y1E, "_ZN3ccc8CC2x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y1C1Ev();
extern void _ZN3ccc8CC2x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y1E[] = {
  NSPAIR(_ZN3ccc8CC2x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y1E[];
extern void _ZN3ccc8CC2x12y13efgEv();
extern void _ZN3ccc8CC2x12y13abcEv();
extern void _ZN3ccc8CC2x12y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y13abcEv,_ZThn4_N3ccc8CC2x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y13abcEv,_ZThn4_N3ccc8CC2x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y1E[];
Class_Descriptor cd__ZN3ccc8CC2x12y1E = {  "_ZN3ccc8CC2x12y1E", // class name
  bases__ZN3ccc8CC2x12y1E, 2,
  &(vtc__ZN3ccc8CC2x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y2  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y23pqrEv
  ~CC2x12y2(); // tgen
  CC2x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y2E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y23efgEv");}
void  ccc::CC2x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y23abcEv");}
void  ccc::CC2x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y23pqrEv");}
ccc::CC2x12y2 ::~CC2x12y2(){ note_dtor("_ZN3ccc8CC2x12y2E", this);} // tgen
ccc::CC2x12y2 ::CC2x12y2(){ note_ctor("_ZN3ccc8CC2x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y2E, buf);
    ::ccc::CC2x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y2E);
    dp->::ccc::CC2x12y2::~CC2x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y2E(Test__ZN3ccc8CC2x12y2E, "_ZN3ccc8CC2x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y2C1Ev();
extern void _ZN3ccc8CC2x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y2E[] = {
  NSPAIR(_ZN3ccc8CC2x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y2E[];
extern void _ZN3ccc8CC2x12y23efgEv();
extern void _ZN3ccc8CC2x12y23abcEv();
extern void _ZN3ccc8CC2x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y23abcEv,_ZThn4_N3ccc8CC2x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y23abcEv,_ZThn4_N3ccc8CC2x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y2E[];
Class_Descriptor cd__ZN3ccc8CC2x12y2E = {  "_ZN3ccc8CC2x12y2E", // class name
  bases__ZN3ccc8CC2x12y2E, 2,
  &(vtc__ZN3ccc8CC2x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y3  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x12y33abcEv
  ~CC2x12y3(); // tgen
  CC2x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y3E) C1{ BC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y33efgEv");}
void  ccc::CC2x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y33pqrEv");}
void  ccc::CC2x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y33abcEv");}
ccc::CC2x12y3 ::~CC2x12y3(){ note_dtor("_ZN3ccc8CC2x12y3E", this);} // tgen
ccc::CC2x12y3 ::CC2x12y3(){ note_ctor("_ZN3ccc8CC2x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y3E, buf);
    ::ccc::CC2x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y3E);
    dp->::ccc::CC2x12y3::~CC2x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y3E(Test__ZN3ccc8CC2x12y3E, "_ZN3ccc8CC2x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y3C1Ev();
extern void _ZN3ccc8CC2x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y3E[] = {
  NSPAIR(_ZN3ccc8CC2x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y3E[];
extern void _ZN3ccc8CC2x12y33efgEv();
extern void _ZN3ccc8CC2x12y33abcEv();
extern void _ZN3ccc8CC2x12y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y33abcEv,_ZThn4_N3ccc8CC2x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y33abcEv,_ZThn4_N3ccc8CC2x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y3E[];
Class_Descriptor cd__ZN3ccc8CC2x12y3E = {  "_ZN3ccc8CC2x12y3E", // class name
  bases__ZN3ccc8CC2x12y3E, 2,
  &(vtc__ZN3ccc8CC2x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y4  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC2x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y43efgEv
  ~CC2x12y4(); // tgen
  CC2x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y4E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y43pqrEv");}
void  ccc::CC2x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y43abcEv");}
void  ccc::CC2x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y43efgEv");}
ccc::CC2x12y4 ::~CC2x12y4(){ note_dtor("_ZN3ccc8CC2x12y4E", this);} // tgen
ccc::CC2x12y4 ::CC2x12y4(){ note_ctor("_ZN3ccc8CC2x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y4E, buf);
    ::ccc::CC2x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y4E);
    dp->::ccc::CC2x12y4::~CC2x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y4E(Test__ZN3ccc8CC2x12y4E, "_ZN3ccc8CC2x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y4C1Ev();
extern void _ZN3ccc8CC2x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y4E[] = {
  NSPAIR(_ZN3ccc8CC2x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y4E[];
extern void _ZN3ccc8CC2x12y43efgEv();
extern void _ZN3ccc8CC2x12y43abcEv();
extern void _ZN3ccc8CC2x12y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y43abcEv,_ZThn4_N3ccc8CC2x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y43abcEv,_ZThn4_N3ccc8CC2x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y4E[];
Class_Descriptor cd__ZN3ccc8CC2x12y4E = {  "_ZN3ccc8CC2x12y4E", // class name
  bases__ZN3ccc8CC2x12y4E, 2,
  &(vtc__ZN3ccc8CC2x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y5  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC2x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y53abcEv
  ~CC2x12y5(); // tgen
  CC2x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y5E) C1{ BC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y53pqrEv");}
void  ccc::CC2x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y53efgEv");}
void  ccc::CC2x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y53abcEv");}
ccc::CC2x12y5 ::~CC2x12y5(){ note_dtor("_ZN3ccc8CC2x12y5E", this);} // tgen
ccc::CC2x12y5 ::CC2x12y5(){ note_ctor("_ZN3ccc8CC2x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y5E, buf);
    ::ccc::CC2x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y5E);
    dp->::ccc::CC2x12y5::~CC2x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y5E(Test__ZN3ccc8CC2x12y5E, "_ZN3ccc8CC2x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y5C1Ev();
extern void _ZN3ccc8CC2x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y5E[] = {
  NSPAIR(_ZN3ccc8CC2x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y5E[];
extern void _ZN3ccc8CC2x12y53efgEv();
extern void _ZN3ccc8CC2x12y53abcEv();
extern void _ZN3ccc8CC2x12y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y53abcEv,_ZThn4_N3ccc8CC2x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y53abcEv,_ZThn4_N3ccc8CC2x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y5E[];
Class_Descriptor cd__ZN3ccc8CC2x12y5E = {  "_ZN3ccc8CC2x12y5E", // class name
  bases__ZN3ccc8CC2x12y5E, 2,
  &(vtc__ZN3ccc8CC2x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y6  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x12y63efgEv
  ~CC2x12y6(); // tgen
  CC2x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y6E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y63abcEv");}
void  ccc::CC2x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y63efgEv");}
ccc::CC2x12y6 ::~CC2x12y6(){ note_dtor("_ZN3ccc8CC2x12y6E", this);} // tgen
ccc::CC2x12y6 ::CC2x12y6(){ note_ctor("_ZN3ccc8CC2x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y6E, buf);
    ::ccc::CC2x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y6E);
    dp->::ccc::CC2x12y6::~CC2x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y6E(Test__ZN3ccc8CC2x12y6E, "_ZN3ccc8CC2x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y6C1Ev();
extern void _ZN3ccc8CC2x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y6E[] = {
  NSPAIR(_ZN3ccc8CC2x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y6E[];
extern void _ZN3ccc8CC2x12y63efgEv();
extern void _ZN3ccc8CC2x12y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y63abcEv,_ZThn4_N3ccc8CC2x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y63abcEv,_ZThn4_N3ccc8CC2x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y6E[];
Class_Descriptor cd__ZN3ccc8CC2x12y6E = {  "_ZN3ccc8CC2x12y6E", // class name
  bases__ZN3ccc8CC2x12y6E, 2,
  &(vtc__ZN3ccc8CC2x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y7  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC2x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y73pqrEv
  ~CC2x12y7(); // tgen
  CC2x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y7E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y73abcEv");}
void  ccc::CC2x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y73pqrEv");}
ccc::CC2x12y7 ::~CC2x12y7(){ note_dtor("_ZN3ccc8CC2x12y7E", this);} // tgen
ccc::CC2x12y7 ::CC2x12y7(){ note_ctor("_ZN3ccc8CC2x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y7E, buf);
    ::ccc::CC2x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y7E);
    dp->::ccc::CC2x12y7::~CC2x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y7E(Test__ZN3ccc8CC2x12y7E, "_ZN3ccc8CC2x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y7C1Ev();
extern void _ZN3ccc8CC2x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y7E[] = {
  NSPAIR(_ZN3ccc8CC2x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x12y73abcEv();
extern void _ZN3ccc8CC2x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y73abcEv,_ZThn4_N3ccc8CC2x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y73abcEv,_ZThn4_N3ccc8CC2x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y7E[];
Class_Descriptor cd__ZN3ccc8CC2x12y7E = {  "_ZN3ccc8CC2x12y7E", // class name
  bases__ZN3ccc8CC2x12y7E, 2,
  &(vtc__ZN3ccc8CC2x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y8  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x12y83abcEv
  ~CC2x12y8(); // tgen
  CC2x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y8E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y83efgEv");}
void  ccc::CC2x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x12y83abcEv");}
ccc::CC2x12y8 ::~CC2x12y8(){ note_dtor("_ZN3ccc8CC2x12y8E", this);} // tgen
ccc::CC2x12y8 ::CC2x12y8(){ note_ctor("_ZN3ccc8CC2x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y8E, buf);
    ::ccc::CC2x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y8E);
    dp->::ccc::CC2x12y8::~CC2x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y8E(Test__ZN3ccc8CC2x12y8E, "_ZN3ccc8CC2x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y8C1Ev();
extern void _ZN3ccc8CC2x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y8E[] = {
  NSPAIR(_ZN3ccc8CC2x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y8E[];
extern void _ZN3ccc8CC2x12y83efgEv();
extern void _ZN3ccc8CC2x12y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x12y83abcEv,_ZThn4_N3ccc8CC2x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x12y83abcEv,_ZThn4_N3ccc8CC2x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y8E[];
Class_Descriptor cd__ZN3ccc8CC2x12y8E = {  "_ZN3ccc8CC2x12y8E", // class name
  bases__ZN3ccc8CC2x12y8E, 2,
  &(vtc__ZN3ccc8CC2x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y9  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC2x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x12y93pqrEv
  ~CC2x12y9(); // tgen
  CC2x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x12y9E) C1{ BC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x12y93efgEv");}
void  ccc::CC2x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x12y93pqrEv");}
ccc::CC2x12y9 ::~CC2x12y9(){ note_dtor("_ZN3ccc8CC2x12y9E", this);} // tgen
ccc::CC2x12y9 ::CC2x12y9(){ note_ctor("_ZN3ccc8CC2x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x12y9E, buf);
    ::ccc::CC2x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x12y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC2x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x12y9E);
    dp->::ccc::CC2x12y9::~CC2x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x12y9E(Test__ZN3ccc8CC2x12y9E, "_ZN3ccc8CC2x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x12y9C1Ev();
extern void _ZN3ccc8CC2x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x12y9E[] = {
  NSPAIR(_ZN3ccc8CC2x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC2x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y9E[];
extern void _ZN3ccc8CC2x12y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x12y9E[];
Class_Descriptor cd__ZN3ccc8CC2x12y9E = {  "_ZN3ccc8CC2x12y9E", // class name
  bases__ZN3ccc8CC2x12y9E, 2,
  &(vtc__ZN3ccc8CC2x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y10  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x12y103abcEv
  ~CC2x12y10(); // tgen
  CC2x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y10E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y103pqrEv");}
void  ccc::CC2x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x12y103abcEv");}
ccc::CC2x12y10 ::~CC2x12y10(){ note_dtor("_ZN3ccc9CC2x12y10E", this);} // tgen
ccc::CC2x12y10 ::CC2x12y10(){ note_ctor("_ZN3ccc9CC2x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y10E, buf);
    ::ccc::CC2x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y10E);
    dp->::ccc::CC2x12y10::~CC2x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y10E(Test__ZN3ccc9CC2x12y10E, "_ZN3ccc9CC2x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y10C1Ev();
extern void _ZN3ccc9CC2x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y10E[] = {
  NSPAIR(_ZN3ccc9CC2x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x12y103abcEv();
extern void _ZN3ccc9CC2x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y103abcEv,_ZThn4_N3ccc9CC2x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x12y103abcEv,_ZThn4_N3ccc9CC2x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y10E[];
Class_Descriptor cd__ZN3ccc9CC2x12y10E = {  "_ZN3ccc9CC2x12y10E", // class name
  bases__ZN3ccc9CC2x12y10E, 2,
  &(vtc__ZN3ccc9CC2x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y11  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x12y113efgEv
  ~CC2x12y11(); // tgen
  CC2x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y11E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y113pqrEv");}
void  ccc::CC2x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x12y113efgEv");}
ccc::CC2x12y11 ::~CC2x12y11(){ note_dtor("_ZN3ccc9CC2x12y11E", this);} // tgen
ccc::CC2x12y11 ::CC2x12y11(){ note_ctor("_ZN3ccc9CC2x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y11E, buf);
    ::ccc::CC2x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y11E);
    dp->::ccc::CC2x12y11::~CC2x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y11E(Test__ZN3ccc9CC2x12y11E, "_ZN3ccc9CC2x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y11C1Ev();
extern void _ZN3ccc9CC2x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y11E[] = {
  NSPAIR(_ZN3ccc9CC2x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y11E[];
extern void _ZN3ccc9CC2x12y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y11E[];
Class_Descriptor cd__ZN3ccc9CC2x12y11E = {  "_ZN3ccc9CC2x12y11E", // class name
  bases__ZN3ccc9CC2x12y11E, 2,
  &(vtc__ZN3ccc9CC2x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y12  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC2x12y123abcEv
  ~CC2x12y12(); // tgen
  CC2x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y12E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x12y123abcEv");}
ccc::CC2x12y12 ::~CC2x12y12(){ note_dtor("_ZN3ccc9CC2x12y12E", this);} // tgen
ccc::CC2x12y12 ::CC2x12y12(){ note_ctor("_ZN3ccc9CC2x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y12E, buf);
    ::ccc::CC2x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y12E);
    dp->::ccc::CC2x12y12::~CC2x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y12E(Test__ZN3ccc9CC2x12y12E, "_ZN3ccc9CC2x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y12C1Ev();
extern void _ZN3ccc9CC2x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y12E[] = {
  NSPAIR(_ZN3ccc9CC2x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x12y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x12y123abcEv,_ZThn4_N3ccc9CC2x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x12y123abcEv,_ZThn4_N3ccc9CC2x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y12E[];
Class_Descriptor cd__ZN3ccc9CC2x12y12E = {  "_ZN3ccc9CC2x12y12E", // class name
  bases__ZN3ccc9CC2x12y12E, 2,
  &(vtc__ZN3ccc9CC2x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y13  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC2x12y133efgEv
  ~CC2x12y13(); // tgen
  CC2x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y13E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x12y133efgEv");}
ccc::CC2x12y13 ::~CC2x12y13(){ note_dtor("_ZN3ccc9CC2x12y13E", this);} // tgen
ccc::CC2x12y13 ::CC2x12y13(){ note_ctor("_ZN3ccc9CC2x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y13E, buf);
    ::ccc::CC2x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y13E);
    dp->::ccc::CC2x12y13::~CC2x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y13E(Test__ZN3ccc9CC2x12y13E, "_ZN3ccc9CC2x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y13C1Ev();
extern void _ZN3ccc9CC2x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y13E[] = {
  NSPAIR(_ZN3ccc9CC2x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y13E[];
extern void _ZN3ccc9CC2x12y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y13E[];
Class_Descriptor cd__ZN3ccc9CC2x12y13E = {  "_ZN3ccc9CC2x12y13E", // class name
  bases__ZN3ccc9CC2x12y13E, 2,
  &(vtc__ZN3ccc9CC2x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y14  : ::ccc::AA2 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC2x12y143pqrEv
  ~CC2x12y14(); // tgen
  CC2x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y14E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x12y143pqrEv");}
ccc::CC2x12y14 ::~CC2x12y14(){ note_dtor("_ZN3ccc9CC2x12y14E", this);} // tgen
ccc::CC2x12y14 ::CC2x12y14(){ note_ctor("_ZN3ccc9CC2x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y14E, buf);
    ::ccc::CC2x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y14E);
    dp->::ccc::CC2x12y14::~CC2x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y14E(Test__ZN3ccc9CC2x12y14E, "_ZN3ccc9CC2x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y14C1Ev();
extern void _ZN3ccc9CC2x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y14E[] = {
  NSPAIR(_ZN3ccc9CC2x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y14E[];
Class_Descriptor cd__ZN3ccc9CC2x12y14E = {  "_ZN3ccc9CC2x12y14E", // class name
  bases__ZN3ccc9CC2x12y14E, 2,
  &(vtc__ZN3ccc9CC2x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x12y15  : ::ccc::AA2 , ::ccc::BB12 {
  ~CC2x12y15(); // tgen
  CC2x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x12y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x12y15 ::~CC2x12y15(){ note_dtor("_ZN3ccc9CC2x12y15E", this);} // tgen
ccc::CC2x12y15 ::CC2x12y15(){ note_ctor("_ZN3ccc9CC2x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x12y15E, buf);
    ::ccc::CC2x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x12y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC2x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x12y15E);
    dp->::ccc::CC2x12y15::~CC2x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x12y15E(Test__ZN3ccc9CC2x12y15E, "_ZN3ccc9CC2x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x12y15C1Ev();
extern void _ZN3ccc9CC2x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x12y15E[] = {
  NSPAIR(_ZN3ccc9CC2x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC2x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x12y15E[];
Class_Descriptor cd__ZN3ccc9CC2x12y15E = {  "_ZN3ccc9CC2x12y15E", // class name
  bases__ZN3ccc9CC2x12y15E, 2,
  &(vtc__ZN3ccc9CC2x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y0  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y03pqrEv
  ~CC2x13y0(); // tgen
  CC2x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y0E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y03abcEv");}
void  ccc::CC2x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y03efgEv");}
void  ccc::CC2x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y03pqrEv");}
ccc::CC2x13y0 ::~CC2x13y0(){ note_dtor("_ZN3ccc8CC2x13y0E", this);} // tgen
ccc::CC2x13y0 ::CC2x13y0(){ note_ctor("_ZN3ccc8CC2x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y0E, buf);
    ::ccc::CC2x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y0E);
    dp->::ccc::CC2x13y0::~CC2x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y0E(Test__ZN3ccc8CC2x13y0E, "_ZN3ccc8CC2x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y0C1Ev();
extern void _ZN3ccc8CC2x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y0E[] = {
  NSPAIR(_ZN3ccc8CC2x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y0E[];
extern void _ZN3ccc8CC2x13y03efgEv();
extern void _ZN3ccc8CC2x13y03abcEv();
extern void _ZN3ccc8CC2x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y03efgEv,_ZThn4_N3ccc8CC2x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y03efgEv,_ZThn4_N3ccc8CC2x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y0E[];
Class_Descriptor cd__ZN3ccc8CC2x13y0E = {  "_ZN3ccc8CC2x13y0E", // class name
  bases__ZN3ccc8CC2x13y0E, 2,
  &(vtc__ZN3ccc8CC2x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y1  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x13y13efgEv
  ~CC2x13y1(); // tgen
  CC2x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y1E) C1{ BC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y13abcEv");}
void  ccc::CC2x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y13pqrEv");}
void  ccc::CC2x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y13efgEv");}
ccc::CC2x13y1 ::~CC2x13y1(){ note_dtor("_ZN3ccc8CC2x13y1E", this);} // tgen
ccc::CC2x13y1 ::CC2x13y1(){ note_ctor("_ZN3ccc8CC2x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y1E, buf);
    ::ccc::CC2x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y1E);
    dp->::ccc::CC2x13y1::~CC2x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y1E(Test__ZN3ccc8CC2x13y1E, "_ZN3ccc8CC2x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y1C1Ev();
extern void _ZN3ccc8CC2x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y1E[] = {
  NSPAIR(_ZN3ccc8CC2x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y1E[];
extern void _ZN3ccc8CC2x13y13efgEv();
extern void _ZN3ccc8CC2x13y13abcEv();
extern void _ZN3ccc8CC2x13y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y13efgEv,_ZThn4_N3ccc8CC2x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y13efgEv,_ZThn4_N3ccc8CC2x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y1E[];
Class_Descriptor cd__ZN3ccc8CC2x13y1E = {  "_ZN3ccc8CC2x13y1E", // class name
  bases__ZN3ccc8CC2x13y1E, 2,
  &(vtc__ZN3ccc8CC2x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y2  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y23pqrEv
  ~CC2x13y2(); // tgen
  CC2x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y2E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y23efgEv");}
void  ccc::CC2x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y23abcEv");}
void  ccc::CC2x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y23pqrEv");}
ccc::CC2x13y2 ::~CC2x13y2(){ note_dtor("_ZN3ccc8CC2x13y2E", this);} // tgen
ccc::CC2x13y2 ::CC2x13y2(){ note_ctor("_ZN3ccc8CC2x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y2E, buf);
    ::ccc::CC2x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y2E);
    dp->::ccc::CC2x13y2::~CC2x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y2E(Test__ZN3ccc8CC2x13y2E, "_ZN3ccc8CC2x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y2C1Ev();
extern void _ZN3ccc8CC2x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y2E[] = {
  NSPAIR(_ZN3ccc8CC2x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y2E[];
extern void _ZN3ccc8CC2x13y23efgEv();
extern void _ZN3ccc8CC2x13y23abcEv();
extern void _ZN3ccc8CC2x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y23efgEv,_ZThn4_N3ccc8CC2x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y23efgEv,_ZThn4_N3ccc8CC2x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y2E[];
Class_Descriptor cd__ZN3ccc8CC2x13y2E = {  "_ZN3ccc8CC2x13y2E", // class name
  bases__ZN3ccc8CC2x13y2E, 2,
  &(vtc__ZN3ccc8CC2x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y3  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x13y33abcEv
  ~CC2x13y3(); // tgen
  CC2x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y3E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y33efgEv");}
void  ccc::CC2x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y33pqrEv");}
void  ccc::CC2x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y33abcEv");}
ccc::CC2x13y3 ::~CC2x13y3(){ note_dtor("_ZN3ccc8CC2x13y3E", this);} // tgen
ccc::CC2x13y3 ::CC2x13y3(){ note_ctor("_ZN3ccc8CC2x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y3E, buf);
    ::ccc::CC2x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y3E);
    dp->::ccc::CC2x13y3::~CC2x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y3E(Test__ZN3ccc8CC2x13y3E, "_ZN3ccc8CC2x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y3C1Ev();
extern void _ZN3ccc8CC2x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y3E[] = {
  NSPAIR(_ZN3ccc8CC2x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y3E[];
extern void _ZN3ccc8CC2x13y33efgEv();
extern void _ZN3ccc8CC2x13y33abcEv();
extern void _ZN3ccc8CC2x13y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y33efgEv,_ZThn4_N3ccc8CC2x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y33efgEv,_ZThn4_N3ccc8CC2x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y3E[];
Class_Descriptor cd__ZN3ccc8CC2x13y3E = {  "_ZN3ccc8CC2x13y3E", // class name
  bases__ZN3ccc8CC2x13y3E, 2,
  &(vtc__ZN3ccc8CC2x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y4  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC2x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y43efgEv
  ~CC2x13y4(); // tgen
  CC2x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y4E) C1{ BC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y43pqrEv");}
void  ccc::CC2x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y43abcEv");}
void  ccc::CC2x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y43efgEv");}
ccc::CC2x13y4 ::~CC2x13y4(){ note_dtor("_ZN3ccc8CC2x13y4E", this);} // tgen
ccc::CC2x13y4 ::CC2x13y4(){ note_ctor("_ZN3ccc8CC2x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y4E, buf);
    ::ccc::CC2x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y4E);
    dp->::ccc::CC2x13y4::~CC2x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y4E(Test__ZN3ccc8CC2x13y4E, "_ZN3ccc8CC2x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y4C1Ev();
extern void _ZN3ccc8CC2x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y4E[] = {
  NSPAIR(_ZN3ccc8CC2x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y4E[];
extern void _ZN3ccc8CC2x13y43efgEv();
extern void _ZN3ccc8CC2x13y43abcEv();
extern void _ZN3ccc8CC2x13y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y43efgEv,_ZThn4_N3ccc8CC2x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y43efgEv,_ZThn4_N3ccc8CC2x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y4E[];
Class_Descriptor cd__ZN3ccc8CC2x13y4E = {  "_ZN3ccc8CC2x13y4E", // class name
  bases__ZN3ccc8CC2x13y4E, 2,
  &(vtc__ZN3ccc8CC2x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y5  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC2x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y53abcEv
  ~CC2x13y5(); // tgen
  CC2x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y5E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y53pqrEv");}
void  ccc::CC2x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y53efgEv");}
void  ccc::CC2x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y53abcEv");}
ccc::CC2x13y5 ::~CC2x13y5(){ note_dtor("_ZN3ccc8CC2x13y5E", this);} // tgen
ccc::CC2x13y5 ::CC2x13y5(){ note_ctor("_ZN3ccc8CC2x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y5E, buf);
    ::ccc::CC2x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y5E);
    dp->::ccc::CC2x13y5::~CC2x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y5E(Test__ZN3ccc8CC2x13y5E, "_ZN3ccc8CC2x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y5C1Ev();
extern void _ZN3ccc8CC2x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y5E[] = {
  NSPAIR(_ZN3ccc8CC2x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y5E[];
extern void _ZN3ccc8CC2x13y53efgEv();
extern void _ZN3ccc8CC2x13y53abcEv();
extern void _ZN3ccc8CC2x13y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y53efgEv,_ZThn4_N3ccc8CC2x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y53efgEv,_ZThn4_N3ccc8CC2x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y5E[];
Class_Descriptor cd__ZN3ccc8CC2x13y5E = {  "_ZN3ccc8CC2x13y5E", // class name
  bases__ZN3ccc8CC2x13y5E, 2,
  &(vtc__ZN3ccc8CC2x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y6  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x13y63efgEv
  ~CC2x13y6(); // tgen
  CC2x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y6E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y63abcEv");}
void  ccc::CC2x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y63efgEv");}
ccc::CC2x13y6 ::~CC2x13y6(){ note_dtor("_ZN3ccc8CC2x13y6E", this);} // tgen
ccc::CC2x13y6 ::CC2x13y6(){ note_ctor("_ZN3ccc8CC2x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y6E, buf);
    ::ccc::CC2x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y6E);
    dp->::ccc::CC2x13y6::~CC2x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y6E(Test__ZN3ccc8CC2x13y6E, "_ZN3ccc8CC2x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y6C1Ev();
extern void _ZN3ccc8CC2x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y6E[] = {
  NSPAIR(_ZN3ccc8CC2x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y6E[];
extern void _ZN3ccc8CC2x13y63efgEv();
extern void _ZN3ccc8CC2x13y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y63efgEv,_ZThn4_N3ccc8CC2x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y63efgEv,_ZThn4_N3ccc8CC2x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y6E[];
Class_Descriptor cd__ZN3ccc8CC2x13y6E = {  "_ZN3ccc8CC2x13y6E", // class name
  bases__ZN3ccc8CC2x13y6E, 2,
  &(vtc__ZN3ccc8CC2x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y7  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC2x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y73pqrEv
  ~CC2x13y7(); // tgen
  CC2x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y7E) C1{ BC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y73abcEv");}
void  ccc::CC2x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y73pqrEv");}
ccc::CC2x13y7 ::~CC2x13y7(){ note_dtor("_ZN3ccc8CC2x13y7E", this);} // tgen
ccc::CC2x13y7 ::CC2x13y7(){ note_ctor("_ZN3ccc8CC2x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y7E, buf);
    ::ccc::CC2x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y7E);
    dp->::ccc::CC2x13y7::~CC2x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y7E(Test__ZN3ccc8CC2x13y7E, "_ZN3ccc8CC2x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y7C1Ev();
extern void _ZN3ccc8CC2x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y7E[] = {
  NSPAIR(_ZN3ccc8CC2x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x13y73abcEv();
extern void _ZN3ccc8CC2x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y7E[];
Class_Descriptor cd__ZN3ccc8CC2x13y7E = {  "_ZN3ccc8CC2x13y7E", // class name
  bases__ZN3ccc8CC2x13y7E, 2,
  &(vtc__ZN3ccc8CC2x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y8  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x13y83abcEv
  ~CC2x13y8(); // tgen
  CC2x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y8E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y83efgEv");}
void  ccc::CC2x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x13y83abcEv");}
ccc::CC2x13y8 ::~CC2x13y8(){ note_dtor("_ZN3ccc8CC2x13y8E", this);} // tgen
ccc::CC2x13y8 ::CC2x13y8(){ note_ctor("_ZN3ccc8CC2x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y8E, buf);
    ::ccc::CC2x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y8E);
    dp->::ccc::CC2x13y8::~CC2x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y8E(Test__ZN3ccc8CC2x13y8E, "_ZN3ccc8CC2x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y8C1Ev();
extern void _ZN3ccc8CC2x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y8E[] = {
  NSPAIR(_ZN3ccc8CC2x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y8E[];
extern void _ZN3ccc8CC2x13y83efgEv();
extern void _ZN3ccc8CC2x13y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y83efgEv,_ZThn4_N3ccc8CC2x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y83efgEv,_ZThn4_N3ccc8CC2x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y8E[];
Class_Descriptor cd__ZN3ccc8CC2x13y8E = {  "_ZN3ccc8CC2x13y8E", // class name
  bases__ZN3ccc8CC2x13y8E, 2,
  &(vtc__ZN3ccc8CC2x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y9  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC2x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x13y93pqrEv
  ~CC2x13y9(); // tgen
  CC2x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x13y9E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x13y93efgEv");}
void  ccc::CC2x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x13y93pqrEv");}
ccc::CC2x13y9 ::~CC2x13y9(){ note_dtor("_ZN3ccc8CC2x13y9E", this);} // tgen
ccc::CC2x13y9 ::CC2x13y9(){ note_ctor("_ZN3ccc8CC2x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x13y9E, buf);
    ::ccc::CC2x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x13y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC2x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x13y9E);
    dp->::ccc::CC2x13y9::~CC2x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x13y9E(Test__ZN3ccc8CC2x13y9E, "_ZN3ccc8CC2x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x13y9C1Ev();
extern void _ZN3ccc8CC2x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x13y9E[] = {
  NSPAIR(_ZN3ccc8CC2x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC2x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y9E[];
extern void _ZN3ccc8CC2x13y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x13y93efgEv,_ZThn4_N3ccc8CC2x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x13y93efgEv,_ZThn4_N3ccc8CC2x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x13y9E[];
Class_Descriptor cd__ZN3ccc8CC2x13y9E = {  "_ZN3ccc8CC2x13y9E", // class name
  bases__ZN3ccc8CC2x13y9E, 2,
  &(vtc__ZN3ccc8CC2x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y10  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x13y103abcEv
  ~CC2x13y10(); // tgen
  CC2x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y10E) C1{ BC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y103pqrEv");}
void  ccc::CC2x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x13y103abcEv");}
ccc::CC2x13y10 ::~CC2x13y10(){ note_dtor("_ZN3ccc9CC2x13y10E", this);} // tgen
ccc::CC2x13y10 ::CC2x13y10(){ note_ctor("_ZN3ccc9CC2x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y10E, buf);
    ::ccc::CC2x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y10E);
    dp->::ccc::CC2x13y10::~CC2x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y10E(Test__ZN3ccc9CC2x13y10E, "_ZN3ccc9CC2x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y10C1Ev();
extern void _ZN3ccc9CC2x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y10E[] = {
  NSPAIR(_ZN3ccc9CC2x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x13y103abcEv();
extern void _ZN3ccc9CC2x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y10E[];
Class_Descriptor cd__ZN3ccc9CC2x13y10E = {  "_ZN3ccc9CC2x13y10E", // class name
  bases__ZN3ccc9CC2x13y10E, 2,
  &(vtc__ZN3ccc9CC2x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y11  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x13y113efgEv
  ~CC2x13y11(); // tgen
  CC2x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y11E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y113pqrEv");}
void  ccc::CC2x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x13y113efgEv");}
ccc::CC2x13y11 ::~CC2x13y11(){ note_dtor("_ZN3ccc9CC2x13y11E", this);} // tgen
ccc::CC2x13y11 ::CC2x13y11(){ note_ctor("_ZN3ccc9CC2x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y11E, buf);
    ::ccc::CC2x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y11E);
    dp->::ccc::CC2x13y11::~CC2x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y11E(Test__ZN3ccc9CC2x13y11E, "_ZN3ccc9CC2x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y11C1Ev();
extern void _ZN3ccc9CC2x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y11E[] = {
  NSPAIR(_ZN3ccc9CC2x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y11E[];
extern void _ZN3ccc9CC2x13y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y113efgEv,_ZThn4_N3ccc9CC2x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x13y113efgEv,_ZThn4_N3ccc9CC2x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y11E[];
Class_Descriptor cd__ZN3ccc9CC2x13y11E = {  "_ZN3ccc9CC2x13y11E", // class name
  bases__ZN3ccc9CC2x13y11E, 2,
  &(vtc__ZN3ccc9CC2x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y12  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC2x13y123abcEv
  ~CC2x13y12(); // tgen
  CC2x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y12E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x13y123abcEv");}
ccc::CC2x13y12 ::~CC2x13y12(){ note_dtor("_ZN3ccc9CC2x13y12E", this);} // tgen
ccc::CC2x13y12 ::CC2x13y12(){ note_ctor("_ZN3ccc9CC2x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y12E, buf);
    ::ccc::CC2x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y12E);
    dp->::ccc::CC2x13y12::~CC2x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y12E(Test__ZN3ccc9CC2x13y12E, "_ZN3ccc9CC2x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y12C1Ev();
extern void _ZN3ccc9CC2x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y12E[] = {
  NSPAIR(_ZN3ccc9CC2x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x13y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y12E[];
Class_Descriptor cd__ZN3ccc9CC2x13y12E = {  "_ZN3ccc9CC2x13y12E", // class name
  bases__ZN3ccc9CC2x13y12E, 2,
  &(vtc__ZN3ccc9CC2x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y13  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC2x13y133efgEv
  ~CC2x13y13(); // tgen
  CC2x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y13E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x13y133efgEv");}
ccc::CC2x13y13 ::~CC2x13y13(){ note_dtor("_ZN3ccc9CC2x13y13E", this);} // tgen
ccc::CC2x13y13 ::CC2x13y13(){ note_ctor("_ZN3ccc9CC2x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y13E, buf);
    ::ccc::CC2x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y13E);
    dp->::ccc::CC2x13y13::~CC2x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y13E(Test__ZN3ccc9CC2x13y13E, "_ZN3ccc9CC2x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y13C1Ev();
extern void _ZN3ccc9CC2x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y13E[] = {
  NSPAIR(_ZN3ccc9CC2x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y13E[];
extern void _ZN3ccc9CC2x13y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x13y133efgEv,_ZThn4_N3ccc9CC2x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x13y133efgEv,_ZThn4_N3ccc9CC2x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y13E[];
Class_Descriptor cd__ZN3ccc9CC2x13y13E = {  "_ZN3ccc9CC2x13y13E", // class name
  bases__ZN3ccc9CC2x13y13E, 2,
  &(vtc__ZN3ccc9CC2x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y14  : ::ccc::AA2 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC2x13y143pqrEv
  ~CC2x13y14(); // tgen
  CC2x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y14E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x13y143pqrEv");}
ccc::CC2x13y14 ::~CC2x13y14(){ note_dtor("_ZN3ccc9CC2x13y14E", this);} // tgen
ccc::CC2x13y14 ::CC2x13y14(){ note_ctor("_ZN3ccc9CC2x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y14E, buf);
    ::ccc::CC2x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y14E);
    dp->::ccc::CC2x13y14::~CC2x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y14E(Test__ZN3ccc9CC2x13y14E, "_ZN3ccc9CC2x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y14C1Ev();
extern void _ZN3ccc9CC2x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y14E[] = {
  NSPAIR(_ZN3ccc9CC2x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y14E[];
Class_Descriptor cd__ZN3ccc9CC2x13y14E = {  "_ZN3ccc9CC2x13y14E", // class name
  bases__ZN3ccc9CC2x13y14E, 2,
  &(vtc__ZN3ccc9CC2x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x13y15  : ::ccc::AA2 , ::ccc::BB13 {
  ~CC2x13y15(); // tgen
  CC2x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x13y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x13y15 ::~CC2x13y15(){ note_dtor("_ZN3ccc9CC2x13y15E", this);} // tgen
ccc::CC2x13y15 ::CC2x13y15(){ note_ctor("_ZN3ccc9CC2x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x13y15E, buf);
    ::ccc::CC2x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x13y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC2x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x13y15E);
    dp->::ccc::CC2x13y15::~CC2x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x13y15E(Test__ZN3ccc9CC2x13y15E, "_ZN3ccc9CC2x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x13y15C1Ev();
extern void _ZN3ccc9CC2x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x13y15E[] = {
  NSPAIR(_ZN3ccc9CC2x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC2x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x13y15E[];
Class_Descriptor cd__ZN3ccc9CC2x13y15E = {  "_ZN3ccc9CC2x13y15E", // class name
  bases__ZN3ccc9CC2x13y15E, 2,
  &(vtc__ZN3ccc9CC2x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y0  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y03pqrEv
  ~CC2x14y0(); // tgen
  CC2x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y0E) C1{ BC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y03abcEv");}
void  ccc::CC2x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y03efgEv");}
void  ccc::CC2x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y03pqrEv");}
ccc::CC2x14y0 ::~CC2x14y0(){ note_dtor("_ZN3ccc8CC2x14y0E", this);} // tgen
ccc::CC2x14y0 ::CC2x14y0(){ note_ctor("_ZN3ccc8CC2x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y0E, buf);
    ::ccc::CC2x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y0E);
    dp->::ccc::CC2x14y0::~CC2x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y0E(Test__ZN3ccc8CC2x14y0E, "_ZN3ccc8CC2x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y0C1Ev();
extern void _ZN3ccc8CC2x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y0E[] = {
  NSPAIR(_ZN3ccc8CC2x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y0E[];
extern void _ZN3ccc8CC2x14y03efgEv();
extern void _ZN3ccc8CC2x14y03abcEv();
extern void _ZN3ccc8CC2x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y03pqrEv,_ZThn4_N3ccc8CC2x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y03pqrEv,_ZThn4_N3ccc8CC2x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y0E[];
Class_Descriptor cd__ZN3ccc8CC2x14y0E = {  "_ZN3ccc8CC2x14y0E", // class name
  bases__ZN3ccc8CC2x14y0E, 2,
  &(vtc__ZN3ccc8CC2x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y1  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x14y13efgEv
  ~CC2x14y1(); // tgen
  CC2x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y1E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y13abcEv");}
void  ccc::CC2x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y13pqrEv");}
void  ccc::CC2x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y13efgEv");}
ccc::CC2x14y1 ::~CC2x14y1(){ note_dtor("_ZN3ccc8CC2x14y1E", this);} // tgen
ccc::CC2x14y1 ::CC2x14y1(){ note_ctor("_ZN3ccc8CC2x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y1E, buf);
    ::ccc::CC2x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y1E);
    dp->::ccc::CC2x14y1::~CC2x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y1E(Test__ZN3ccc8CC2x14y1E, "_ZN3ccc8CC2x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y1C1Ev();
extern void _ZN3ccc8CC2x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y1E[] = {
  NSPAIR(_ZN3ccc8CC2x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y1E[];
extern void _ZN3ccc8CC2x14y13efgEv();
extern void _ZN3ccc8CC2x14y13abcEv();
extern void _ZN3ccc8CC2x14y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y13pqrEv,_ZThn4_N3ccc8CC2x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y13pqrEv,_ZThn4_N3ccc8CC2x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y1E[];
Class_Descriptor cd__ZN3ccc8CC2x14y1E = {  "_ZN3ccc8CC2x14y1E", // class name
  bases__ZN3ccc8CC2x14y1E, 2,
  &(vtc__ZN3ccc8CC2x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y2  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y23pqrEv
  ~CC2x14y2(); // tgen
  CC2x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y2E) C1{ BC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y23efgEv");}
void  ccc::CC2x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y23abcEv");}
void  ccc::CC2x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y23pqrEv");}
ccc::CC2x14y2 ::~CC2x14y2(){ note_dtor("_ZN3ccc8CC2x14y2E", this);} // tgen
ccc::CC2x14y2 ::CC2x14y2(){ note_ctor("_ZN3ccc8CC2x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y2E, buf);
    ::ccc::CC2x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y2E);
    dp->::ccc::CC2x14y2::~CC2x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y2E(Test__ZN3ccc8CC2x14y2E, "_ZN3ccc8CC2x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y2C1Ev();
extern void _ZN3ccc8CC2x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y2E[] = {
  NSPAIR(_ZN3ccc8CC2x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y2E[];
extern void _ZN3ccc8CC2x14y23efgEv();
extern void _ZN3ccc8CC2x14y23abcEv();
extern void _ZN3ccc8CC2x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y23pqrEv,_ZThn4_N3ccc8CC2x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y23pqrEv,_ZThn4_N3ccc8CC2x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y2E[];
Class_Descriptor cd__ZN3ccc8CC2x14y2E = {  "_ZN3ccc8CC2x14y2E", // class name
  bases__ZN3ccc8CC2x14y2E, 2,
  &(vtc__ZN3ccc8CC2x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y3  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x14y33abcEv
  ~CC2x14y3(); // tgen
  CC2x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y3E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y33efgEv");}
void  ccc::CC2x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y33pqrEv");}
void  ccc::CC2x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y33abcEv");}
ccc::CC2x14y3 ::~CC2x14y3(){ note_dtor("_ZN3ccc8CC2x14y3E", this);} // tgen
ccc::CC2x14y3 ::CC2x14y3(){ note_ctor("_ZN3ccc8CC2x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y3E, buf);
    ::ccc::CC2x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y3E);
    dp->::ccc::CC2x14y3::~CC2x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y3E(Test__ZN3ccc8CC2x14y3E, "_ZN3ccc8CC2x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y3C1Ev();
extern void _ZN3ccc8CC2x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y3E[] = {
  NSPAIR(_ZN3ccc8CC2x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y3E[];
extern void _ZN3ccc8CC2x14y33efgEv();
extern void _ZN3ccc8CC2x14y33abcEv();
extern void _ZN3ccc8CC2x14y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y33pqrEv,_ZThn4_N3ccc8CC2x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y33pqrEv,_ZThn4_N3ccc8CC2x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y3E[];
Class_Descriptor cd__ZN3ccc8CC2x14y3E = {  "_ZN3ccc8CC2x14y3E", // class name
  bases__ZN3ccc8CC2x14y3E, 2,
  &(vtc__ZN3ccc8CC2x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y4  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC2x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y43efgEv
  ~CC2x14y4(); // tgen
  CC2x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y4E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y43pqrEv");}
void  ccc::CC2x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y43abcEv");}
void  ccc::CC2x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y43efgEv");}
ccc::CC2x14y4 ::~CC2x14y4(){ note_dtor("_ZN3ccc8CC2x14y4E", this);} // tgen
ccc::CC2x14y4 ::CC2x14y4(){ note_ctor("_ZN3ccc8CC2x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y4E, buf);
    ::ccc::CC2x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y4E);
    dp->::ccc::CC2x14y4::~CC2x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y4E(Test__ZN3ccc8CC2x14y4E, "_ZN3ccc8CC2x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y4C1Ev();
extern void _ZN3ccc8CC2x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y4E[] = {
  NSPAIR(_ZN3ccc8CC2x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y4E[];
extern void _ZN3ccc8CC2x14y43efgEv();
extern void _ZN3ccc8CC2x14y43abcEv();
extern void _ZN3ccc8CC2x14y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y43pqrEv,_ZThn4_N3ccc8CC2x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y43pqrEv,_ZThn4_N3ccc8CC2x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y4E[];
Class_Descriptor cd__ZN3ccc8CC2x14y4E = {  "_ZN3ccc8CC2x14y4E", // class name
  bases__ZN3ccc8CC2x14y4E, 2,
  &(vtc__ZN3ccc8CC2x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y5  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC2x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y53abcEv
  ~CC2x14y5(); // tgen
  CC2x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y5E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y53pqrEv");}
void  ccc::CC2x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y53efgEv");}
void  ccc::CC2x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y53abcEv");}
ccc::CC2x14y5 ::~CC2x14y5(){ note_dtor("_ZN3ccc8CC2x14y5E", this);} // tgen
ccc::CC2x14y5 ::CC2x14y5(){ note_ctor("_ZN3ccc8CC2x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y5E, buf);
    ::ccc::CC2x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y5E);
    dp->::ccc::CC2x14y5::~CC2x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y5E(Test__ZN3ccc8CC2x14y5E, "_ZN3ccc8CC2x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y5C1Ev();
extern void _ZN3ccc8CC2x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y5E[] = {
  NSPAIR(_ZN3ccc8CC2x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y5E[];
extern void _ZN3ccc8CC2x14y53efgEv();
extern void _ZN3ccc8CC2x14y53abcEv();
extern void _ZN3ccc8CC2x14y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y53pqrEv,_ZThn4_N3ccc8CC2x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y53pqrEv,_ZThn4_N3ccc8CC2x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y5E[];
Class_Descriptor cd__ZN3ccc8CC2x14y5E = {  "_ZN3ccc8CC2x14y5E", // class name
  bases__ZN3ccc8CC2x14y5E, 2,
  &(vtc__ZN3ccc8CC2x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y6  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x14y63efgEv
  ~CC2x14y6(); // tgen
  CC2x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y6E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y63abcEv");}
void  ccc::CC2x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y63efgEv");}
ccc::CC2x14y6 ::~CC2x14y6(){ note_dtor("_ZN3ccc8CC2x14y6E", this);} // tgen
ccc::CC2x14y6 ::CC2x14y6(){ note_ctor("_ZN3ccc8CC2x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y6E, buf);
    ::ccc::CC2x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y6E);
    dp->::ccc::CC2x14y6::~CC2x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y6E(Test__ZN3ccc8CC2x14y6E, "_ZN3ccc8CC2x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y6C1Ev();
extern void _ZN3ccc8CC2x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y6E[] = {
  NSPAIR(_ZN3ccc8CC2x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y6E[];
extern void _ZN3ccc8CC2x14y63efgEv();
extern void _ZN3ccc8CC2x14y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y6E[];
Class_Descriptor cd__ZN3ccc8CC2x14y6E = {  "_ZN3ccc8CC2x14y6E", // class name
  bases__ZN3ccc8CC2x14y6E, 2,
  &(vtc__ZN3ccc8CC2x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y7  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC2x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y73pqrEv
  ~CC2x14y7(); // tgen
  CC2x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y7E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y73abcEv");}
void  ccc::CC2x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y73pqrEv");}
ccc::CC2x14y7 ::~CC2x14y7(){ note_dtor("_ZN3ccc8CC2x14y7E", this);} // tgen
ccc::CC2x14y7 ::CC2x14y7(){ note_ctor("_ZN3ccc8CC2x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y7E, buf);
    ::ccc::CC2x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y7E);
    dp->::ccc::CC2x14y7::~CC2x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y7E(Test__ZN3ccc8CC2x14y7E, "_ZN3ccc8CC2x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y7C1Ev();
extern void _ZN3ccc8CC2x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y7E[] = {
  NSPAIR(_ZN3ccc8CC2x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x14y73abcEv();
extern void _ZN3ccc8CC2x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y73pqrEv,_ZThn4_N3ccc8CC2x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y73pqrEv,_ZThn4_N3ccc8CC2x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y7E[];
Class_Descriptor cd__ZN3ccc8CC2x14y7E = {  "_ZN3ccc8CC2x14y7E", // class name
  bases__ZN3ccc8CC2x14y7E, 2,
  &(vtc__ZN3ccc8CC2x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y8  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x14y83abcEv
  ~CC2x14y8(); // tgen
  CC2x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y8E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y83efgEv");}
void  ccc::CC2x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x14y83abcEv");}
ccc::CC2x14y8 ::~CC2x14y8(){ note_dtor("_ZN3ccc8CC2x14y8E", this);} // tgen
ccc::CC2x14y8 ::CC2x14y8(){ note_ctor("_ZN3ccc8CC2x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y8E, buf);
    ::ccc::CC2x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y8E);
    dp->::ccc::CC2x14y8::~CC2x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y8E(Test__ZN3ccc8CC2x14y8E, "_ZN3ccc8CC2x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y8C1Ev();
extern void _ZN3ccc8CC2x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y8E[] = {
  NSPAIR(_ZN3ccc8CC2x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y8E[];
extern void _ZN3ccc8CC2x14y83efgEv();
extern void _ZN3ccc8CC2x14y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y8E[];
Class_Descriptor cd__ZN3ccc8CC2x14y8E = {  "_ZN3ccc8CC2x14y8E", // class name
  bases__ZN3ccc8CC2x14y8E, 2,
  &(vtc__ZN3ccc8CC2x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y9  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC2x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x14y93pqrEv
  ~CC2x14y9(); // tgen
  CC2x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x14y9E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x14y93efgEv");}
void  ccc::CC2x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x14y93pqrEv");}
ccc::CC2x14y9 ::~CC2x14y9(){ note_dtor("_ZN3ccc8CC2x14y9E", this);} // tgen
ccc::CC2x14y9 ::CC2x14y9(){ note_ctor("_ZN3ccc8CC2x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC2x14y9E, buf);
    ::ccc::CC2x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC2x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x14y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC2x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x14y9E);
    dp->::ccc::CC2x14y9::~CC2x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x14y9E(Test__ZN3ccc8CC2x14y9E, "_ZN3ccc8CC2x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC2x14y9C1Ev();
extern void _ZN3ccc8CC2x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x14y9E[] = {
  NSPAIR(_ZN3ccc8CC2x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC2x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y9E[];
extern void _ZN3ccc8CC2x14y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC2x14y93pqrEv,_ZThn4_N3ccc8CC2x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC2x14y93pqrEv,_ZThn4_N3ccc8CC2x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x14y9E[];
Class_Descriptor cd__ZN3ccc8CC2x14y9E = {  "_ZN3ccc8CC2x14y9E", // class name
  bases__ZN3ccc8CC2x14y9E, 2,
  &(vtc__ZN3ccc8CC2x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC2x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y10  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x14y103abcEv
  ~CC2x14y10(); // tgen
  CC2x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y10E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y103pqrEv");}
void  ccc::CC2x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x14y103abcEv");}
ccc::CC2x14y10 ::~CC2x14y10(){ note_dtor("_ZN3ccc9CC2x14y10E", this);} // tgen
ccc::CC2x14y10 ::CC2x14y10(){ note_ctor("_ZN3ccc9CC2x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y10E, buf);
    ::ccc::CC2x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y10E);
    dp->::ccc::CC2x14y10::~CC2x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y10E(Test__ZN3ccc9CC2x14y10E, "_ZN3ccc9CC2x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y10C1Ev();
extern void _ZN3ccc9CC2x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y10E[] = {
  NSPAIR(_ZN3ccc9CC2x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x14y103abcEv();
extern void _ZN3ccc9CC2x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y103pqrEv,_ZThn4_N3ccc9CC2x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x14y103pqrEv,_ZThn4_N3ccc9CC2x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y10E[];
Class_Descriptor cd__ZN3ccc9CC2x14y10E = {  "_ZN3ccc9CC2x14y10E", // class name
  bases__ZN3ccc9CC2x14y10E, 2,
  &(vtc__ZN3ccc9CC2x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y11  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x14y113efgEv
  ~CC2x14y11(); // tgen
  CC2x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y11E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC2x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y113pqrEv");}
void  ccc::CC2x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x14y113efgEv");}
ccc::CC2x14y11 ::~CC2x14y11(){ note_dtor("_ZN3ccc9CC2x14y11E", this);} // tgen
ccc::CC2x14y11 ::CC2x14y11(){ note_ctor("_ZN3ccc9CC2x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y11E, buf);
    ::ccc::CC2x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y11E);
    dp->::ccc::CC2x14y11::~CC2x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y11E(Test__ZN3ccc9CC2x14y11E, "_ZN3ccc9CC2x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y11C1Ev();
extern void _ZN3ccc9CC2x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y11E[] = {
  NSPAIR(_ZN3ccc9CC2x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y11E[];
extern void _ZN3ccc9CC2x14y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y113pqrEv,_ZThn4_N3ccc9CC2x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x14y113pqrEv,_ZThn4_N3ccc9CC2x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y11E[];
Class_Descriptor cd__ZN3ccc9CC2x14y11E = {  "_ZN3ccc9CC2x14y11E", // class name
  bases__ZN3ccc9CC2x14y11E, 2,
  &(vtc__ZN3ccc9CC2x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y12  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC2x14y123abcEv
  ~CC2x14y12(); // tgen
  CC2x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y12E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x14y123abcEv");}
ccc::CC2x14y12 ::~CC2x14y12(){ note_dtor("_ZN3ccc9CC2x14y12E", this);} // tgen
ccc::CC2x14y12 ::CC2x14y12(){ note_ctor("_ZN3ccc9CC2x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y12E, buf);
    ::ccc::CC2x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y12E);
    dp->::ccc::CC2x14y12::~CC2x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y12E(Test__ZN3ccc9CC2x14y12E, "_ZN3ccc9CC2x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y12C1Ev();
extern void _ZN3ccc9CC2x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y12E[] = {
  NSPAIR(_ZN3ccc9CC2x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x14y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y12E[];
Class_Descriptor cd__ZN3ccc9CC2x14y12E = {  "_ZN3ccc9CC2x14y12E", // class name
  bases__ZN3ccc9CC2x14y12E, 2,
  &(vtc__ZN3ccc9CC2x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y13  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC2x14y133efgEv
  ~CC2x14y13(); // tgen
  CC2x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y13E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC2x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x14y133efgEv");}
ccc::CC2x14y13 ::~CC2x14y13(){ note_dtor("_ZN3ccc9CC2x14y13E", this);} // tgen
ccc::CC2x14y13 ::CC2x14y13(){ note_ctor("_ZN3ccc9CC2x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y13E, buf);
    ::ccc::CC2x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y13E);
    dp->::ccc::CC2x14y13::~CC2x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y13E(Test__ZN3ccc9CC2x14y13E, "_ZN3ccc9CC2x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y13C1Ev();
extern void _ZN3ccc9CC2x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y13E[] = {
  NSPAIR(_ZN3ccc9CC2x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y13E[];
extern void _ZN3ccc9CC2x14y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y13E[];
Class_Descriptor cd__ZN3ccc9CC2x14y13E = {  "_ZN3ccc9CC2x14y13E", // class name
  bases__ZN3ccc9CC2x14y13E, 2,
  &(vtc__ZN3ccc9CC2x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y14  : ::ccc::AA2 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC2x14y143pqrEv
  ~CC2x14y14(); // tgen
  CC2x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y14E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC2x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x14y143pqrEv");}
ccc::CC2x14y14 ::~CC2x14y14(){ note_dtor("_ZN3ccc9CC2x14y14E", this);} // tgen
ccc::CC2x14y14 ::CC2x14y14(){ note_ctor("_ZN3ccc9CC2x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y14E, buf);
    ::ccc::CC2x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y14E);
    dp->::ccc::CC2x14y14::~CC2x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y14E(Test__ZN3ccc9CC2x14y14E, "_ZN3ccc9CC2x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y14C1Ev();
extern void _ZN3ccc9CC2x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y14E[] = {
  NSPAIR(_ZN3ccc9CC2x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC2x14y143pqrEv,_ZThn4_N3ccc9CC2x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC2x14y143pqrEv,_ZThn4_N3ccc9CC2x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y14E[];
Class_Descriptor cd__ZN3ccc9CC2x14y14E = {  "_ZN3ccc9CC2x14y14E", // class name
  bases__ZN3ccc9CC2x14y14E, 2,
  &(vtc__ZN3ccc9CC2x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x14y15  : ::ccc::AA2 , ::ccc::BB14 {
  ~CC2x14y15(); // tgen
  CC2x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x14y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC2x14y15 ::~CC2x14y15(){ note_dtor("_ZN3ccc9CC2x14y15E", this);} // tgen
ccc::CC2x14y15 ::CC2x14y15(){ note_ctor("_ZN3ccc9CC2x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC2x14y15E, buf);
    ::ccc::CC2x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC2x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x14y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC2x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x14y15E);
    dp->::ccc::CC2x14y15::~CC2x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x14y15E(Test__ZN3ccc9CC2x14y15E, "_ZN3ccc9CC2x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC2x14y15C1Ev();
extern void _ZN3ccc9CC2x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x14y15E[] = {
  NSPAIR(_ZN3ccc9CC2x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC2x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x14y15E[];
Class_Descriptor cd__ZN3ccc9CC2x14y15E = {  "_ZN3ccc9CC2x14y15E", // class name
  bases__ZN3ccc9CC2x14y15E, 2,
  &(vtc__ZN3ccc9CC2x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC2x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y0  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y03pqrEv
  ~CC2x15y0(); // tgen
  CC2x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y0E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y03abcEv");}
void  ccc::CC2x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y03efgEv");}
void  ccc::CC2x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y03pqrEv");}
ccc::CC2x15y0 ::~CC2x15y0(){ note_dtor("_ZN3ccc8CC2x15y0E", this);} // tgen
ccc::CC2x15y0 ::CC2x15y0(){ note_ctor("_ZN3ccc8CC2x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y0E, buf);
    ::ccc::CC2x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y0E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y0E);
    dp->::ccc::CC2x15y0::~CC2x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y0E(Test__ZN3ccc8CC2x15y0E, "_ZN3ccc8CC2x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y0C1Ev();
extern void _ZN3ccc8CC2x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y0E[] = {
  NSPAIR(_ZN3ccc8CC2x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y0E[];
extern void _ZN3ccc8CC2x15y03efgEv();
extern void _ZN3ccc8CC2x15y03abcEv();
extern void _ZN3ccc8CC2x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y0E[];
Class_Descriptor cd__ZN3ccc8CC2x15y0E = {  "_ZN3ccc8CC2x15y0E", // class name
  bases__ZN3ccc8CC2x15y0E, 2,
  &(vtc__ZN3ccc8CC2x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y1  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x15y13efgEv
  ~CC2x15y1(); // tgen
  CC2x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y1E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y13abcEv");}
void  ccc::CC2x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y13pqrEv");}
void  ccc::CC2x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y13efgEv");}
ccc::CC2x15y1 ::~CC2x15y1(){ note_dtor("_ZN3ccc8CC2x15y1E", this);} // tgen
ccc::CC2x15y1 ::CC2x15y1(){ note_ctor("_ZN3ccc8CC2x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y1E, buf);
    ::ccc::CC2x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y1E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y1E);
    dp->::ccc::CC2x15y1::~CC2x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y1E(Test__ZN3ccc8CC2x15y1E, "_ZN3ccc8CC2x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y1C1Ev();
extern void _ZN3ccc8CC2x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y1E[] = {
  NSPAIR(_ZN3ccc8CC2x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y1E[];
extern void _ZN3ccc8CC2x15y13efgEv();
extern void _ZN3ccc8CC2x15y13abcEv();
extern void _ZN3ccc8CC2x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y1E[];
Class_Descriptor cd__ZN3ccc8CC2x15y1E = {  "_ZN3ccc8CC2x15y1E", // class name
  bases__ZN3ccc8CC2x15y1E, 2,
  &(vtc__ZN3ccc8CC2x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y2  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y23pqrEv
  ~CC2x15y2(); // tgen
  CC2x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y2E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y23efgEv");}
void  ccc::CC2x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y23abcEv");}
void  ccc::CC2x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y23pqrEv");}
ccc::CC2x15y2 ::~CC2x15y2(){ note_dtor("_ZN3ccc8CC2x15y2E", this);} // tgen
ccc::CC2x15y2 ::CC2x15y2(){ note_ctor("_ZN3ccc8CC2x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y2E, buf);
    ::ccc::CC2x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y2E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y2E);
    dp->::ccc::CC2x15y2::~CC2x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y2E(Test__ZN3ccc8CC2x15y2E, "_ZN3ccc8CC2x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y2C1Ev();
extern void _ZN3ccc8CC2x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y2E[] = {
  NSPAIR(_ZN3ccc8CC2x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y2E[];
extern void _ZN3ccc8CC2x15y23efgEv();
extern void _ZN3ccc8CC2x15y23abcEv();
extern void _ZN3ccc8CC2x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y2E[];
Class_Descriptor cd__ZN3ccc8CC2x15y2E = {  "_ZN3ccc8CC2x15y2E", // class name
  bases__ZN3ccc8CC2x15y2E, 2,
  &(vtc__ZN3ccc8CC2x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y3  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x15y33abcEv
  ~CC2x15y3(); // tgen
  CC2x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y3E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y33efgEv");}
void  ccc::CC2x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y33pqrEv");}
void  ccc::CC2x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y33abcEv");}
ccc::CC2x15y3 ::~CC2x15y3(){ note_dtor("_ZN3ccc8CC2x15y3E", this);} // tgen
ccc::CC2x15y3 ::CC2x15y3(){ note_ctor("_ZN3ccc8CC2x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y3E, buf);
    ::ccc::CC2x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y3E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y3E);
    dp->::ccc::CC2x15y3::~CC2x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y3E(Test__ZN3ccc8CC2x15y3E, "_ZN3ccc8CC2x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y3C1Ev();
extern void _ZN3ccc8CC2x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y3E[] = {
  NSPAIR(_ZN3ccc8CC2x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y3E[];
extern void _ZN3ccc8CC2x15y33efgEv();
extern void _ZN3ccc8CC2x15y33abcEv();
extern void _ZN3ccc8CC2x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y3E[];
Class_Descriptor cd__ZN3ccc8CC2x15y3E = {  "_ZN3ccc8CC2x15y3E", // class name
  bases__ZN3ccc8CC2x15y3E, 2,
  &(vtc__ZN3ccc8CC2x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y4  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC2x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC2x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y43efgEv
  ~CC2x15y4(); // tgen
  CC2x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y4E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y43pqrEv");}
void  ccc::CC2x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y43abcEv");}
void  ccc::CC2x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y43efgEv");}
ccc::CC2x15y4 ::~CC2x15y4(){ note_dtor("_ZN3ccc8CC2x15y4E", this);} // tgen
ccc::CC2x15y4 ::CC2x15y4(){ note_ctor("_ZN3ccc8CC2x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y4E, buf);
    ::ccc::CC2x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y4E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y4E);
    dp->::ccc::CC2x15y4::~CC2x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y4E(Test__ZN3ccc8CC2x15y4E, "_ZN3ccc8CC2x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y4C1Ev();
extern void _ZN3ccc8CC2x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y4E[] = {
  NSPAIR(_ZN3ccc8CC2x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y4E[];
extern void _ZN3ccc8CC2x15y43efgEv();
extern void _ZN3ccc8CC2x15y43abcEv();
extern void _ZN3ccc8CC2x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y4E[];
Class_Descriptor cd__ZN3ccc8CC2x15y4E = {  "_ZN3ccc8CC2x15y4E", // class name
  bases__ZN3ccc8CC2x15y4E, 2,
  &(vtc__ZN3ccc8CC2x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y5  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC2x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC2x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y53abcEv
  ~CC2x15y5(); // tgen
  CC2x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y5E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC2x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y53pqrEv");}
void  ccc::CC2x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y53efgEv");}
void  ccc::CC2x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y53abcEv");}
ccc::CC2x15y5 ::~CC2x15y5(){ note_dtor("_ZN3ccc8CC2x15y5E", this);} // tgen
ccc::CC2x15y5 ::CC2x15y5(){ note_ctor("_ZN3ccc8CC2x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y5E, buf);
    ::ccc::CC2x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y5E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y5E);
    dp->::ccc::CC2x15y5::~CC2x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y5E(Test__ZN3ccc8CC2x15y5E, "_ZN3ccc8CC2x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y5C1Ev();
extern void _ZN3ccc8CC2x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y5E[] = {
  NSPAIR(_ZN3ccc8CC2x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y5E[];
extern void _ZN3ccc8CC2x15y53efgEv();
extern void _ZN3ccc8CC2x15y53abcEv();
extern void _ZN3ccc8CC2x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y5E[];
Class_Descriptor cd__ZN3ccc8CC2x15y5E = {  "_ZN3ccc8CC2x15y5E", // class name
  bases__ZN3ccc8CC2x15y5E, 2,
  &(vtc__ZN3ccc8CC2x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y6  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC2x15y63efgEv
  ~CC2x15y6(); // tgen
  CC2x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y6E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y63abcEv");}
void  ccc::CC2x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y63efgEv");}
ccc::CC2x15y6 ::~CC2x15y6(){ note_dtor("_ZN3ccc8CC2x15y6E", this);} // tgen
ccc::CC2x15y6 ::CC2x15y6(){ note_ctor("_ZN3ccc8CC2x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y6E, buf);
    ::ccc::CC2x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y6E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y6E);
    dp->::ccc::CC2x15y6::~CC2x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y6E(Test__ZN3ccc8CC2x15y6E, "_ZN3ccc8CC2x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y6C1Ev();
extern void _ZN3ccc8CC2x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y6E[] = {
  NSPAIR(_ZN3ccc8CC2x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y6E[];
extern void _ZN3ccc8CC2x15y63efgEv();
extern void _ZN3ccc8CC2x15y63abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y6E[];
Class_Descriptor cd__ZN3ccc8CC2x15y6E = {  "_ZN3ccc8CC2x15y6E", // class name
  bases__ZN3ccc8CC2x15y6E, 2,
  &(vtc__ZN3ccc8CC2x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y7  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC2x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y73pqrEv
  ~CC2x15y7(); // tgen
  CC2x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y7E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y73abcEv");}
void  ccc::CC2x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y73pqrEv");}
ccc::CC2x15y7 ::~CC2x15y7(){ note_dtor("_ZN3ccc8CC2x15y7E", this);} // tgen
ccc::CC2x15y7 ::CC2x15y7(){ note_ctor("_ZN3ccc8CC2x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y7E, buf);
    ::ccc::CC2x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y7E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y7E);
    dp->::ccc::CC2x15y7::~CC2x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y7E(Test__ZN3ccc8CC2x15y7E, "_ZN3ccc8CC2x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y7C1Ev();
extern void _ZN3ccc8CC2x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y7E[] = {
  NSPAIR(_ZN3ccc8CC2x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y7E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc8CC2x15y73abcEv();
extern void _ZN3ccc8CC2x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y7E[];
Class_Descriptor cd__ZN3ccc8CC2x15y7E = {  "_ZN3ccc8CC2x15y7E", // class name
  bases__ZN3ccc8CC2x15y7E, 2,
  &(vtc__ZN3ccc8CC2x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y8  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC2x15y83abcEv
  ~CC2x15y8(); // tgen
  CC2x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y8E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y83efgEv");}
void  ccc::CC2x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC2x15y83abcEv");}
ccc::CC2x15y8 ::~CC2x15y8(){ note_dtor("_ZN3ccc8CC2x15y8E", this);} // tgen
ccc::CC2x15y8 ::CC2x15y8(){ note_ctor("_ZN3ccc8CC2x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y8E, buf);
    ::ccc::CC2x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y8E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y8E);
    dp->::ccc::CC2x15y8::~CC2x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y8E(Test__ZN3ccc8CC2x15y8E, "_ZN3ccc8CC2x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y8C1Ev();
extern void _ZN3ccc8CC2x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y8E[] = {
  NSPAIR(_ZN3ccc8CC2x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y8E[];
extern void _ZN3ccc8CC2x15y83efgEv();
extern void _ZN3ccc8CC2x15y83abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y8E[];
Class_Descriptor cd__ZN3ccc8CC2x15y8E = {  "_ZN3ccc8CC2x15y8E", // class name
  bases__ZN3ccc8CC2x15y8E, 2,
  &(vtc__ZN3ccc8CC2x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y9  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC2x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC2x15y93pqrEv
  ~CC2x15y9(); // tgen
  CC2x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC2x15y9E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC2x15y93efgEv");}
void  ccc::CC2x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC2x15y93pqrEv");}
ccc::CC2x15y9 ::~CC2x15y9(){ note_dtor("_ZN3ccc8CC2x15y9E", this);} // tgen
ccc::CC2x15y9 ::CC2x15y9(){ note_ctor("_ZN3ccc8CC2x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC2x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC2x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC2x15y9E, buf);
    ::ccc::CC2x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC2x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC2x15y9E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc8CC2x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC2x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC2x15y9E);
    dp->::ccc::CC2x15y9::~CC2x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC2x15y9E(Test__ZN3ccc8CC2x15y9E, "_ZN3ccc8CC2x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC2x15y9C1Ev();
extern void _ZN3ccc8CC2x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC2x15y9E[] = {
  NSPAIR(_ZN3ccc8CC2x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC2x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC2x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y9E[];
extern void _ZN3ccc8CC2x15y93efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc8CC2x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC2x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC2x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC2x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC2x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC2x15y9E[];
Class_Descriptor cd__ZN3ccc8CC2x15y9E = {  "_ZN3ccc8CC2x15y9E", // class name
  bases__ZN3ccc8CC2x15y9E, 2,
  &(vtc__ZN3ccc8CC2x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC2x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC2x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y10  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC2x15y103abcEv
  ~CC2x15y10(); // tgen
  CC2x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y10E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y103pqrEv");}
void  ccc::CC2x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x15y103abcEv");}
ccc::CC2x15y10 ::~CC2x15y10(){ note_dtor("_ZN3ccc9CC2x15y10E", this);} // tgen
ccc::CC2x15y10 ::CC2x15y10(){ note_ctor("_ZN3ccc9CC2x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y10E, buf);
    ::ccc::CC2x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y10E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y10E);
    dp->::ccc::CC2x15y10::~CC2x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y10E(Test__ZN3ccc9CC2x15y10E, "_ZN3ccc9CC2x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y10C1Ev();
extern void _ZN3ccc9CC2x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y10E[] = {
  NSPAIR(_ZN3ccc9CC2x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y10E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x15y103abcEv();
extern void _ZN3ccc9CC2x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y10E[];
Class_Descriptor cd__ZN3ccc9CC2x15y10E = {  "_ZN3ccc9CC2x15y10E", // class name
  bases__ZN3ccc9CC2x15y10E, 2,
  &(vtc__ZN3ccc9CC2x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y11  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC2x15y113efgEv
  ~CC2x15y11(); // tgen
  CC2x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y11E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC2x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y113pqrEv");}
void  ccc::CC2x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x15y113efgEv");}
ccc::CC2x15y11 ::~CC2x15y11(){ note_dtor("_ZN3ccc9CC2x15y11E", this);} // tgen
ccc::CC2x15y11 ::CC2x15y11(){ note_ctor("_ZN3ccc9CC2x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y11E, buf);
    ::ccc::CC2x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y11E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y11E);
    dp->::ccc::CC2x15y11::~CC2x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y11E(Test__ZN3ccc9CC2x15y11E, "_ZN3ccc9CC2x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y11C1Ev();
extern void _ZN3ccc9CC2x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y11E[] = {
  NSPAIR(_ZN3ccc9CC2x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y11E[];
extern void _ZN3ccc9CC2x15y113efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y11E[];
Class_Descriptor cd__ZN3ccc9CC2x15y11E = {  "_ZN3ccc9CC2x15y11E", // class name
  bases__ZN3ccc9CC2x15y11E, 2,
  &(vtc__ZN3ccc9CC2x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y12  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC2x15y123abcEv
  ~CC2x15y12(); // tgen
  CC2x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y12E) C1{ BC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC2x15y123abcEv");}
ccc::CC2x15y12 ::~CC2x15y12(){ note_dtor("_ZN3ccc9CC2x15y12E", this);} // tgen
ccc::CC2x15y12 ::CC2x15y12(){ note_ctor("_ZN3ccc9CC2x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y12E, buf);
    ::ccc::CC2x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y12E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y12E);
    dp->::ccc::CC2x15y12::~CC2x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y12E(Test__ZN3ccc9CC2x15y12E, "_ZN3ccc9CC2x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y12C1Ev();
extern void _ZN3ccc9CC2x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y12E[] = {
  NSPAIR(_ZN3ccc9CC2x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y12E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc9CC2x15y123abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y12E[];
Class_Descriptor cd__ZN3ccc9CC2x15y12E = {  "_ZN3ccc9CC2x15y12E", // class name
  bases__ZN3ccc9CC2x15y12E, 2,
  &(vtc__ZN3ccc9CC2x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y13  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC2x15y133efgEv
  ~CC2x15y13(); // tgen
  CC2x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y13E) C1{ BC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC2x15y133efgEv");}
ccc::CC2x15y13 ::~CC2x15y13(){ note_dtor("_ZN3ccc9CC2x15y13E", this);} // tgen
ccc::CC2x15y13 ::CC2x15y13(){ note_ctor("_ZN3ccc9CC2x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y13E, buf);
    ::ccc::CC2x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y13E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y13E);
    dp->::ccc::CC2x15y13::~CC2x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y13E(Test__ZN3ccc9CC2x15y13E, "_ZN3ccc9CC2x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y13C1Ev();
extern void _ZN3ccc9CC2x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y13E[] = {
  NSPAIR(_ZN3ccc9CC2x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y13E[];
extern void _ZN3ccc9CC2x15y133efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y13E[];
Class_Descriptor cd__ZN3ccc9CC2x15y13E = {  "_ZN3ccc9CC2x15y13E", // class name
  bases__ZN3ccc9CC2x15y13E, 2,
  &(vtc__ZN3ccc9CC2x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y14  : ::ccc::AA2 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC2x15y143pqrEv
  ~CC2x15y14(); // tgen
  CC2x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y14E) C1{ BC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC2x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC2x15y143pqrEv");}
ccc::CC2x15y14 ::~CC2x15y14(){ note_dtor("_ZN3ccc9CC2x15y14E", this);} // tgen
ccc::CC2x15y14 ::CC2x15y14(){ note_ctor("_ZN3ccc9CC2x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y14E, buf);
    ::ccc::CC2x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y14E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y14E);
    dp->::ccc::CC2x15y14::~CC2x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y14E(Test__ZN3ccc9CC2x15y14E, "_ZN3ccc9CC2x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y14C1Ev();
extern void _ZN3ccc9CC2x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y14E[] = {
  NSPAIR(_ZN3ccc9CC2x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y14E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc9CC2x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC2x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y14E[];
Class_Descriptor cd__ZN3ccc9CC2x15y14E = {  "_ZN3ccc9CC2x15y14E", // class name
  bases__ZN3ccc9CC2x15y14E, 2,
  &(vtc__ZN3ccc9CC2x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC2x15y15  : ::ccc::AA2 , ::ccc::BB15 {
  ~CC2x15y15(); // tgen
  CC2x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC2x15y15E) C1{ BC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC2x15y15 ::~CC2x15y15(){ note_dtor("_ZN3ccc9CC2x15y15E", this);} // tgen
ccc::CC2x15y15 ::CC2x15y15(){ note_ctor("_ZN3ccc9CC2x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC2x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC2x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC2x15y15E, buf);
    ::ccc::CC2x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC2x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC2x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC2x15y15E)");
    check_base_class_offset(lv, (::ccc::AA2*), 0, "_ZN3ccc9CC2x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC2x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC2x15y15E);
    dp->::ccc::CC2x15y15::~CC2x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC2x15y15E(Test__ZN3ccc9CC2x15y15E, "_ZN3ccc9CC2x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC2x15y15C1Ev();
extern void _ZN3ccc9CC2x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC2x15y15E[] = {
  NSPAIR(_ZN3ccc9CC2x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC2x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA2E;
extern VTBL_ENTRY _ZTIN3ccc3AA2E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA2E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC2x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y15E[];
extern void _ZN3ccc3AA23efgEv();
extern void _ZN3ccc3AA23abcEv();
extern void _ZN3ccc3AA23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC2x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC2x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC2x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC2x15y15E[];
Class_Descriptor cd__ZN3ccc9CC2x15y15E = {  "_ZN3ccc9CC2x15y15E", // class name
  bases__ZN3ccc9CC2x15y15E, 2,
  &(vtc__ZN3ccc9CC2x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC2x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC2x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y0  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y03pqrEv
  ~CC3x0y0(); // tgen
  CC3x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y0E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y03abcEv");}
void  ccc::CC3x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y03efgEv");}
void  ccc::CC3x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y03pqrEv");}
ccc::CC3x0y0 ::~CC3x0y0(){ note_dtor("_ZN3ccc7CC3x0y0E", this);} // tgen
ccc::CC3x0y0 ::CC3x0y0(){ note_ctor("_ZN3ccc7CC3x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y0E, buf);
    ::ccc::CC3x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y0E);
    dp->::ccc::CC3x0y0::~CC3x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y0E(Test__ZN3ccc7CC3x0y0E, "_ZN3ccc7CC3x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y0C1Ev();
extern void _ZN3ccc7CC3x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y0E[] = {
  NSPAIR(_ZN3ccc7CC3x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y0E[];
extern void _ZN3ccc7CC3x0y03efgEv();
extern void _ZN3ccc7CC3x0y03pqrEv();
extern void _ZN3ccc7CC3x0y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03abcEv,_ZThn4_N3ccc7CC3x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03efgEv,_ZThn4_N3ccc7CC3x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y03pqrEv,_ZThn4_N3ccc7CC3x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y03abcEv,_ZThn4_N3ccc7CC3x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y03efgEv,_ZThn4_N3ccc7CC3x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y03pqrEv,_ZThn4_N3ccc7CC3x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y0E[];
Class_Descriptor cd__ZN3ccc7CC3x0y0E = {  "_ZN3ccc7CC3x0y0E", // class name
  bases__ZN3ccc7CC3x0y0E, 2,
  &(vtc__ZN3ccc7CC3x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y1  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x0y13efgEv
  ~CC3x0y1(); // tgen
  CC3x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y1E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y13abcEv");}
void  ccc::CC3x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y13pqrEv");}
void  ccc::CC3x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y13efgEv");}
ccc::CC3x0y1 ::~CC3x0y1(){ note_dtor("_ZN3ccc7CC3x0y1E", this);} // tgen
ccc::CC3x0y1 ::CC3x0y1(){ note_ctor("_ZN3ccc7CC3x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y1E, buf);
    ::ccc::CC3x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y1E);
    dp->::ccc::CC3x0y1::~CC3x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y1E(Test__ZN3ccc7CC3x0y1E, "_ZN3ccc7CC3x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y1C1Ev();
extern void _ZN3ccc7CC3x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y1E[] = {
  NSPAIR(_ZN3ccc7CC3x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y1E[];
extern void _ZN3ccc7CC3x0y13efgEv();
extern void _ZN3ccc7CC3x0y13pqrEv();
extern void _ZN3ccc7CC3x0y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13abcEv,_ZThn4_N3ccc7CC3x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13efgEv,_ZThn4_N3ccc7CC3x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y13pqrEv,_ZThn4_N3ccc7CC3x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y13abcEv,_ZThn4_N3ccc7CC3x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y13efgEv,_ZThn4_N3ccc7CC3x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y13pqrEv,_ZThn4_N3ccc7CC3x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y1E[];
Class_Descriptor cd__ZN3ccc7CC3x0y1E = {  "_ZN3ccc7CC3x0y1E", // class name
  bases__ZN3ccc7CC3x0y1E, 2,
  &(vtc__ZN3ccc7CC3x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y2  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y23pqrEv
  ~CC3x0y2(); // tgen
  CC3x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y2E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y23efgEv");}
void  ccc::CC3x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y23abcEv");}
void  ccc::CC3x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y23pqrEv");}
ccc::CC3x0y2 ::~CC3x0y2(){ note_dtor("_ZN3ccc7CC3x0y2E", this);} // tgen
ccc::CC3x0y2 ::CC3x0y2(){ note_ctor("_ZN3ccc7CC3x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y2E, buf);
    ::ccc::CC3x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y2E);
    dp->::ccc::CC3x0y2::~CC3x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y2E(Test__ZN3ccc7CC3x0y2E, "_ZN3ccc7CC3x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y2C1Ev();
extern void _ZN3ccc7CC3x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y2E[] = {
  NSPAIR(_ZN3ccc7CC3x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y2E[];
extern void _ZN3ccc7CC3x0y23efgEv();
extern void _ZN3ccc7CC3x0y23pqrEv();
extern void _ZN3ccc7CC3x0y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23abcEv,_ZThn4_N3ccc7CC3x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23efgEv,_ZThn4_N3ccc7CC3x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y23pqrEv,_ZThn4_N3ccc7CC3x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y23abcEv,_ZThn4_N3ccc7CC3x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y23efgEv,_ZThn4_N3ccc7CC3x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y23pqrEv,_ZThn4_N3ccc7CC3x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y2E[];
Class_Descriptor cd__ZN3ccc7CC3x0y2E = {  "_ZN3ccc7CC3x0y2E", // class name
  bases__ZN3ccc7CC3x0y2E, 2,
  &(vtc__ZN3ccc7CC3x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y3  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x0y33abcEv
  ~CC3x0y3(); // tgen
  CC3x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y3E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y33efgEv");}
void  ccc::CC3x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y33pqrEv");}
void  ccc::CC3x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y33abcEv");}
ccc::CC3x0y3 ::~CC3x0y3(){ note_dtor("_ZN3ccc7CC3x0y3E", this);} // tgen
ccc::CC3x0y3 ::CC3x0y3(){ note_ctor("_ZN3ccc7CC3x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y3E, buf);
    ::ccc::CC3x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y3E);
    dp->::ccc::CC3x0y3::~CC3x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y3E(Test__ZN3ccc7CC3x0y3E, "_ZN3ccc7CC3x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y3C1Ev();
extern void _ZN3ccc7CC3x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y3E[] = {
  NSPAIR(_ZN3ccc7CC3x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y3E[];
extern void _ZN3ccc7CC3x0y33efgEv();
extern void _ZN3ccc7CC3x0y33pqrEv();
extern void _ZN3ccc7CC3x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33abcEv,_ZThn4_N3ccc7CC3x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33efgEv,_ZThn4_N3ccc7CC3x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y33pqrEv,_ZThn4_N3ccc7CC3x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y33abcEv,_ZThn4_N3ccc7CC3x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y33efgEv,_ZThn4_N3ccc7CC3x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y33pqrEv,_ZThn4_N3ccc7CC3x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y3E[];
Class_Descriptor cd__ZN3ccc7CC3x0y3E = {  "_ZN3ccc7CC3x0y3E", // class name
  bases__ZN3ccc7CC3x0y3E, 2,
  &(vtc__ZN3ccc7CC3x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y4  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC3x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y43efgEv
  ~CC3x0y4(); // tgen
  CC3x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y4E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y43pqrEv");}
void  ccc::CC3x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y43abcEv");}
void  ccc::CC3x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y43efgEv");}
ccc::CC3x0y4 ::~CC3x0y4(){ note_dtor("_ZN3ccc7CC3x0y4E", this);} // tgen
ccc::CC3x0y4 ::CC3x0y4(){ note_ctor("_ZN3ccc7CC3x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y4E, buf);
    ::ccc::CC3x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y4E);
    dp->::ccc::CC3x0y4::~CC3x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y4E(Test__ZN3ccc7CC3x0y4E, "_ZN3ccc7CC3x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y4C1Ev();
extern void _ZN3ccc7CC3x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y4E[] = {
  NSPAIR(_ZN3ccc7CC3x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y4E[];
extern void _ZN3ccc7CC3x0y43efgEv();
extern void _ZN3ccc7CC3x0y43pqrEv();
extern void _ZN3ccc7CC3x0y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43abcEv,_ZThn4_N3ccc7CC3x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43efgEv,_ZThn4_N3ccc7CC3x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y43pqrEv,_ZThn4_N3ccc7CC3x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y43abcEv,_ZThn4_N3ccc7CC3x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y43efgEv,_ZThn4_N3ccc7CC3x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y43pqrEv,_ZThn4_N3ccc7CC3x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y4E[];
Class_Descriptor cd__ZN3ccc7CC3x0y4E = {  "_ZN3ccc7CC3x0y4E", // class name
  bases__ZN3ccc7CC3x0y4E, 2,
  &(vtc__ZN3ccc7CC3x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y5  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC3x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y53abcEv
  ~CC3x0y5(); // tgen
  CC3x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y5E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y53pqrEv");}
void  ccc::CC3x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y53efgEv");}
void  ccc::CC3x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y53abcEv");}
ccc::CC3x0y5 ::~CC3x0y5(){ note_dtor("_ZN3ccc7CC3x0y5E", this);} // tgen
ccc::CC3x0y5 ::CC3x0y5(){ note_ctor("_ZN3ccc7CC3x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y5E, buf);
    ::ccc::CC3x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y5E);
    dp->::ccc::CC3x0y5::~CC3x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y5E(Test__ZN3ccc7CC3x0y5E, "_ZN3ccc7CC3x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y5C1Ev();
extern void _ZN3ccc7CC3x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y5E[] = {
  NSPAIR(_ZN3ccc7CC3x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y5E[];
extern void _ZN3ccc7CC3x0y53efgEv();
extern void _ZN3ccc7CC3x0y53pqrEv();
extern void _ZN3ccc7CC3x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53abcEv,_ZThn4_N3ccc7CC3x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53efgEv,_ZThn4_N3ccc7CC3x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y53pqrEv,_ZThn4_N3ccc7CC3x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y53abcEv,_ZThn4_N3ccc7CC3x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y53efgEv,_ZThn4_N3ccc7CC3x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y53pqrEv,_ZThn4_N3ccc7CC3x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y5E[];
Class_Descriptor cd__ZN3ccc7CC3x0y5E = {  "_ZN3ccc7CC3x0y5E", // class name
  bases__ZN3ccc7CC3x0y5E, 2,
  &(vtc__ZN3ccc7CC3x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y6  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x0y63efgEv
  ~CC3x0y6(); // tgen
  CC3x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y6E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y63abcEv");}
void  ccc::CC3x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y63efgEv");}
ccc::CC3x0y6 ::~CC3x0y6(){ note_dtor("_ZN3ccc7CC3x0y6E", this);} // tgen
ccc::CC3x0y6 ::CC3x0y6(){ note_ctor("_ZN3ccc7CC3x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y6E, buf);
    ::ccc::CC3x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y6E);
    dp->::ccc::CC3x0y6::~CC3x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y6E(Test__ZN3ccc7CC3x0y6E, "_ZN3ccc7CC3x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y6C1Ev();
extern void _ZN3ccc7CC3x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y6E[] = {
  NSPAIR(_ZN3ccc7CC3x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y6E[];
extern void _ZN3ccc7CC3x0y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y63abcEv,_ZThn4_N3ccc7CC3x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y63efgEv,_ZThn4_N3ccc7CC3x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y63abcEv,_ZThn4_N3ccc7CC3x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y63efgEv,_ZThn4_N3ccc7CC3x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y6E[];
Class_Descriptor cd__ZN3ccc7CC3x0y6E = {  "_ZN3ccc7CC3x0y6E", // class name
  bases__ZN3ccc7CC3x0y6E, 2,
  &(vtc__ZN3ccc7CC3x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y7  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC3x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y73pqrEv
  ~CC3x0y7(); // tgen
  CC3x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y7E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y73abcEv");}
void  ccc::CC3x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y73pqrEv");}
ccc::CC3x0y7 ::~CC3x0y7(){ note_dtor("_ZN3ccc7CC3x0y7E", this);} // tgen
ccc::CC3x0y7 ::CC3x0y7(){ note_ctor("_ZN3ccc7CC3x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y7E, buf);
    ::ccc::CC3x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y7E);
    dp->::ccc::CC3x0y7::~CC3x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y7E(Test__ZN3ccc7CC3x0y7E, "_ZN3ccc7CC3x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y7C1Ev();
extern void _ZN3ccc7CC3x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y7E[] = {
  NSPAIR(_ZN3ccc7CC3x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x0y73pqrEv();
extern void _ZN3ccc7CC3x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y73abcEv,_ZThn4_N3ccc7CC3x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y73pqrEv,_ZThn4_N3ccc7CC3x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y73abcEv,_ZThn4_N3ccc7CC3x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y73pqrEv,_ZThn4_N3ccc7CC3x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y7E[];
Class_Descriptor cd__ZN3ccc7CC3x0y7E = {  "_ZN3ccc7CC3x0y7E", // class name
  bases__ZN3ccc7CC3x0y7E, 2,
  &(vtc__ZN3ccc7CC3x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y8  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x0y83abcEv
  ~CC3x0y8(); // tgen
  CC3x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y8E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y83efgEv");}
void  ccc::CC3x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x0y83abcEv");}
ccc::CC3x0y8 ::~CC3x0y8(){ note_dtor("_ZN3ccc7CC3x0y8E", this);} // tgen
ccc::CC3x0y8 ::CC3x0y8(){ note_ctor("_ZN3ccc7CC3x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y8E, buf);
    ::ccc::CC3x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y8E);
    dp->::ccc::CC3x0y8::~CC3x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y8E(Test__ZN3ccc7CC3x0y8E, "_ZN3ccc7CC3x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y8C1Ev();
extern void _ZN3ccc7CC3x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y8E[] = {
  NSPAIR(_ZN3ccc7CC3x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y8E[];
extern void _ZN3ccc7CC3x0y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y83abcEv,_ZThn4_N3ccc7CC3x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y83efgEv,_ZThn4_N3ccc7CC3x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y83abcEv,_ZThn4_N3ccc7CC3x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y83efgEv,_ZThn4_N3ccc7CC3x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y8E[];
Class_Descriptor cd__ZN3ccc7CC3x0y8E = {  "_ZN3ccc7CC3x0y8E", // class name
  bases__ZN3ccc7CC3x0y8E, 2,
  &(vtc__ZN3ccc7CC3x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y9  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC3x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x0y93pqrEv
  ~CC3x0y9(); // tgen
  CC3x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x0y9E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x0y93efgEv");}
void  ccc::CC3x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x0y93pqrEv");}
ccc::CC3x0y9 ::~CC3x0y9(){ note_dtor("_ZN3ccc7CC3x0y9E", this);} // tgen
ccc::CC3x0y9 ::CC3x0y9(){ note_ctor("_ZN3ccc7CC3x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x0y9E, buf);
    ::ccc::CC3x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x0y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC3x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x0y9E);
    dp->::ccc::CC3x0y9::~CC3x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x0y9E(Test__ZN3ccc7CC3x0y9E, "_ZN3ccc7CC3x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x0y9C1Ev();
extern void _ZN3ccc7CC3x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x0y9E[] = {
  NSPAIR(_ZN3ccc7CC3x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC3x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y9E[];
extern void _ZN3ccc7CC3x0y93efgEv();
extern void _ZN3ccc7CC3x0y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y93efgEv,_ZThn4_N3ccc7CC3x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x0y93pqrEv,_ZThn4_N3ccc7CC3x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y93efgEv,_ZThn4_N3ccc7CC3x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x0y93pqrEv,_ZThn4_N3ccc7CC3x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x0y9E[];
Class_Descriptor cd__ZN3ccc7CC3x0y9E = {  "_ZN3ccc7CC3x0y9E", // class name
  bases__ZN3ccc7CC3x0y9E, 2,
  &(vtc__ZN3ccc7CC3x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y10  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x0y103abcEv
  ~CC3x0y10(); // tgen
  CC3x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y10E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y103pqrEv");}
void  ccc::CC3x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x0y103abcEv");}
ccc::CC3x0y10 ::~CC3x0y10(){ note_dtor("_ZN3ccc8CC3x0y10E", this);} // tgen
ccc::CC3x0y10 ::CC3x0y10(){ note_ctor("_ZN3ccc8CC3x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y10E, buf);
    ::ccc::CC3x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y10E);
    dp->::ccc::CC3x0y10::~CC3x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y10E(Test__ZN3ccc8CC3x0y10E, "_ZN3ccc8CC3x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y10C1Ev();
extern void _ZN3ccc8CC3x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y10E[] = {
  NSPAIR(_ZN3ccc8CC3x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x0y103pqrEv();
extern void _ZN3ccc8CC3x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y103abcEv,_ZThn4_N3ccc8CC3x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y103pqrEv,_ZThn4_N3ccc8CC3x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y103abcEv,_ZThn4_N3ccc8CC3x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y103pqrEv,_ZThn4_N3ccc8CC3x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y10E[];
Class_Descriptor cd__ZN3ccc8CC3x0y10E = {  "_ZN3ccc8CC3x0y10E", // class name
  bases__ZN3ccc8CC3x0y10E, 2,
  &(vtc__ZN3ccc8CC3x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y11  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x0y113efgEv
  ~CC3x0y11(); // tgen
  CC3x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y11E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y113pqrEv");}
void  ccc::CC3x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x0y113efgEv");}
ccc::CC3x0y11 ::~CC3x0y11(){ note_dtor("_ZN3ccc8CC3x0y11E", this);} // tgen
ccc::CC3x0y11 ::CC3x0y11(){ note_ctor("_ZN3ccc8CC3x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y11E, buf);
    ::ccc::CC3x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y11E);
    dp->::ccc::CC3x0y11::~CC3x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y11E(Test__ZN3ccc8CC3x0y11E, "_ZN3ccc8CC3x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y11C1Ev();
extern void _ZN3ccc8CC3x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y11E[] = {
  NSPAIR(_ZN3ccc8CC3x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y11E[];
extern void _ZN3ccc8CC3x0y113efgEv();
extern void _ZN3ccc8CC3x0y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y113efgEv,_ZThn4_N3ccc8CC3x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y113pqrEv,_ZThn4_N3ccc8CC3x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y113efgEv,_ZThn4_N3ccc8CC3x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y113pqrEv,_ZThn4_N3ccc8CC3x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y11E[];
Class_Descriptor cd__ZN3ccc8CC3x0y11E = {  "_ZN3ccc8CC3x0y11E", // class name
  bases__ZN3ccc8CC3x0y11E, 2,
  &(vtc__ZN3ccc8CC3x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y12  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC3x0y123abcEv
  ~CC3x0y12(); // tgen
  CC3x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x0y123abcEv");}
ccc::CC3x0y12 ::~CC3x0y12(){ note_dtor("_ZN3ccc8CC3x0y12E", this);} // tgen
ccc::CC3x0y12 ::CC3x0y12(){ note_ctor("_ZN3ccc8CC3x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y12E, buf);
    ::ccc::CC3x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y12E);
    dp->::ccc::CC3x0y12::~CC3x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y12E(Test__ZN3ccc8CC3x0y12E, "_ZN3ccc8CC3x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y12C1Ev();
extern void _ZN3ccc8CC3x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y12E[] = {
  NSPAIR(_ZN3ccc8CC3x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y123abcEv,_ZThn4_N3ccc8CC3x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y123abcEv,_ZThn4_N3ccc8CC3x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y12E[];
Class_Descriptor cd__ZN3ccc8CC3x0y12E = {  "_ZN3ccc8CC3x0y12E", // class name
  bases__ZN3ccc8CC3x0y12E, 2,
  &(vtc__ZN3ccc8CC3x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y13  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC3x0y133efgEv
  ~CC3x0y13(); // tgen
  CC3x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x0y133efgEv");}
ccc::CC3x0y13 ::~CC3x0y13(){ note_dtor("_ZN3ccc8CC3x0y13E", this);} // tgen
ccc::CC3x0y13 ::CC3x0y13(){ note_ctor("_ZN3ccc8CC3x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y13E, buf);
    ::ccc::CC3x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y13E);
    dp->::ccc::CC3x0y13::~CC3x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y13E(Test__ZN3ccc8CC3x0y13E, "_ZN3ccc8CC3x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y13C1Ev();
extern void _ZN3ccc8CC3x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y13E[] = {
  NSPAIR(_ZN3ccc8CC3x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y13E[];
extern void _ZN3ccc8CC3x0y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y133efgEv,_ZThn4_N3ccc8CC3x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y133efgEv,_ZThn4_N3ccc8CC3x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y13E[];
Class_Descriptor cd__ZN3ccc8CC3x0y13E = {  "_ZN3ccc8CC3x0y13E", // class name
  bases__ZN3ccc8CC3x0y13E, 2,
  &(vtc__ZN3ccc8CC3x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y14  : ::ccc::AA3 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC3x0y143pqrEv
  ~CC3x0y14(); // tgen
  CC3x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x0y143pqrEv");}
ccc::CC3x0y14 ::~CC3x0y14(){ note_dtor("_ZN3ccc8CC3x0y14E", this);} // tgen
ccc::CC3x0y14 ::CC3x0y14(){ note_ctor("_ZN3ccc8CC3x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y14E, buf);
    ::ccc::CC3x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y14E);
    dp->::ccc::CC3x0y14::~CC3x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y14E(Test__ZN3ccc8CC3x0y14E, "_ZN3ccc8CC3x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y14C1Ev();
extern void _ZN3ccc8CC3x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y14E[] = {
  NSPAIR(_ZN3ccc8CC3x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x0y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x0y143pqrEv,_ZThn4_N3ccc8CC3x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x0y143pqrEv,_ZThn4_N3ccc8CC3x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y14E[];
Class_Descriptor cd__ZN3ccc8CC3x0y14E = {  "_ZN3ccc8CC3x0y14E", // class name
  bases__ZN3ccc8CC3x0y14E, 2,
  &(vtc__ZN3ccc8CC3x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x0y15  : ::ccc::AA3 , ::ccc::BB0 {
  ~CC3x0y15(); // tgen
  CC3x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x0y15 ::~CC3x0y15(){ note_dtor("_ZN3ccc8CC3x0y15E", this);} // tgen
ccc::CC3x0y15 ::CC3x0y15(){ note_ctor("_ZN3ccc8CC3x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x0y15E, buf);
    ::ccc::CC3x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x0y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC3x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x0y15E);
    dp->::ccc::CC3x0y15::~CC3x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x0y15E(Test__ZN3ccc8CC3x0y15E, "_ZN3ccc8CC3x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x0y15C1Ev();
extern void _ZN3ccc8CC3x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x0y15E[] = {
  NSPAIR(_ZN3ccc8CC3x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC3x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x0y15E[];
Class_Descriptor cd__ZN3ccc8CC3x0y15E = {  "_ZN3ccc8CC3x0y15E", // class name
  bases__ZN3ccc8CC3x0y15E, 2,
  &(vtc__ZN3ccc8CC3x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y0  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y03pqrEv
  ~CC3x1y0(); // tgen
  CC3x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y0E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y03abcEv");}
void  ccc::CC3x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y03efgEv");}
void  ccc::CC3x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y03pqrEv");}
ccc::CC3x1y0 ::~CC3x1y0(){ note_dtor("_ZN3ccc7CC3x1y0E", this);} // tgen
ccc::CC3x1y0 ::CC3x1y0(){ note_ctor("_ZN3ccc7CC3x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y0E, buf);
    ::ccc::CC3x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y0E);
    dp->::ccc::CC3x1y0::~CC3x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y0E(Test__ZN3ccc7CC3x1y0E, "_ZN3ccc7CC3x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y0C1Ev();
extern void _ZN3ccc7CC3x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y0E[] = {
  NSPAIR(_ZN3ccc7CC3x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y0E[];
extern void _ZN3ccc7CC3x1y03efgEv();
extern void _ZN3ccc7CC3x1y03pqrEv();
extern void _ZN3ccc7CC3x1y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03abcEv,_ZThn4_N3ccc7CC3x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03pqrEv,_ZThn4_N3ccc7CC3x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y03efgEv,_ZThn4_N3ccc7CC3x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y03abcEv,_ZThn4_N3ccc7CC3x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y03pqrEv,_ZThn4_N3ccc7CC3x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y03efgEv,_ZThn4_N3ccc7CC3x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y0E[];
Class_Descriptor cd__ZN3ccc7CC3x1y0E = {  "_ZN3ccc7CC3x1y0E", // class name
  bases__ZN3ccc7CC3x1y0E, 2,
  &(vtc__ZN3ccc7CC3x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y1  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x1y13efgEv
  ~CC3x1y1(); // tgen
  CC3x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y1E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y13abcEv");}
void  ccc::CC3x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y13pqrEv");}
void  ccc::CC3x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y13efgEv");}
ccc::CC3x1y1 ::~CC3x1y1(){ note_dtor("_ZN3ccc7CC3x1y1E", this);} // tgen
ccc::CC3x1y1 ::CC3x1y1(){ note_ctor("_ZN3ccc7CC3x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y1E, buf);
    ::ccc::CC3x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y1E);
    dp->::ccc::CC3x1y1::~CC3x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y1E(Test__ZN3ccc7CC3x1y1E, "_ZN3ccc7CC3x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y1C1Ev();
extern void _ZN3ccc7CC3x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y1E[] = {
  NSPAIR(_ZN3ccc7CC3x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y1E[];
extern void _ZN3ccc7CC3x1y13efgEv();
extern void _ZN3ccc7CC3x1y13pqrEv();
extern void _ZN3ccc7CC3x1y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13abcEv,_ZThn4_N3ccc7CC3x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13pqrEv,_ZThn4_N3ccc7CC3x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y13efgEv,_ZThn4_N3ccc7CC3x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y13abcEv,_ZThn4_N3ccc7CC3x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y13pqrEv,_ZThn4_N3ccc7CC3x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y13efgEv,_ZThn4_N3ccc7CC3x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y1E[];
Class_Descriptor cd__ZN3ccc7CC3x1y1E = {  "_ZN3ccc7CC3x1y1E", // class name
  bases__ZN3ccc7CC3x1y1E, 2,
  &(vtc__ZN3ccc7CC3x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y2  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y23pqrEv
  ~CC3x1y2(); // tgen
  CC3x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y2E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y23efgEv");}
void  ccc::CC3x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y23abcEv");}
void  ccc::CC3x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y23pqrEv");}
ccc::CC3x1y2 ::~CC3x1y2(){ note_dtor("_ZN3ccc7CC3x1y2E", this);} // tgen
ccc::CC3x1y2 ::CC3x1y2(){ note_ctor("_ZN3ccc7CC3x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y2E, buf);
    ::ccc::CC3x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y2E);
    dp->::ccc::CC3x1y2::~CC3x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y2E(Test__ZN3ccc7CC3x1y2E, "_ZN3ccc7CC3x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y2C1Ev();
extern void _ZN3ccc7CC3x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y2E[] = {
  NSPAIR(_ZN3ccc7CC3x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y2E[];
extern void _ZN3ccc7CC3x1y23efgEv();
extern void _ZN3ccc7CC3x1y23pqrEv();
extern void _ZN3ccc7CC3x1y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23abcEv,_ZThn4_N3ccc7CC3x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23pqrEv,_ZThn4_N3ccc7CC3x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y23efgEv,_ZThn4_N3ccc7CC3x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y23abcEv,_ZThn4_N3ccc7CC3x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y23pqrEv,_ZThn4_N3ccc7CC3x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y23efgEv,_ZThn4_N3ccc7CC3x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y2E[];
Class_Descriptor cd__ZN3ccc7CC3x1y2E = {  "_ZN3ccc7CC3x1y2E", // class name
  bases__ZN3ccc7CC3x1y2E, 2,
  &(vtc__ZN3ccc7CC3x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y3  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x1y33abcEv
  ~CC3x1y3(); // tgen
  CC3x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y3E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y33efgEv");}
void  ccc::CC3x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y33pqrEv");}
void  ccc::CC3x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y33abcEv");}
ccc::CC3x1y3 ::~CC3x1y3(){ note_dtor("_ZN3ccc7CC3x1y3E", this);} // tgen
ccc::CC3x1y3 ::CC3x1y3(){ note_ctor("_ZN3ccc7CC3x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y3E, buf);
    ::ccc::CC3x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y3E);
    dp->::ccc::CC3x1y3::~CC3x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y3E(Test__ZN3ccc7CC3x1y3E, "_ZN3ccc7CC3x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y3C1Ev();
extern void _ZN3ccc7CC3x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y3E[] = {
  NSPAIR(_ZN3ccc7CC3x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y3E[];
extern void _ZN3ccc7CC3x1y33efgEv();
extern void _ZN3ccc7CC3x1y33pqrEv();
extern void _ZN3ccc7CC3x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33abcEv,_ZThn4_N3ccc7CC3x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33pqrEv,_ZThn4_N3ccc7CC3x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y33efgEv,_ZThn4_N3ccc7CC3x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y33abcEv,_ZThn4_N3ccc7CC3x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y33pqrEv,_ZThn4_N3ccc7CC3x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y33efgEv,_ZThn4_N3ccc7CC3x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y3E[];
Class_Descriptor cd__ZN3ccc7CC3x1y3E = {  "_ZN3ccc7CC3x1y3E", // class name
  bases__ZN3ccc7CC3x1y3E, 2,
  &(vtc__ZN3ccc7CC3x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y4  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC3x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y43efgEv
  ~CC3x1y4(); // tgen
  CC3x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y4E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y43pqrEv");}
void  ccc::CC3x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y43abcEv");}
void  ccc::CC3x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y43efgEv");}
ccc::CC3x1y4 ::~CC3x1y4(){ note_dtor("_ZN3ccc7CC3x1y4E", this);} // tgen
ccc::CC3x1y4 ::CC3x1y4(){ note_ctor("_ZN3ccc7CC3x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y4E, buf);
    ::ccc::CC3x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y4E);
    dp->::ccc::CC3x1y4::~CC3x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y4E(Test__ZN3ccc7CC3x1y4E, "_ZN3ccc7CC3x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y4C1Ev();
extern void _ZN3ccc7CC3x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y4E[] = {
  NSPAIR(_ZN3ccc7CC3x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y4E[];
extern void _ZN3ccc7CC3x1y43efgEv();
extern void _ZN3ccc7CC3x1y43pqrEv();
extern void _ZN3ccc7CC3x1y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43abcEv,_ZThn4_N3ccc7CC3x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43pqrEv,_ZThn4_N3ccc7CC3x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y43efgEv,_ZThn4_N3ccc7CC3x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y43abcEv,_ZThn4_N3ccc7CC3x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y43pqrEv,_ZThn4_N3ccc7CC3x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y43efgEv,_ZThn4_N3ccc7CC3x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y4E[];
Class_Descriptor cd__ZN3ccc7CC3x1y4E = {  "_ZN3ccc7CC3x1y4E", // class name
  bases__ZN3ccc7CC3x1y4E, 2,
  &(vtc__ZN3ccc7CC3x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y5  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC3x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y53abcEv
  ~CC3x1y5(); // tgen
  CC3x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y5E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y53pqrEv");}
void  ccc::CC3x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y53efgEv");}
void  ccc::CC3x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y53abcEv");}
ccc::CC3x1y5 ::~CC3x1y5(){ note_dtor("_ZN3ccc7CC3x1y5E", this);} // tgen
ccc::CC3x1y5 ::CC3x1y5(){ note_ctor("_ZN3ccc7CC3x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y5E, buf);
    ::ccc::CC3x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y5E);
    dp->::ccc::CC3x1y5::~CC3x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y5E(Test__ZN3ccc7CC3x1y5E, "_ZN3ccc7CC3x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y5C1Ev();
extern void _ZN3ccc7CC3x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y5E[] = {
  NSPAIR(_ZN3ccc7CC3x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y5E[];
extern void _ZN3ccc7CC3x1y53efgEv();
extern void _ZN3ccc7CC3x1y53pqrEv();
extern void _ZN3ccc7CC3x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53abcEv,_ZThn4_N3ccc7CC3x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53pqrEv,_ZThn4_N3ccc7CC3x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y53efgEv,_ZThn4_N3ccc7CC3x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y53abcEv,_ZThn4_N3ccc7CC3x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y53pqrEv,_ZThn4_N3ccc7CC3x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y53efgEv,_ZThn4_N3ccc7CC3x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y5E[];
Class_Descriptor cd__ZN3ccc7CC3x1y5E = {  "_ZN3ccc7CC3x1y5E", // class name
  bases__ZN3ccc7CC3x1y5E, 2,
  &(vtc__ZN3ccc7CC3x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y6  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x1y63efgEv
  ~CC3x1y6(); // tgen
  CC3x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y6E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y63abcEv");}
void  ccc::CC3x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y63efgEv");}
ccc::CC3x1y6 ::~CC3x1y6(){ note_dtor("_ZN3ccc7CC3x1y6E", this);} // tgen
ccc::CC3x1y6 ::CC3x1y6(){ note_ctor("_ZN3ccc7CC3x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y6E, buf);
    ::ccc::CC3x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y6E);
    dp->::ccc::CC3x1y6::~CC3x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y6E(Test__ZN3ccc7CC3x1y6E, "_ZN3ccc7CC3x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y6C1Ev();
extern void _ZN3ccc7CC3x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y6E[] = {
  NSPAIR(_ZN3ccc7CC3x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y6E[];
extern void _ZN3ccc7CC3x1y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y63abcEv,_ZThn4_N3ccc7CC3x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y63efgEv,_ZThn4_N3ccc7CC3x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y63abcEv,_ZThn4_N3ccc7CC3x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y63efgEv,_ZThn4_N3ccc7CC3x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y6E[];
Class_Descriptor cd__ZN3ccc7CC3x1y6E = {  "_ZN3ccc7CC3x1y6E", // class name
  bases__ZN3ccc7CC3x1y6E, 2,
  &(vtc__ZN3ccc7CC3x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y7  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC3x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y73pqrEv
  ~CC3x1y7(); // tgen
  CC3x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y7E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y73abcEv");}
void  ccc::CC3x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y73pqrEv");}
ccc::CC3x1y7 ::~CC3x1y7(){ note_dtor("_ZN3ccc7CC3x1y7E", this);} // tgen
ccc::CC3x1y7 ::CC3x1y7(){ note_ctor("_ZN3ccc7CC3x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y7E, buf);
    ::ccc::CC3x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y7E);
    dp->::ccc::CC3x1y7::~CC3x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y7E(Test__ZN3ccc7CC3x1y7E, "_ZN3ccc7CC3x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y7C1Ev();
extern void _ZN3ccc7CC3x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y7E[] = {
  NSPAIR(_ZN3ccc7CC3x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x1y73pqrEv();
extern void _ZN3ccc7CC3x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y73abcEv,_ZThn4_N3ccc7CC3x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y73pqrEv,_ZThn4_N3ccc7CC3x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y73abcEv,_ZThn4_N3ccc7CC3x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y73pqrEv,_ZThn4_N3ccc7CC3x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y7E[];
Class_Descriptor cd__ZN3ccc7CC3x1y7E = {  "_ZN3ccc7CC3x1y7E", // class name
  bases__ZN3ccc7CC3x1y7E, 2,
  &(vtc__ZN3ccc7CC3x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y8  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x1y83abcEv
  ~CC3x1y8(); // tgen
  CC3x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y8E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y83efgEv");}
void  ccc::CC3x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x1y83abcEv");}
ccc::CC3x1y8 ::~CC3x1y8(){ note_dtor("_ZN3ccc7CC3x1y8E", this);} // tgen
ccc::CC3x1y8 ::CC3x1y8(){ note_ctor("_ZN3ccc7CC3x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y8E, buf);
    ::ccc::CC3x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y8E);
    dp->::ccc::CC3x1y8::~CC3x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y8E(Test__ZN3ccc7CC3x1y8E, "_ZN3ccc7CC3x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y8C1Ev();
extern void _ZN3ccc7CC3x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y8E[] = {
  NSPAIR(_ZN3ccc7CC3x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y8E[];
extern void _ZN3ccc7CC3x1y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y83abcEv,_ZThn4_N3ccc7CC3x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y83efgEv,_ZThn4_N3ccc7CC3x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y83abcEv,_ZThn4_N3ccc7CC3x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y83efgEv,_ZThn4_N3ccc7CC3x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y8E[];
Class_Descriptor cd__ZN3ccc7CC3x1y8E = {  "_ZN3ccc7CC3x1y8E", // class name
  bases__ZN3ccc7CC3x1y8E, 2,
  &(vtc__ZN3ccc7CC3x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y9  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC3x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x1y93pqrEv
  ~CC3x1y9(); // tgen
  CC3x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x1y9E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x1y93efgEv");}
void  ccc::CC3x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x1y93pqrEv");}
ccc::CC3x1y9 ::~CC3x1y9(){ note_dtor("_ZN3ccc7CC3x1y9E", this);} // tgen
ccc::CC3x1y9 ::CC3x1y9(){ note_ctor("_ZN3ccc7CC3x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x1y9E, buf);
    ::ccc::CC3x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x1y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC3x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x1y9E);
    dp->::ccc::CC3x1y9::~CC3x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x1y9E(Test__ZN3ccc7CC3x1y9E, "_ZN3ccc7CC3x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x1y9C1Ev();
extern void _ZN3ccc7CC3x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x1y9E[] = {
  NSPAIR(_ZN3ccc7CC3x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC3x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y9E[];
extern void _ZN3ccc7CC3x1y93efgEv();
extern void _ZN3ccc7CC3x1y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y93pqrEv,_ZThn4_N3ccc7CC3x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x1y93efgEv,_ZThn4_N3ccc7CC3x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y93pqrEv,_ZThn4_N3ccc7CC3x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x1y93efgEv,_ZThn4_N3ccc7CC3x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x1y9E[];
Class_Descriptor cd__ZN3ccc7CC3x1y9E = {  "_ZN3ccc7CC3x1y9E", // class name
  bases__ZN3ccc7CC3x1y9E, 2,
  &(vtc__ZN3ccc7CC3x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y10  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x1y103abcEv
  ~CC3x1y10(); // tgen
  CC3x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y10E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y103pqrEv");}
void  ccc::CC3x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x1y103abcEv");}
ccc::CC3x1y10 ::~CC3x1y10(){ note_dtor("_ZN3ccc8CC3x1y10E", this);} // tgen
ccc::CC3x1y10 ::CC3x1y10(){ note_ctor("_ZN3ccc8CC3x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y10E, buf);
    ::ccc::CC3x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y10E);
    dp->::ccc::CC3x1y10::~CC3x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y10E(Test__ZN3ccc8CC3x1y10E, "_ZN3ccc8CC3x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y10C1Ev();
extern void _ZN3ccc8CC3x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y10E[] = {
  NSPAIR(_ZN3ccc8CC3x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x1y103pqrEv();
extern void _ZN3ccc8CC3x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y103abcEv,_ZThn4_N3ccc8CC3x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y103pqrEv,_ZThn4_N3ccc8CC3x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y103abcEv,_ZThn4_N3ccc8CC3x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y103pqrEv,_ZThn4_N3ccc8CC3x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y10E[];
Class_Descriptor cd__ZN3ccc8CC3x1y10E = {  "_ZN3ccc8CC3x1y10E", // class name
  bases__ZN3ccc8CC3x1y10E, 2,
  &(vtc__ZN3ccc8CC3x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y11  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x1y113efgEv
  ~CC3x1y11(); // tgen
  CC3x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y11E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y113pqrEv");}
void  ccc::CC3x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x1y113efgEv");}
ccc::CC3x1y11 ::~CC3x1y11(){ note_dtor("_ZN3ccc8CC3x1y11E", this);} // tgen
ccc::CC3x1y11 ::CC3x1y11(){ note_ctor("_ZN3ccc8CC3x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y11E, buf);
    ::ccc::CC3x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y11E);
    dp->::ccc::CC3x1y11::~CC3x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y11E(Test__ZN3ccc8CC3x1y11E, "_ZN3ccc8CC3x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y11C1Ev();
extern void _ZN3ccc8CC3x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y11E[] = {
  NSPAIR(_ZN3ccc8CC3x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y11E[];
extern void _ZN3ccc8CC3x1y113efgEv();
extern void _ZN3ccc8CC3x1y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y113pqrEv,_ZThn4_N3ccc8CC3x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y113efgEv,_ZThn4_N3ccc8CC3x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y113pqrEv,_ZThn4_N3ccc8CC3x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y113efgEv,_ZThn4_N3ccc8CC3x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y11E[];
Class_Descriptor cd__ZN3ccc8CC3x1y11E = {  "_ZN3ccc8CC3x1y11E", // class name
  bases__ZN3ccc8CC3x1y11E, 2,
  &(vtc__ZN3ccc8CC3x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y12  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC3x1y123abcEv
  ~CC3x1y12(); // tgen
  CC3x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x1y123abcEv");}
ccc::CC3x1y12 ::~CC3x1y12(){ note_dtor("_ZN3ccc8CC3x1y12E", this);} // tgen
ccc::CC3x1y12 ::CC3x1y12(){ note_ctor("_ZN3ccc8CC3x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y12E, buf);
    ::ccc::CC3x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y12E);
    dp->::ccc::CC3x1y12::~CC3x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y12E(Test__ZN3ccc8CC3x1y12E, "_ZN3ccc8CC3x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y12C1Ev();
extern void _ZN3ccc8CC3x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y12E[] = {
  NSPAIR(_ZN3ccc8CC3x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y123abcEv,_ZThn4_N3ccc8CC3x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y123abcEv,_ZThn4_N3ccc8CC3x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y12E[];
Class_Descriptor cd__ZN3ccc8CC3x1y12E = {  "_ZN3ccc8CC3x1y12E", // class name
  bases__ZN3ccc8CC3x1y12E, 2,
  &(vtc__ZN3ccc8CC3x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y13  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC3x1y133efgEv
  ~CC3x1y13(); // tgen
  CC3x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x1y133efgEv");}
ccc::CC3x1y13 ::~CC3x1y13(){ note_dtor("_ZN3ccc8CC3x1y13E", this);} // tgen
ccc::CC3x1y13 ::CC3x1y13(){ note_ctor("_ZN3ccc8CC3x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y13E, buf);
    ::ccc::CC3x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y13E);
    dp->::ccc::CC3x1y13::~CC3x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y13E(Test__ZN3ccc8CC3x1y13E, "_ZN3ccc8CC3x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y13C1Ev();
extern void _ZN3ccc8CC3x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y13E[] = {
  NSPAIR(_ZN3ccc8CC3x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y13E[];
extern void _ZN3ccc8CC3x1y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y133efgEv,_ZThn4_N3ccc8CC3x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y133efgEv,_ZThn4_N3ccc8CC3x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y13E[];
Class_Descriptor cd__ZN3ccc8CC3x1y13E = {  "_ZN3ccc8CC3x1y13E", // class name
  bases__ZN3ccc8CC3x1y13E, 2,
  &(vtc__ZN3ccc8CC3x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y14  : ::ccc::AA3 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC3x1y143pqrEv
  ~CC3x1y14(); // tgen
  CC3x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x1y143pqrEv");}
ccc::CC3x1y14 ::~CC3x1y14(){ note_dtor("_ZN3ccc8CC3x1y14E", this);} // tgen
ccc::CC3x1y14 ::CC3x1y14(){ note_ctor("_ZN3ccc8CC3x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y14E, buf);
    ::ccc::CC3x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y14E);
    dp->::ccc::CC3x1y14::~CC3x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y14E(Test__ZN3ccc8CC3x1y14E, "_ZN3ccc8CC3x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y14C1Ev();
extern void _ZN3ccc8CC3x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y14E[] = {
  NSPAIR(_ZN3ccc8CC3x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x1y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x1y143pqrEv,_ZThn4_N3ccc8CC3x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x1y143pqrEv,_ZThn4_N3ccc8CC3x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y14E[];
Class_Descriptor cd__ZN3ccc8CC3x1y14E = {  "_ZN3ccc8CC3x1y14E", // class name
  bases__ZN3ccc8CC3x1y14E, 2,
  &(vtc__ZN3ccc8CC3x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x1y15  : ::ccc::AA3 , ::ccc::BB1 {
  ~CC3x1y15(); // tgen
  CC3x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x1y15 ::~CC3x1y15(){ note_dtor("_ZN3ccc8CC3x1y15E", this);} // tgen
ccc::CC3x1y15 ::CC3x1y15(){ note_ctor("_ZN3ccc8CC3x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x1y15E, buf);
    ::ccc::CC3x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x1y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC3x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x1y15E);
    dp->::ccc::CC3x1y15::~CC3x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x1y15E(Test__ZN3ccc8CC3x1y15E, "_ZN3ccc8CC3x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x1y15C1Ev();
extern void _ZN3ccc8CC3x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x1y15E[] = {
  NSPAIR(_ZN3ccc8CC3x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC3x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x1y15E[];
Class_Descriptor cd__ZN3ccc8CC3x1y15E = {  "_ZN3ccc8CC3x1y15E", // class name
  bases__ZN3ccc8CC3x1y15E, 2,
  &(vtc__ZN3ccc8CC3x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y0  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y03pqrEv
  ~CC3x2y0(); // tgen
  CC3x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y0E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y03abcEv");}
void  ccc::CC3x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y03efgEv");}
void  ccc::CC3x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y03pqrEv");}
ccc::CC3x2y0 ::~CC3x2y0(){ note_dtor("_ZN3ccc7CC3x2y0E", this);} // tgen
ccc::CC3x2y0 ::CC3x2y0(){ note_ctor("_ZN3ccc7CC3x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y0E, buf);
    ::ccc::CC3x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y0E);
    dp->::ccc::CC3x2y0::~CC3x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y0E(Test__ZN3ccc7CC3x2y0E, "_ZN3ccc7CC3x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y0C1Ev();
extern void _ZN3ccc7CC3x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y0E[] = {
  NSPAIR(_ZN3ccc7CC3x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y0E[];
extern void _ZN3ccc7CC3x2y03efgEv();
extern void _ZN3ccc7CC3x2y03pqrEv();
extern void _ZN3ccc7CC3x2y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03efgEv,_ZThn4_N3ccc7CC3x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03abcEv,_ZThn4_N3ccc7CC3x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y03pqrEv,_ZThn4_N3ccc7CC3x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y03efgEv,_ZThn4_N3ccc7CC3x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y03abcEv,_ZThn4_N3ccc7CC3x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y03pqrEv,_ZThn4_N3ccc7CC3x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y0E[];
Class_Descriptor cd__ZN3ccc7CC3x2y0E = {  "_ZN3ccc7CC3x2y0E", // class name
  bases__ZN3ccc7CC3x2y0E, 2,
  &(vtc__ZN3ccc7CC3x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y1  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x2y13efgEv
  ~CC3x2y1(); // tgen
  CC3x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y1E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y13abcEv");}
void  ccc::CC3x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y13pqrEv");}
void  ccc::CC3x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y13efgEv");}
ccc::CC3x2y1 ::~CC3x2y1(){ note_dtor("_ZN3ccc7CC3x2y1E", this);} // tgen
ccc::CC3x2y1 ::CC3x2y1(){ note_ctor("_ZN3ccc7CC3x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y1E, buf);
    ::ccc::CC3x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y1E);
    dp->::ccc::CC3x2y1::~CC3x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y1E(Test__ZN3ccc7CC3x2y1E, "_ZN3ccc7CC3x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y1C1Ev();
extern void _ZN3ccc7CC3x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y1E[] = {
  NSPAIR(_ZN3ccc7CC3x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y1E[];
extern void _ZN3ccc7CC3x2y13efgEv();
extern void _ZN3ccc7CC3x2y13pqrEv();
extern void _ZN3ccc7CC3x2y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13efgEv,_ZThn4_N3ccc7CC3x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13abcEv,_ZThn4_N3ccc7CC3x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y13pqrEv,_ZThn4_N3ccc7CC3x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y13efgEv,_ZThn4_N3ccc7CC3x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y13abcEv,_ZThn4_N3ccc7CC3x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y13pqrEv,_ZThn4_N3ccc7CC3x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y1E[];
Class_Descriptor cd__ZN3ccc7CC3x2y1E = {  "_ZN3ccc7CC3x2y1E", // class name
  bases__ZN3ccc7CC3x2y1E, 2,
  &(vtc__ZN3ccc7CC3x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y2  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y23pqrEv
  ~CC3x2y2(); // tgen
  CC3x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y2E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y23efgEv");}
void  ccc::CC3x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y23abcEv");}
void  ccc::CC3x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y23pqrEv");}
ccc::CC3x2y2 ::~CC3x2y2(){ note_dtor("_ZN3ccc7CC3x2y2E", this);} // tgen
ccc::CC3x2y2 ::CC3x2y2(){ note_ctor("_ZN3ccc7CC3x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y2E, buf);
    ::ccc::CC3x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y2E);
    dp->::ccc::CC3x2y2::~CC3x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y2E(Test__ZN3ccc7CC3x2y2E, "_ZN3ccc7CC3x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y2C1Ev();
extern void _ZN3ccc7CC3x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y2E[] = {
  NSPAIR(_ZN3ccc7CC3x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y2E[];
extern void _ZN3ccc7CC3x2y23efgEv();
extern void _ZN3ccc7CC3x2y23pqrEv();
extern void _ZN3ccc7CC3x2y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23efgEv,_ZThn4_N3ccc7CC3x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23abcEv,_ZThn4_N3ccc7CC3x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y23pqrEv,_ZThn4_N3ccc7CC3x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y23efgEv,_ZThn4_N3ccc7CC3x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y23abcEv,_ZThn4_N3ccc7CC3x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y23pqrEv,_ZThn4_N3ccc7CC3x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y2E[];
Class_Descriptor cd__ZN3ccc7CC3x2y2E = {  "_ZN3ccc7CC3x2y2E", // class name
  bases__ZN3ccc7CC3x2y2E, 2,
  &(vtc__ZN3ccc7CC3x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y3  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x2y33abcEv
  ~CC3x2y3(); // tgen
  CC3x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y3E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y33efgEv");}
void  ccc::CC3x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y33pqrEv");}
void  ccc::CC3x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y33abcEv");}
ccc::CC3x2y3 ::~CC3x2y3(){ note_dtor("_ZN3ccc7CC3x2y3E", this);} // tgen
ccc::CC3x2y3 ::CC3x2y3(){ note_ctor("_ZN3ccc7CC3x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y3E, buf);
    ::ccc::CC3x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y3E);
    dp->::ccc::CC3x2y3::~CC3x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y3E(Test__ZN3ccc7CC3x2y3E, "_ZN3ccc7CC3x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y3C1Ev();
extern void _ZN3ccc7CC3x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y3E[] = {
  NSPAIR(_ZN3ccc7CC3x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y3E[];
extern void _ZN3ccc7CC3x2y33efgEv();
extern void _ZN3ccc7CC3x2y33pqrEv();
extern void _ZN3ccc7CC3x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33efgEv,_ZThn4_N3ccc7CC3x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33abcEv,_ZThn4_N3ccc7CC3x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y33pqrEv,_ZThn4_N3ccc7CC3x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y33efgEv,_ZThn4_N3ccc7CC3x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y33abcEv,_ZThn4_N3ccc7CC3x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y33pqrEv,_ZThn4_N3ccc7CC3x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y3E[];
Class_Descriptor cd__ZN3ccc7CC3x2y3E = {  "_ZN3ccc7CC3x2y3E", // class name
  bases__ZN3ccc7CC3x2y3E, 2,
  &(vtc__ZN3ccc7CC3x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y4  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC3x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y43efgEv
  ~CC3x2y4(); // tgen
  CC3x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y4E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y43pqrEv");}
void  ccc::CC3x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y43abcEv");}
void  ccc::CC3x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y43efgEv");}
ccc::CC3x2y4 ::~CC3x2y4(){ note_dtor("_ZN3ccc7CC3x2y4E", this);} // tgen
ccc::CC3x2y4 ::CC3x2y4(){ note_ctor("_ZN3ccc7CC3x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y4E, buf);
    ::ccc::CC3x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y4E);
    dp->::ccc::CC3x2y4::~CC3x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y4E(Test__ZN3ccc7CC3x2y4E, "_ZN3ccc7CC3x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y4C1Ev();
extern void _ZN3ccc7CC3x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y4E[] = {
  NSPAIR(_ZN3ccc7CC3x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y4E[];
extern void _ZN3ccc7CC3x2y43efgEv();
extern void _ZN3ccc7CC3x2y43pqrEv();
extern void _ZN3ccc7CC3x2y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43efgEv,_ZThn4_N3ccc7CC3x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43abcEv,_ZThn4_N3ccc7CC3x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y43pqrEv,_ZThn4_N3ccc7CC3x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y43efgEv,_ZThn4_N3ccc7CC3x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y43abcEv,_ZThn4_N3ccc7CC3x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y43pqrEv,_ZThn4_N3ccc7CC3x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y4E[];
Class_Descriptor cd__ZN3ccc7CC3x2y4E = {  "_ZN3ccc7CC3x2y4E", // class name
  bases__ZN3ccc7CC3x2y4E, 2,
  &(vtc__ZN3ccc7CC3x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y5  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC3x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y53abcEv
  ~CC3x2y5(); // tgen
  CC3x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y5E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y53pqrEv");}
void  ccc::CC3x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y53efgEv");}
void  ccc::CC3x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y53abcEv");}
ccc::CC3x2y5 ::~CC3x2y5(){ note_dtor("_ZN3ccc7CC3x2y5E", this);} // tgen
ccc::CC3x2y5 ::CC3x2y5(){ note_ctor("_ZN3ccc7CC3x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y5E, buf);
    ::ccc::CC3x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y5E);
    dp->::ccc::CC3x2y5::~CC3x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y5E(Test__ZN3ccc7CC3x2y5E, "_ZN3ccc7CC3x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y5C1Ev();
extern void _ZN3ccc7CC3x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y5E[] = {
  NSPAIR(_ZN3ccc7CC3x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y5E[];
extern void _ZN3ccc7CC3x2y53efgEv();
extern void _ZN3ccc7CC3x2y53pqrEv();
extern void _ZN3ccc7CC3x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53efgEv,_ZThn4_N3ccc7CC3x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53abcEv,_ZThn4_N3ccc7CC3x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y53pqrEv,_ZThn4_N3ccc7CC3x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y53efgEv,_ZThn4_N3ccc7CC3x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y53abcEv,_ZThn4_N3ccc7CC3x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y53pqrEv,_ZThn4_N3ccc7CC3x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y5E[];
Class_Descriptor cd__ZN3ccc7CC3x2y5E = {  "_ZN3ccc7CC3x2y5E", // class name
  bases__ZN3ccc7CC3x2y5E, 2,
  &(vtc__ZN3ccc7CC3x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y6  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x2y63efgEv
  ~CC3x2y6(); // tgen
  CC3x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y6E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y63abcEv");}
void  ccc::CC3x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y63efgEv");}
ccc::CC3x2y6 ::~CC3x2y6(){ note_dtor("_ZN3ccc7CC3x2y6E", this);} // tgen
ccc::CC3x2y6 ::CC3x2y6(){ note_ctor("_ZN3ccc7CC3x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y6E, buf);
    ::ccc::CC3x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y6E);
    dp->::ccc::CC3x2y6::~CC3x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y6E(Test__ZN3ccc7CC3x2y6E, "_ZN3ccc7CC3x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y6C1Ev();
extern void _ZN3ccc7CC3x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y6E[] = {
  NSPAIR(_ZN3ccc7CC3x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y6E[];
extern void _ZN3ccc7CC3x2y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y63efgEv,_ZThn4_N3ccc7CC3x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y63abcEv,_ZThn4_N3ccc7CC3x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y63efgEv,_ZThn4_N3ccc7CC3x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y63abcEv,_ZThn4_N3ccc7CC3x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y6E[];
Class_Descriptor cd__ZN3ccc7CC3x2y6E = {  "_ZN3ccc7CC3x2y6E", // class name
  bases__ZN3ccc7CC3x2y6E, 2,
  &(vtc__ZN3ccc7CC3x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y7  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC3x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y73pqrEv
  ~CC3x2y7(); // tgen
  CC3x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y7E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y73abcEv");}
void  ccc::CC3x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y73pqrEv");}
ccc::CC3x2y7 ::~CC3x2y7(){ note_dtor("_ZN3ccc7CC3x2y7E", this);} // tgen
ccc::CC3x2y7 ::CC3x2y7(){ note_ctor("_ZN3ccc7CC3x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y7E, buf);
    ::ccc::CC3x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y7E);
    dp->::ccc::CC3x2y7::~CC3x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y7E(Test__ZN3ccc7CC3x2y7E, "_ZN3ccc7CC3x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y7C1Ev();
extern void _ZN3ccc7CC3x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y7E[] = {
  NSPAIR(_ZN3ccc7CC3x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x2y73pqrEv();
extern void _ZN3ccc7CC3x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y73abcEv,_ZThn4_N3ccc7CC3x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y73pqrEv,_ZThn4_N3ccc7CC3x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y73abcEv,_ZThn4_N3ccc7CC3x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y73pqrEv,_ZThn4_N3ccc7CC3x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y7E[];
Class_Descriptor cd__ZN3ccc7CC3x2y7E = {  "_ZN3ccc7CC3x2y7E", // class name
  bases__ZN3ccc7CC3x2y7E, 2,
  &(vtc__ZN3ccc7CC3x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y8  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x2y83abcEv
  ~CC3x2y8(); // tgen
  CC3x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y8E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y83efgEv");}
void  ccc::CC3x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x2y83abcEv");}
ccc::CC3x2y8 ::~CC3x2y8(){ note_dtor("_ZN3ccc7CC3x2y8E", this);} // tgen
ccc::CC3x2y8 ::CC3x2y8(){ note_ctor("_ZN3ccc7CC3x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y8E, buf);
    ::ccc::CC3x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y8E);
    dp->::ccc::CC3x2y8::~CC3x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y8E(Test__ZN3ccc7CC3x2y8E, "_ZN3ccc7CC3x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y8C1Ev();
extern void _ZN3ccc7CC3x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y8E[] = {
  NSPAIR(_ZN3ccc7CC3x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y8E[];
extern void _ZN3ccc7CC3x2y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y83efgEv,_ZThn4_N3ccc7CC3x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y83abcEv,_ZThn4_N3ccc7CC3x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y83efgEv,_ZThn4_N3ccc7CC3x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y83abcEv,_ZThn4_N3ccc7CC3x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y8E[];
Class_Descriptor cd__ZN3ccc7CC3x2y8E = {  "_ZN3ccc7CC3x2y8E", // class name
  bases__ZN3ccc7CC3x2y8E, 2,
  &(vtc__ZN3ccc7CC3x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y9  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC3x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x2y93pqrEv
  ~CC3x2y9(); // tgen
  CC3x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x2y9E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x2y93efgEv");}
void  ccc::CC3x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x2y93pqrEv");}
ccc::CC3x2y9 ::~CC3x2y9(){ note_dtor("_ZN3ccc7CC3x2y9E", this);} // tgen
ccc::CC3x2y9 ::CC3x2y9(){ note_ctor("_ZN3ccc7CC3x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x2y9E, buf);
    ::ccc::CC3x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x2y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC3x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x2y9E);
    dp->::ccc::CC3x2y9::~CC3x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x2y9E(Test__ZN3ccc7CC3x2y9E, "_ZN3ccc7CC3x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x2y9C1Ev();
extern void _ZN3ccc7CC3x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x2y9E[] = {
  NSPAIR(_ZN3ccc7CC3x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC3x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y9E[];
extern void _ZN3ccc7CC3x2y93efgEv();
extern void _ZN3ccc7CC3x2y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y93efgEv,_ZThn4_N3ccc7CC3x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x2y93pqrEv,_ZThn4_N3ccc7CC3x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y93efgEv,_ZThn4_N3ccc7CC3x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x2y93pqrEv,_ZThn4_N3ccc7CC3x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x2y9E[];
Class_Descriptor cd__ZN3ccc7CC3x2y9E = {  "_ZN3ccc7CC3x2y9E", // class name
  bases__ZN3ccc7CC3x2y9E, 2,
  &(vtc__ZN3ccc7CC3x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y10  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x2y103abcEv
  ~CC3x2y10(); // tgen
  CC3x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y10E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y103pqrEv");}
void  ccc::CC3x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x2y103abcEv");}
ccc::CC3x2y10 ::~CC3x2y10(){ note_dtor("_ZN3ccc8CC3x2y10E", this);} // tgen
ccc::CC3x2y10 ::CC3x2y10(){ note_ctor("_ZN3ccc8CC3x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y10E, buf);
    ::ccc::CC3x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y10E);
    dp->::ccc::CC3x2y10::~CC3x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y10E(Test__ZN3ccc8CC3x2y10E, "_ZN3ccc8CC3x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y10C1Ev();
extern void _ZN3ccc8CC3x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y10E[] = {
  NSPAIR(_ZN3ccc8CC3x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x2y103pqrEv();
extern void _ZN3ccc8CC3x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y103abcEv,_ZThn4_N3ccc8CC3x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y103pqrEv,_ZThn4_N3ccc8CC3x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y103abcEv,_ZThn4_N3ccc8CC3x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y103pqrEv,_ZThn4_N3ccc8CC3x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y10E[];
Class_Descriptor cd__ZN3ccc8CC3x2y10E = {  "_ZN3ccc8CC3x2y10E", // class name
  bases__ZN3ccc8CC3x2y10E, 2,
  &(vtc__ZN3ccc8CC3x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y11  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x2y113efgEv
  ~CC3x2y11(); // tgen
  CC3x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y11E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y113pqrEv");}
void  ccc::CC3x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x2y113efgEv");}
ccc::CC3x2y11 ::~CC3x2y11(){ note_dtor("_ZN3ccc8CC3x2y11E", this);} // tgen
ccc::CC3x2y11 ::CC3x2y11(){ note_ctor("_ZN3ccc8CC3x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y11E, buf);
    ::ccc::CC3x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y11E);
    dp->::ccc::CC3x2y11::~CC3x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y11E(Test__ZN3ccc8CC3x2y11E, "_ZN3ccc8CC3x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y11C1Ev();
extern void _ZN3ccc8CC3x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y11E[] = {
  NSPAIR(_ZN3ccc8CC3x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y11E[];
extern void _ZN3ccc8CC3x2y113efgEv();
extern void _ZN3ccc8CC3x2y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y113efgEv,_ZThn4_N3ccc8CC3x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y113pqrEv,_ZThn4_N3ccc8CC3x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y113efgEv,_ZThn4_N3ccc8CC3x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y113pqrEv,_ZThn4_N3ccc8CC3x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y11E[];
Class_Descriptor cd__ZN3ccc8CC3x2y11E = {  "_ZN3ccc8CC3x2y11E", // class name
  bases__ZN3ccc8CC3x2y11E, 2,
  &(vtc__ZN3ccc8CC3x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y12  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC3x2y123abcEv
  ~CC3x2y12(); // tgen
  CC3x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x2y123abcEv");}
ccc::CC3x2y12 ::~CC3x2y12(){ note_dtor("_ZN3ccc8CC3x2y12E", this);} // tgen
ccc::CC3x2y12 ::CC3x2y12(){ note_ctor("_ZN3ccc8CC3x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y12E, buf);
    ::ccc::CC3x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y12E);
    dp->::ccc::CC3x2y12::~CC3x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y12E(Test__ZN3ccc8CC3x2y12E, "_ZN3ccc8CC3x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y12C1Ev();
extern void _ZN3ccc8CC3x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y12E[] = {
  NSPAIR(_ZN3ccc8CC3x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y123abcEv,_ZThn4_N3ccc8CC3x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y123abcEv,_ZThn4_N3ccc8CC3x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y12E[];
Class_Descriptor cd__ZN3ccc8CC3x2y12E = {  "_ZN3ccc8CC3x2y12E", // class name
  bases__ZN3ccc8CC3x2y12E, 2,
  &(vtc__ZN3ccc8CC3x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y13  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC3x2y133efgEv
  ~CC3x2y13(); // tgen
  CC3x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x2y133efgEv");}
ccc::CC3x2y13 ::~CC3x2y13(){ note_dtor("_ZN3ccc8CC3x2y13E", this);} // tgen
ccc::CC3x2y13 ::CC3x2y13(){ note_ctor("_ZN3ccc8CC3x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y13E, buf);
    ::ccc::CC3x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y13E);
    dp->::ccc::CC3x2y13::~CC3x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y13E(Test__ZN3ccc8CC3x2y13E, "_ZN3ccc8CC3x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y13C1Ev();
extern void _ZN3ccc8CC3x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y13E[] = {
  NSPAIR(_ZN3ccc8CC3x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y13E[];
extern void _ZN3ccc8CC3x2y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y133efgEv,_ZThn4_N3ccc8CC3x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y133efgEv,_ZThn4_N3ccc8CC3x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y13E[];
Class_Descriptor cd__ZN3ccc8CC3x2y13E = {  "_ZN3ccc8CC3x2y13E", // class name
  bases__ZN3ccc8CC3x2y13E, 2,
  &(vtc__ZN3ccc8CC3x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y14  : ::ccc::AA3 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC3x2y143pqrEv
  ~CC3x2y14(); // tgen
  CC3x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x2y143pqrEv");}
ccc::CC3x2y14 ::~CC3x2y14(){ note_dtor("_ZN3ccc8CC3x2y14E", this);} // tgen
ccc::CC3x2y14 ::CC3x2y14(){ note_ctor("_ZN3ccc8CC3x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y14E, buf);
    ::ccc::CC3x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y14E);
    dp->::ccc::CC3x2y14::~CC3x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y14E(Test__ZN3ccc8CC3x2y14E, "_ZN3ccc8CC3x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y14C1Ev();
extern void _ZN3ccc8CC3x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y14E[] = {
  NSPAIR(_ZN3ccc8CC3x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x2y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x2y143pqrEv,_ZThn4_N3ccc8CC3x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x2y143pqrEv,_ZThn4_N3ccc8CC3x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y14E[];
Class_Descriptor cd__ZN3ccc8CC3x2y14E = {  "_ZN3ccc8CC3x2y14E", // class name
  bases__ZN3ccc8CC3x2y14E, 2,
  &(vtc__ZN3ccc8CC3x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x2y15  : ::ccc::AA3 , ::ccc::BB2 {
  ~CC3x2y15(); // tgen
  CC3x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x2y15 ::~CC3x2y15(){ note_dtor("_ZN3ccc8CC3x2y15E", this);} // tgen
ccc::CC3x2y15 ::CC3x2y15(){ note_ctor("_ZN3ccc8CC3x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x2y15E, buf);
    ::ccc::CC3x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x2y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC3x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x2y15E);
    dp->::ccc::CC3x2y15::~CC3x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x2y15E(Test__ZN3ccc8CC3x2y15E, "_ZN3ccc8CC3x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x2y15C1Ev();
extern void _ZN3ccc8CC3x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x2y15E[] = {
  NSPAIR(_ZN3ccc8CC3x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC3x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x2y15E[];
Class_Descriptor cd__ZN3ccc8CC3x2y15E = {  "_ZN3ccc8CC3x2y15E", // class name
  bases__ZN3ccc8CC3x2y15E, 2,
  &(vtc__ZN3ccc8CC3x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y0  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y03pqrEv
  ~CC3x3y0(); // tgen
  CC3x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y0E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y03abcEv");}
void  ccc::CC3x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y03efgEv");}
void  ccc::CC3x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y03pqrEv");}
ccc::CC3x3y0 ::~CC3x3y0(){ note_dtor("_ZN3ccc7CC3x3y0E", this);} // tgen
ccc::CC3x3y0 ::CC3x3y0(){ note_ctor("_ZN3ccc7CC3x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y0E, buf);
    ::ccc::CC3x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y0E);
    dp->::ccc::CC3x3y0::~CC3x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y0E(Test__ZN3ccc7CC3x3y0E, "_ZN3ccc7CC3x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y0C1Ev();
extern void _ZN3ccc7CC3x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y0E[] = {
  NSPAIR(_ZN3ccc7CC3x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y0E[];
extern void _ZN3ccc7CC3x3y03efgEv();
extern void _ZN3ccc7CC3x3y03pqrEv();
extern void _ZN3ccc7CC3x3y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03efgEv,_ZThn4_N3ccc7CC3x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03pqrEv,_ZThn4_N3ccc7CC3x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y03abcEv,_ZThn4_N3ccc7CC3x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y03efgEv,_ZThn4_N3ccc7CC3x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y03pqrEv,_ZThn4_N3ccc7CC3x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y03abcEv,_ZThn4_N3ccc7CC3x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y0E[];
Class_Descriptor cd__ZN3ccc7CC3x3y0E = {  "_ZN3ccc7CC3x3y0E", // class name
  bases__ZN3ccc7CC3x3y0E, 2,
  &(vtc__ZN3ccc7CC3x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y1  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x3y13efgEv
  ~CC3x3y1(); // tgen
  CC3x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y1E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y13abcEv");}
void  ccc::CC3x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y13pqrEv");}
void  ccc::CC3x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y13efgEv");}
ccc::CC3x3y1 ::~CC3x3y1(){ note_dtor("_ZN3ccc7CC3x3y1E", this);} // tgen
ccc::CC3x3y1 ::CC3x3y1(){ note_ctor("_ZN3ccc7CC3x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y1E, buf);
    ::ccc::CC3x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y1E);
    dp->::ccc::CC3x3y1::~CC3x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y1E(Test__ZN3ccc7CC3x3y1E, "_ZN3ccc7CC3x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y1C1Ev();
extern void _ZN3ccc7CC3x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y1E[] = {
  NSPAIR(_ZN3ccc7CC3x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y1E[];
extern void _ZN3ccc7CC3x3y13efgEv();
extern void _ZN3ccc7CC3x3y13pqrEv();
extern void _ZN3ccc7CC3x3y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13efgEv,_ZThn4_N3ccc7CC3x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13pqrEv,_ZThn4_N3ccc7CC3x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y13abcEv,_ZThn4_N3ccc7CC3x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y13efgEv,_ZThn4_N3ccc7CC3x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y13pqrEv,_ZThn4_N3ccc7CC3x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y13abcEv,_ZThn4_N3ccc7CC3x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y1E[];
Class_Descriptor cd__ZN3ccc7CC3x3y1E = {  "_ZN3ccc7CC3x3y1E", // class name
  bases__ZN3ccc7CC3x3y1E, 2,
  &(vtc__ZN3ccc7CC3x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y2  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y23pqrEv
  ~CC3x3y2(); // tgen
  CC3x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y2E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y23efgEv");}
void  ccc::CC3x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y23abcEv");}
void  ccc::CC3x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y23pqrEv");}
ccc::CC3x3y2 ::~CC3x3y2(){ note_dtor("_ZN3ccc7CC3x3y2E", this);} // tgen
ccc::CC3x3y2 ::CC3x3y2(){ note_ctor("_ZN3ccc7CC3x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y2E, buf);
    ::ccc::CC3x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y2E);
    dp->::ccc::CC3x3y2::~CC3x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y2E(Test__ZN3ccc7CC3x3y2E, "_ZN3ccc7CC3x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y2C1Ev();
extern void _ZN3ccc7CC3x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y2E[] = {
  NSPAIR(_ZN3ccc7CC3x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y2E[];
extern void _ZN3ccc7CC3x3y23efgEv();
extern void _ZN3ccc7CC3x3y23pqrEv();
extern void _ZN3ccc7CC3x3y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23efgEv,_ZThn4_N3ccc7CC3x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23pqrEv,_ZThn4_N3ccc7CC3x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y23abcEv,_ZThn4_N3ccc7CC3x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y23efgEv,_ZThn4_N3ccc7CC3x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y23pqrEv,_ZThn4_N3ccc7CC3x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y23abcEv,_ZThn4_N3ccc7CC3x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y2E[];
Class_Descriptor cd__ZN3ccc7CC3x3y2E = {  "_ZN3ccc7CC3x3y2E", // class name
  bases__ZN3ccc7CC3x3y2E, 2,
  &(vtc__ZN3ccc7CC3x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y3  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x3y33abcEv
  ~CC3x3y3(); // tgen
  CC3x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y3E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y33efgEv");}
void  ccc::CC3x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y33pqrEv");}
void  ccc::CC3x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y33abcEv");}
ccc::CC3x3y3 ::~CC3x3y3(){ note_dtor("_ZN3ccc7CC3x3y3E", this);} // tgen
ccc::CC3x3y3 ::CC3x3y3(){ note_ctor("_ZN3ccc7CC3x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y3E, buf);
    ::ccc::CC3x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y3E);
    dp->::ccc::CC3x3y3::~CC3x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y3E(Test__ZN3ccc7CC3x3y3E, "_ZN3ccc7CC3x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y3C1Ev();
extern void _ZN3ccc7CC3x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y3E[] = {
  NSPAIR(_ZN3ccc7CC3x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y3E[];
extern void _ZN3ccc7CC3x3y33efgEv();
extern void _ZN3ccc7CC3x3y33pqrEv();
extern void _ZN3ccc7CC3x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33efgEv,_ZThn4_N3ccc7CC3x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33pqrEv,_ZThn4_N3ccc7CC3x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y33abcEv,_ZThn4_N3ccc7CC3x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y33efgEv,_ZThn4_N3ccc7CC3x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y33pqrEv,_ZThn4_N3ccc7CC3x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y33abcEv,_ZThn4_N3ccc7CC3x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y3E[];
Class_Descriptor cd__ZN3ccc7CC3x3y3E = {  "_ZN3ccc7CC3x3y3E", // class name
  bases__ZN3ccc7CC3x3y3E, 2,
  &(vtc__ZN3ccc7CC3x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y4  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC3x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y43efgEv
  ~CC3x3y4(); // tgen
  CC3x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y4E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y43pqrEv");}
void  ccc::CC3x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y43abcEv");}
void  ccc::CC3x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y43efgEv");}
ccc::CC3x3y4 ::~CC3x3y4(){ note_dtor("_ZN3ccc7CC3x3y4E", this);} // tgen
ccc::CC3x3y4 ::CC3x3y4(){ note_ctor("_ZN3ccc7CC3x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y4E, buf);
    ::ccc::CC3x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y4E);
    dp->::ccc::CC3x3y4::~CC3x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y4E(Test__ZN3ccc7CC3x3y4E, "_ZN3ccc7CC3x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y4C1Ev();
extern void _ZN3ccc7CC3x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y4E[] = {
  NSPAIR(_ZN3ccc7CC3x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y4E[];
extern void _ZN3ccc7CC3x3y43efgEv();
extern void _ZN3ccc7CC3x3y43pqrEv();
extern void _ZN3ccc7CC3x3y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43efgEv,_ZThn4_N3ccc7CC3x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43pqrEv,_ZThn4_N3ccc7CC3x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y43abcEv,_ZThn4_N3ccc7CC3x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y43efgEv,_ZThn4_N3ccc7CC3x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y43pqrEv,_ZThn4_N3ccc7CC3x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y43abcEv,_ZThn4_N3ccc7CC3x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y4E[];
Class_Descriptor cd__ZN3ccc7CC3x3y4E = {  "_ZN3ccc7CC3x3y4E", // class name
  bases__ZN3ccc7CC3x3y4E, 2,
  &(vtc__ZN3ccc7CC3x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y5  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC3x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y53abcEv
  ~CC3x3y5(); // tgen
  CC3x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y5E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y53pqrEv");}
void  ccc::CC3x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y53efgEv");}
void  ccc::CC3x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y53abcEv");}
ccc::CC3x3y5 ::~CC3x3y5(){ note_dtor("_ZN3ccc7CC3x3y5E", this);} // tgen
ccc::CC3x3y5 ::CC3x3y5(){ note_ctor("_ZN3ccc7CC3x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y5E, buf);
    ::ccc::CC3x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y5E);
    dp->::ccc::CC3x3y5::~CC3x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y5E(Test__ZN3ccc7CC3x3y5E, "_ZN3ccc7CC3x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y5C1Ev();
extern void _ZN3ccc7CC3x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y5E[] = {
  NSPAIR(_ZN3ccc7CC3x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y5E[];
extern void _ZN3ccc7CC3x3y53efgEv();
extern void _ZN3ccc7CC3x3y53pqrEv();
extern void _ZN3ccc7CC3x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53efgEv,_ZThn4_N3ccc7CC3x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53pqrEv,_ZThn4_N3ccc7CC3x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y53abcEv,_ZThn4_N3ccc7CC3x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y53efgEv,_ZThn4_N3ccc7CC3x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y53pqrEv,_ZThn4_N3ccc7CC3x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y53abcEv,_ZThn4_N3ccc7CC3x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y5E[];
Class_Descriptor cd__ZN3ccc7CC3x3y5E = {  "_ZN3ccc7CC3x3y5E", // class name
  bases__ZN3ccc7CC3x3y5E, 2,
  &(vtc__ZN3ccc7CC3x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y6  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x3y63efgEv
  ~CC3x3y6(); // tgen
  CC3x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y6E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y63abcEv");}
void  ccc::CC3x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y63efgEv");}
ccc::CC3x3y6 ::~CC3x3y6(){ note_dtor("_ZN3ccc7CC3x3y6E", this);} // tgen
ccc::CC3x3y6 ::CC3x3y6(){ note_ctor("_ZN3ccc7CC3x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y6E, buf);
    ::ccc::CC3x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y6E);
    dp->::ccc::CC3x3y6::~CC3x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y6E(Test__ZN3ccc7CC3x3y6E, "_ZN3ccc7CC3x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y6C1Ev();
extern void _ZN3ccc7CC3x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y6E[] = {
  NSPAIR(_ZN3ccc7CC3x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y6E[];
extern void _ZN3ccc7CC3x3y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y63efgEv,_ZThn4_N3ccc7CC3x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y63abcEv,_ZThn4_N3ccc7CC3x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y63efgEv,_ZThn4_N3ccc7CC3x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y63abcEv,_ZThn4_N3ccc7CC3x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y6E[];
Class_Descriptor cd__ZN3ccc7CC3x3y6E = {  "_ZN3ccc7CC3x3y6E", // class name
  bases__ZN3ccc7CC3x3y6E, 2,
  &(vtc__ZN3ccc7CC3x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y7  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC3x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y73pqrEv
  ~CC3x3y7(); // tgen
  CC3x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y7E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y73abcEv");}
void  ccc::CC3x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y73pqrEv");}
ccc::CC3x3y7 ::~CC3x3y7(){ note_dtor("_ZN3ccc7CC3x3y7E", this);} // tgen
ccc::CC3x3y7 ::CC3x3y7(){ note_ctor("_ZN3ccc7CC3x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y7E, buf);
    ::ccc::CC3x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y7E);
    dp->::ccc::CC3x3y7::~CC3x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y7E(Test__ZN3ccc7CC3x3y7E, "_ZN3ccc7CC3x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y7C1Ev();
extern void _ZN3ccc7CC3x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y7E[] = {
  NSPAIR(_ZN3ccc7CC3x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x3y73pqrEv();
extern void _ZN3ccc7CC3x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y73pqrEv,_ZThn4_N3ccc7CC3x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y73abcEv,_ZThn4_N3ccc7CC3x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y73pqrEv,_ZThn4_N3ccc7CC3x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y73abcEv,_ZThn4_N3ccc7CC3x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y7E[];
Class_Descriptor cd__ZN3ccc7CC3x3y7E = {  "_ZN3ccc7CC3x3y7E", // class name
  bases__ZN3ccc7CC3x3y7E, 2,
  &(vtc__ZN3ccc7CC3x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y8  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x3y83abcEv
  ~CC3x3y8(); // tgen
  CC3x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y8E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y83efgEv");}
void  ccc::CC3x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x3y83abcEv");}
ccc::CC3x3y8 ::~CC3x3y8(){ note_dtor("_ZN3ccc7CC3x3y8E", this);} // tgen
ccc::CC3x3y8 ::CC3x3y8(){ note_ctor("_ZN3ccc7CC3x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y8E, buf);
    ::ccc::CC3x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y8E);
    dp->::ccc::CC3x3y8::~CC3x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y8E(Test__ZN3ccc7CC3x3y8E, "_ZN3ccc7CC3x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y8C1Ev();
extern void _ZN3ccc7CC3x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y8E[] = {
  NSPAIR(_ZN3ccc7CC3x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y8E[];
extern void _ZN3ccc7CC3x3y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y83efgEv,_ZThn4_N3ccc7CC3x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y83abcEv,_ZThn4_N3ccc7CC3x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y83efgEv,_ZThn4_N3ccc7CC3x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y83abcEv,_ZThn4_N3ccc7CC3x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y8E[];
Class_Descriptor cd__ZN3ccc7CC3x3y8E = {  "_ZN3ccc7CC3x3y8E", // class name
  bases__ZN3ccc7CC3x3y8E, 2,
  &(vtc__ZN3ccc7CC3x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y9  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC3x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x3y93pqrEv
  ~CC3x3y9(); // tgen
  CC3x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x3y9E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x3y93efgEv");}
void  ccc::CC3x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x3y93pqrEv");}
ccc::CC3x3y9 ::~CC3x3y9(){ note_dtor("_ZN3ccc7CC3x3y9E", this);} // tgen
ccc::CC3x3y9 ::CC3x3y9(){ note_ctor("_ZN3ccc7CC3x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x3y9E, buf);
    ::ccc::CC3x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x3y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC3x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x3y9E);
    dp->::ccc::CC3x3y9::~CC3x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x3y9E(Test__ZN3ccc7CC3x3y9E, "_ZN3ccc7CC3x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x3y9C1Ev();
extern void _ZN3ccc7CC3x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x3y9E[] = {
  NSPAIR(_ZN3ccc7CC3x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC3x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y9E[];
extern void _ZN3ccc7CC3x3y93efgEv();
extern void _ZN3ccc7CC3x3y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y93efgEv,_ZThn4_N3ccc7CC3x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x3y93pqrEv,_ZThn4_N3ccc7CC3x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y93efgEv,_ZThn4_N3ccc7CC3x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x3y93pqrEv,_ZThn4_N3ccc7CC3x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x3y9E[];
Class_Descriptor cd__ZN3ccc7CC3x3y9E = {  "_ZN3ccc7CC3x3y9E", // class name
  bases__ZN3ccc7CC3x3y9E, 2,
  &(vtc__ZN3ccc7CC3x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y10  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x3y103abcEv
  ~CC3x3y10(); // tgen
  CC3x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y10E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y103pqrEv");}
void  ccc::CC3x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x3y103abcEv");}
ccc::CC3x3y10 ::~CC3x3y10(){ note_dtor("_ZN3ccc8CC3x3y10E", this);} // tgen
ccc::CC3x3y10 ::CC3x3y10(){ note_ctor("_ZN3ccc8CC3x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y10E, buf);
    ::ccc::CC3x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y10E);
    dp->::ccc::CC3x3y10::~CC3x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y10E(Test__ZN3ccc8CC3x3y10E, "_ZN3ccc8CC3x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y10C1Ev();
extern void _ZN3ccc8CC3x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y10E[] = {
  NSPAIR(_ZN3ccc8CC3x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x3y103pqrEv();
extern void _ZN3ccc8CC3x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y103pqrEv,_ZThn4_N3ccc8CC3x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y103abcEv,_ZThn4_N3ccc8CC3x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y103pqrEv,_ZThn4_N3ccc8CC3x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y103abcEv,_ZThn4_N3ccc8CC3x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y10E[];
Class_Descriptor cd__ZN3ccc8CC3x3y10E = {  "_ZN3ccc8CC3x3y10E", // class name
  bases__ZN3ccc8CC3x3y10E, 2,
  &(vtc__ZN3ccc8CC3x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y11  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x3y113efgEv
  ~CC3x3y11(); // tgen
  CC3x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y11E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y113pqrEv");}
void  ccc::CC3x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x3y113efgEv");}
ccc::CC3x3y11 ::~CC3x3y11(){ note_dtor("_ZN3ccc8CC3x3y11E", this);} // tgen
ccc::CC3x3y11 ::CC3x3y11(){ note_ctor("_ZN3ccc8CC3x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y11E, buf);
    ::ccc::CC3x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y11E);
    dp->::ccc::CC3x3y11::~CC3x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y11E(Test__ZN3ccc8CC3x3y11E, "_ZN3ccc8CC3x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y11C1Ev();
extern void _ZN3ccc8CC3x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y11E[] = {
  NSPAIR(_ZN3ccc8CC3x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y11E[];
extern void _ZN3ccc8CC3x3y113efgEv();
extern void _ZN3ccc8CC3x3y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y113efgEv,_ZThn4_N3ccc8CC3x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y113pqrEv,_ZThn4_N3ccc8CC3x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y113efgEv,_ZThn4_N3ccc8CC3x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y113pqrEv,_ZThn4_N3ccc8CC3x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y11E[];
Class_Descriptor cd__ZN3ccc8CC3x3y11E = {  "_ZN3ccc8CC3x3y11E", // class name
  bases__ZN3ccc8CC3x3y11E, 2,
  &(vtc__ZN3ccc8CC3x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y12  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC3x3y123abcEv
  ~CC3x3y12(); // tgen
  CC3x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x3y123abcEv");}
ccc::CC3x3y12 ::~CC3x3y12(){ note_dtor("_ZN3ccc8CC3x3y12E", this);} // tgen
ccc::CC3x3y12 ::CC3x3y12(){ note_ctor("_ZN3ccc8CC3x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y12E, buf);
    ::ccc::CC3x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y12E);
    dp->::ccc::CC3x3y12::~CC3x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y12E(Test__ZN3ccc8CC3x3y12E, "_ZN3ccc8CC3x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y12C1Ev();
extern void _ZN3ccc8CC3x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y12E[] = {
  NSPAIR(_ZN3ccc8CC3x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y123abcEv,_ZThn4_N3ccc8CC3x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y123abcEv,_ZThn4_N3ccc8CC3x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y12E[];
Class_Descriptor cd__ZN3ccc8CC3x3y12E = {  "_ZN3ccc8CC3x3y12E", // class name
  bases__ZN3ccc8CC3x3y12E, 2,
  &(vtc__ZN3ccc8CC3x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y13  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC3x3y133efgEv
  ~CC3x3y13(); // tgen
  CC3x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x3y133efgEv");}
ccc::CC3x3y13 ::~CC3x3y13(){ note_dtor("_ZN3ccc8CC3x3y13E", this);} // tgen
ccc::CC3x3y13 ::CC3x3y13(){ note_ctor("_ZN3ccc8CC3x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y13E, buf);
    ::ccc::CC3x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y13E);
    dp->::ccc::CC3x3y13::~CC3x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y13E(Test__ZN3ccc8CC3x3y13E, "_ZN3ccc8CC3x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y13C1Ev();
extern void _ZN3ccc8CC3x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y13E[] = {
  NSPAIR(_ZN3ccc8CC3x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y13E[];
extern void _ZN3ccc8CC3x3y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y133efgEv,_ZThn4_N3ccc8CC3x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y133efgEv,_ZThn4_N3ccc8CC3x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y13E[];
Class_Descriptor cd__ZN3ccc8CC3x3y13E = {  "_ZN3ccc8CC3x3y13E", // class name
  bases__ZN3ccc8CC3x3y13E, 2,
  &(vtc__ZN3ccc8CC3x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y14  : ::ccc::AA3 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC3x3y143pqrEv
  ~CC3x3y14(); // tgen
  CC3x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x3y143pqrEv");}
ccc::CC3x3y14 ::~CC3x3y14(){ note_dtor("_ZN3ccc8CC3x3y14E", this);} // tgen
ccc::CC3x3y14 ::CC3x3y14(){ note_ctor("_ZN3ccc8CC3x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y14E, buf);
    ::ccc::CC3x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y14E);
    dp->::ccc::CC3x3y14::~CC3x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y14E(Test__ZN3ccc8CC3x3y14E, "_ZN3ccc8CC3x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y14C1Ev();
extern void _ZN3ccc8CC3x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y14E[] = {
  NSPAIR(_ZN3ccc8CC3x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x3y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x3y143pqrEv,_ZThn4_N3ccc8CC3x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x3y143pqrEv,_ZThn4_N3ccc8CC3x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y14E[];
Class_Descriptor cd__ZN3ccc8CC3x3y14E = {  "_ZN3ccc8CC3x3y14E", // class name
  bases__ZN3ccc8CC3x3y14E, 2,
  &(vtc__ZN3ccc8CC3x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x3y15  : ::ccc::AA3 , ::ccc::BB3 {
  ~CC3x3y15(); // tgen
  CC3x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x3y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x3y15 ::~CC3x3y15(){ note_dtor("_ZN3ccc8CC3x3y15E", this);} // tgen
ccc::CC3x3y15 ::CC3x3y15(){ note_ctor("_ZN3ccc8CC3x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x3y15E, buf);
    ::ccc::CC3x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x3y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC3x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x3y15E);
    dp->::ccc::CC3x3y15::~CC3x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x3y15E(Test__ZN3ccc8CC3x3y15E, "_ZN3ccc8CC3x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x3y15C1Ev();
extern void _ZN3ccc8CC3x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x3y15E[] = {
  NSPAIR(_ZN3ccc8CC3x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC3x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x3y15E[];
Class_Descriptor cd__ZN3ccc8CC3x3y15E = {  "_ZN3ccc8CC3x3y15E", // class name
  bases__ZN3ccc8CC3x3y15E, 2,
  &(vtc__ZN3ccc8CC3x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y0  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y03pqrEv
  ~CC3x4y0(); // tgen
  CC3x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y0E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y03abcEv");}
void  ccc::CC3x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y03efgEv");}
void  ccc::CC3x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y03pqrEv");}
ccc::CC3x4y0 ::~CC3x4y0(){ note_dtor("_ZN3ccc7CC3x4y0E", this);} // tgen
ccc::CC3x4y0 ::CC3x4y0(){ note_ctor("_ZN3ccc7CC3x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y0E, buf);
    ::ccc::CC3x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y0E);
    dp->::ccc::CC3x4y0::~CC3x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y0E(Test__ZN3ccc7CC3x4y0E, "_ZN3ccc7CC3x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y0C1Ev();
extern void _ZN3ccc7CC3x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y0E[] = {
  NSPAIR(_ZN3ccc7CC3x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y0E[];
extern void _ZN3ccc7CC3x4y03efgEv();
extern void _ZN3ccc7CC3x4y03pqrEv();
extern void _ZN3ccc7CC3x4y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03pqrEv,_ZThn4_N3ccc7CC3x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03abcEv,_ZThn4_N3ccc7CC3x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y03efgEv,_ZThn4_N3ccc7CC3x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y03pqrEv,_ZThn4_N3ccc7CC3x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y03abcEv,_ZThn4_N3ccc7CC3x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y03efgEv,_ZThn4_N3ccc7CC3x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y0E[];
Class_Descriptor cd__ZN3ccc7CC3x4y0E = {  "_ZN3ccc7CC3x4y0E", // class name
  bases__ZN3ccc7CC3x4y0E, 2,
  &(vtc__ZN3ccc7CC3x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y1  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x4y13efgEv
  ~CC3x4y1(); // tgen
  CC3x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y1E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y13abcEv");}
void  ccc::CC3x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y13pqrEv");}
void  ccc::CC3x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y13efgEv");}
ccc::CC3x4y1 ::~CC3x4y1(){ note_dtor("_ZN3ccc7CC3x4y1E", this);} // tgen
ccc::CC3x4y1 ::CC3x4y1(){ note_ctor("_ZN3ccc7CC3x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y1E, buf);
    ::ccc::CC3x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y1E);
    dp->::ccc::CC3x4y1::~CC3x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y1E(Test__ZN3ccc7CC3x4y1E, "_ZN3ccc7CC3x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y1C1Ev();
extern void _ZN3ccc7CC3x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y1E[] = {
  NSPAIR(_ZN3ccc7CC3x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y1E[];
extern void _ZN3ccc7CC3x4y13efgEv();
extern void _ZN3ccc7CC3x4y13pqrEv();
extern void _ZN3ccc7CC3x4y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13pqrEv,_ZThn4_N3ccc7CC3x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13abcEv,_ZThn4_N3ccc7CC3x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y13efgEv,_ZThn4_N3ccc7CC3x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y13pqrEv,_ZThn4_N3ccc7CC3x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y13abcEv,_ZThn4_N3ccc7CC3x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y13efgEv,_ZThn4_N3ccc7CC3x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y1E[];
Class_Descriptor cd__ZN3ccc7CC3x4y1E = {  "_ZN3ccc7CC3x4y1E", // class name
  bases__ZN3ccc7CC3x4y1E, 2,
  &(vtc__ZN3ccc7CC3x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y2  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y23pqrEv
  ~CC3x4y2(); // tgen
  CC3x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y2E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y23efgEv");}
void  ccc::CC3x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y23abcEv");}
void  ccc::CC3x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y23pqrEv");}
ccc::CC3x4y2 ::~CC3x4y2(){ note_dtor("_ZN3ccc7CC3x4y2E", this);} // tgen
ccc::CC3x4y2 ::CC3x4y2(){ note_ctor("_ZN3ccc7CC3x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y2E, buf);
    ::ccc::CC3x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y2E);
    dp->::ccc::CC3x4y2::~CC3x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y2E(Test__ZN3ccc7CC3x4y2E, "_ZN3ccc7CC3x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y2C1Ev();
extern void _ZN3ccc7CC3x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y2E[] = {
  NSPAIR(_ZN3ccc7CC3x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y2E[];
extern void _ZN3ccc7CC3x4y23efgEv();
extern void _ZN3ccc7CC3x4y23pqrEv();
extern void _ZN3ccc7CC3x4y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23pqrEv,_ZThn4_N3ccc7CC3x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23abcEv,_ZThn4_N3ccc7CC3x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y23efgEv,_ZThn4_N3ccc7CC3x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y23pqrEv,_ZThn4_N3ccc7CC3x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y23abcEv,_ZThn4_N3ccc7CC3x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y23efgEv,_ZThn4_N3ccc7CC3x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y2E[];
Class_Descriptor cd__ZN3ccc7CC3x4y2E = {  "_ZN3ccc7CC3x4y2E", // class name
  bases__ZN3ccc7CC3x4y2E, 2,
  &(vtc__ZN3ccc7CC3x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y3  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x4y33abcEv
  ~CC3x4y3(); // tgen
  CC3x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y3E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y33efgEv");}
void  ccc::CC3x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y33pqrEv");}
void  ccc::CC3x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y33abcEv");}
ccc::CC3x4y3 ::~CC3x4y3(){ note_dtor("_ZN3ccc7CC3x4y3E", this);} // tgen
ccc::CC3x4y3 ::CC3x4y3(){ note_ctor("_ZN3ccc7CC3x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y3E, buf);
    ::ccc::CC3x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y3E);
    dp->::ccc::CC3x4y3::~CC3x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y3E(Test__ZN3ccc7CC3x4y3E, "_ZN3ccc7CC3x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y3C1Ev();
extern void _ZN3ccc7CC3x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y3E[] = {
  NSPAIR(_ZN3ccc7CC3x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y3E[];
extern void _ZN3ccc7CC3x4y33efgEv();
extern void _ZN3ccc7CC3x4y33pqrEv();
extern void _ZN3ccc7CC3x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33pqrEv,_ZThn4_N3ccc7CC3x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33abcEv,_ZThn4_N3ccc7CC3x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y33efgEv,_ZThn4_N3ccc7CC3x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y33pqrEv,_ZThn4_N3ccc7CC3x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y33abcEv,_ZThn4_N3ccc7CC3x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y33efgEv,_ZThn4_N3ccc7CC3x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y3E[];
Class_Descriptor cd__ZN3ccc7CC3x4y3E = {  "_ZN3ccc7CC3x4y3E", // class name
  bases__ZN3ccc7CC3x4y3E, 2,
  &(vtc__ZN3ccc7CC3x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y4  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC3x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y43efgEv
  ~CC3x4y4(); // tgen
  CC3x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y4E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y43pqrEv");}
void  ccc::CC3x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y43abcEv");}
void  ccc::CC3x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y43efgEv");}
ccc::CC3x4y4 ::~CC3x4y4(){ note_dtor("_ZN3ccc7CC3x4y4E", this);} // tgen
ccc::CC3x4y4 ::CC3x4y4(){ note_ctor("_ZN3ccc7CC3x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y4E, buf);
    ::ccc::CC3x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y4E);
    dp->::ccc::CC3x4y4::~CC3x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y4E(Test__ZN3ccc7CC3x4y4E, "_ZN3ccc7CC3x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y4C1Ev();
extern void _ZN3ccc7CC3x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y4E[] = {
  NSPAIR(_ZN3ccc7CC3x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y4E[];
extern void _ZN3ccc7CC3x4y43efgEv();
extern void _ZN3ccc7CC3x4y43pqrEv();
extern void _ZN3ccc7CC3x4y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43pqrEv,_ZThn4_N3ccc7CC3x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43abcEv,_ZThn4_N3ccc7CC3x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y43efgEv,_ZThn4_N3ccc7CC3x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y43pqrEv,_ZThn4_N3ccc7CC3x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y43abcEv,_ZThn4_N3ccc7CC3x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y43efgEv,_ZThn4_N3ccc7CC3x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y4E[];
Class_Descriptor cd__ZN3ccc7CC3x4y4E = {  "_ZN3ccc7CC3x4y4E", // class name
  bases__ZN3ccc7CC3x4y4E, 2,
  &(vtc__ZN3ccc7CC3x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y5  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC3x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y53abcEv
  ~CC3x4y5(); // tgen
  CC3x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y5E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y53pqrEv");}
void  ccc::CC3x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y53efgEv");}
void  ccc::CC3x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y53abcEv");}
ccc::CC3x4y5 ::~CC3x4y5(){ note_dtor("_ZN3ccc7CC3x4y5E", this);} // tgen
ccc::CC3x4y5 ::CC3x4y5(){ note_ctor("_ZN3ccc7CC3x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y5E, buf);
    ::ccc::CC3x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y5E);
    dp->::ccc::CC3x4y5::~CC3x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y5E(Test__ZN3ccc7CC3x4y5E, "_ZN3ccc7CC3x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y5C1Ev();
extern void _ZN3ccc7CC3x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y5E[] = {
  NSPAIR(_ZN3ccc7CC3x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y5E[];
extern void _ZN3ccc7CC3x4y53efgEv();
extern void _ZN3ccc7CC3x4y53pqrEv();
extern void _ZN3ccc7CC3x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53pqrEv,_ZThn4_N3ccc7CC3x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53abcEv,_ZThn4_N3ccc7CC3x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y53efgEv,_ZThn4_N3ccc7CC3x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y53pqrEv,_ZThn4_N3ccc7CC3x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y53abcEv,_ZThn4_N3ccc7CC3x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y53efgEv,_ZThn4_N3ccc7CC3x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y5E[];
Class_Descriptor cd__ZN3ccc7CC3x4y5E = {  "_ZN3ccc7CC3x4y5E", // class name
  bases__ZN3ccc7CC3x4y5E, 2,
  &(vtc__ZN3ccc7CC3x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y6  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x4y63efgEv
  ~CC3x4y6(); // tgen
  CC3x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y6E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y63abcEv");}
void  ccc::CC3x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y63efgEv");}
ccc::CC3x4y6 ::~CC3x4y6(){ note_dtor("_ZN3ccc7CC3x4y6E", this);} // tgen
ccc::CC3x4y6 ::CC3x4y6(){ note_ctor("_ZN3ccc7CC3x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y6E, buf);
    ::ccc::CC3x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y6E);
    dp->::ccc::CC3x4y6::~CC3x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y6E(Test__ZN3ccc7CC3x4y6E, "_ZN3ccc7CC3x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y6C1Ev();
extern void _ZN3ccc7CC3x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y6E[] = {
  NSPAIR(_ZN3ccc7CC3x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y6E[];
extern void _ZN3ccc7CC3x4y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y63abcEv,_ZThn4_N3ccc7CC3x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y63efgEv,_ZThn4_N3ccc7CC3x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y63abcEv,_ZThn4_N3ccc7CC3x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y63efgEv,_ZThn4_N3ccc7CC3x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y6E[];
Class_Descriptor cd__ZN3ccc7CC3x4y6E = {  "_ZN3ccc7CC3x4y6E", // class name
  bases__ZN3ccc7CC3x4y6E, 2,
  &(vtc__ZN3ccc7CC3x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y7  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC3x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y73pqrEv
  ~CC3x4y7(); // tgen
  CC3x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y7E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y73abcEv");}
void  ccc::CC3x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y73pqrEv");}
ccc::CC3x4y7 ::~CC3x4y7(){ note_dtor("_ZN3ccc7CC3x4y7E", this);} // tgen
ccc::CC3x4y7 ::CC3x4y7(){ note_ctor("_ZN3ccc7CC3x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y7E, buf);
    ::ccc::CC3x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y7E);
    dp->::ccc::CC3x4y7::~CC3x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y7E(Test__ZN3ccc7CC3x4y7E, "_ZN3ccc7CC3x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y7C1Ev();
extern void _ZN3ccc7CC3x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y7E[] = {
  NSPAIR(_ZN3ccc7CC3x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x4y73pqrEv();
extern void _ZN3ccc7CC3x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y73pqrEv,_ZThn4_N3ccc7CC3x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y73abcEv,_ZThn4_N3ccc7CC3x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y73pqrEv,_ZThn4_N3ccc7CC3x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y73abcEv,_ZThn4_N3ccc7CC3x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y7E[];
Class_Descriptor cd__ZN3ccc7CC3x4y7E = {  "_ZN3ccc7CC3x4y7E", // class name
  bases__ZN3ccc7CC3x4y7E, 2,
  &(vtc__ZN3ccc7CC3x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y8  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x4y83abcEv
  ~CC3x4y8(); // tgen
  CC3x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y8E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y83efgEv");}
void  ccc::CC3x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x4y83abcEv");}
ccc::CC3x4y8 ::~CC3x4y8(){ note_dtor("_ZN3ccc7CC3x4y8E", this);} // tgen
ccc::CC3x4y8 ::CC3x4y8(){ note_ctor("_ZN3ccc7CC3x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y8E, buf);
    ::ccc::CC3x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y8E);
    dp->::ccc::CC3x4y8::~CC3x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y8E(Test__ZN3ccc7CC3x4y8E, "_ZN3ccc7CC3x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y8C1Ev();
extern void _ZN3ccc7CC3x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y8E[] = {
  NSPAIR(_ZN3ccc7CC3x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y8E[];
extern void _ZN3ccc7CC3x4y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y83abcEv,_ZThn4_N3ccc7CC3x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y83efgEv,_ZThn4_N3ccc7CC3x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y83abcEv,_ZThn4_N3ccc7CC3x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y83efgEv,_ZThn4_N3ccc7CC3x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y8E[];
Class_Descriptor cd__ZN3ccc7CC3x4y8E = {  "_ZN3ccc7CC3x4y8E", // class name
  bases__ZN3ccc7CC3x4y8E, 2,
  &(vtc__ZN3ccc7CC3x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y9  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC3x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x4y93pqrEv
  ~CC3x4y9(); // tgen
  CC3x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x4y9E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x4y93efgEv");}
void  ccc::CC3x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x4y93pqrEv");}
ccc::CC3x4y9 ::~CC3x4y9(){ note_dtor("_ZN3ccc7CC3x4y9E", this);} // tgen
ccc::CC3x4y9 ::CC3x4y9(){ note_ctor("_ZN3ccc7CC3x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x4y9E, buf);
    ::ccc::CC3x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x4y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC3x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x4y9E);
    dp->::ccc::CC3x4y9::~CC3x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x4y9E(Test__ZN3ccc7CC3x4y9E, "_ZN3ccc7CC3x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x4y9C1Ev();
extern void _ZN3ccc7CC3x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x4y9E[] = {
  NSPAIR(_ZN3ccc7CC3x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC3x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y9E[];
extern void _ZN3ccc7CC3x4y93efgEv();
extern void _ZN3ccc7CC3x4y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y93pqrEv,_ZThn4_N3ccc7CC3x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x4y93efgEv,_ZThn4_N3ccc7CC3x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y93pqrEv,_ZThn4_N3ccc7CC3x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x4y93efgEv,_ZThn4_N3ccc7CC3x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x4y9E[];
Class_Descriptor cd__ZN3ccc7CC3x4y9E = {  "_ZN3ccc7CC3x4y9E", // class name
  bases__ZN3ccc7CC3x4y9E, 2,
  &(vtc__ZN3ccc7CC3x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y10  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x4y103abcEv
  ~CC3x4y10(); // tgen
  CC3x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y10E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y103pqrEv");}
void  ccc::CC3x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x4y103abcEv");}
ccc::CC3x4y10 ::~CC3x4y10(){ note_dtor("_ZN3ccc8CC3x4y10E", this);} // tgen
ccc::CC3x4y10 ::CC3x4y10(){ note_ctor("_ZN3ccc8CC3x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y10E, buf);
    ::ccc::CC3x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y10E);
    dp->::ccc::CC3x4y10::~CC3x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y10E(Test__ZN3ccc8CC3x4y10E, "_ZN3ccc8CC3x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y10C1Ev();
extern void _ZN3ccc8CC3x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y10E[] = {
  NSPAIR(_ZN3ccc8CC3x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x4y103pqrEv();
extern void _ZN3ccc8CC3x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y103pqrEv,_ZThn4_N3ccc8CC3x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y103abcEv,_ZThn4_N3ccc8CC3x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y103pqrEv,_ZThn4_N3ccc8CC3x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y103abcEv,_ZThn4_N3ccc8CC3x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y10E[];
Class_Descriptor cd__ZN3ccc8CC3x4y10E = {  "_ZN3ccc8CC3x4y10E", // class name
  bases__ZN3ccc8CC3x4y10E, 2,
  &(vtc__ZN3ccc8CC3x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y11  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x4y113efgEv
  ~CC3x4y11(); // tgen
  CC3x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y11E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y113pqrEv");}
void  ccc::CC3x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x4y113efgEv");}
ccc::CC3x4y11 ::~CC3x4y11(){ note_dtor("_ZN3ccc8CC3x4y11E", this);} // tgen
ccc::CC3x4y11 ::CC3x4y11(){ note_ctor("_ZN3ccc8CC3x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y11E, buf);
    ::ccc::CC3x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y11E);
    dp->::ccc::CC3x4y11::~CC3x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y11E(Test__ZN3ccc8CC3x4y11E, "_ZN3ccc8CC3x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y11C1Ev();
extern void _ZN3ccc8CC3x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y11E[] = {
  NSPAIR(_ZN3ccc8CC3x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y11E[];
extern void _ZN3ccc8CC3x4y113efgEv();
extern void _ZN3ccc8CC3x4y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y113pqrEv,_ZThn4_N3ccc8CC3x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y113efgEv,_ZThn4_N3ccc8CC3x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y113pqrEv,_ZThn4_N3ccc8CC3x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y113efgEv,_ZThn4_N3ccc8CC3x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y11E[];
Class_Descriptor cd__ZN3ccc8CC3x4y11E = {  "_ZN3ccc8CC3x4y11E", // class name
  bases__ZN3ccc8CC3x4y11E, 2,
  &(vtc__ZN3ccc8CC3x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y12  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC3x4y123abcEv
  ~CC3x4y12(); // tgen
  CC3x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x4y123abcEv");}
ccc::CC3x4y12 ::~CC3x4y12(){ note_dtor("_ZN3ccc8CC3x4y12E", this);} // tgen
ccc::CC3x4y12 ::CC3x4y12(){ note_ctor("_ZN3ccc8CC3x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y12E, buf);
    ::ccc::CC3x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y12E);
    dp->::ccc::CC3x4y12::~CC3x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y12E(Test__ZN3ccc8CC3x4y12E, "_ZN3ccc8CC3x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y12C1Ev();
extern void _ZN3ccc8CC3x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y12E[] = {
  NSPAIR(_ZN3ccc8CC3x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y123abcEv,_ZThn4_N3ccc8CC3x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y123abcEv,_ZThn4_N3ccc8CC3x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y12E[];
Class_Descriptor cd__ZN3ccc8CC3x4y12E = {  "_ZN3ccc8CC3x4y12E", // class name
  bases__ZN3ccc8CC3x4y12E, 2,
  &(vtc__ZN3ccc8CC3x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y13  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC3x4y133efgEv
  ~CC3x4y13(); // tgen
  CC3x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x4y133efgEv");}
ccc::CC3x4y13 ::~CC3x4y13(){ note_dtor("_ZN3ccc8CC3x4y13E", this);} // tgen
ccc::CC3x4y13 ::CC3x4y13(){ note_ctor("_ZN3ccc8CC3x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y13E, buf);
    ::ccc::CC3x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y13E);
    dp->::ccc::CC3x4y13::~CC3x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y13E(Test__ZN3ccc8CC3x4y13E, "_ZN3ccc8CC3x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y13C1Ev();
extern void _ZN3ccc8CC3x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y13E[] = {
  NSPAIR(_ZN3ccc8CC3x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y13E[];
extern void _ZN3ccc8CC3x4y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y133efgEv,_ZThn4_N3ccc8CC3x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y133efgEv,_ZThn4_N3ccc8CC3x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y13E[];
Class_Descriptor cd__ZN3ccc8CC3x4y13E = {  "_ZN3ccc8CC3x4y13E", // class name
  bases__ZN3ccc8CC3x4y13E, 2,
  &(vtc__ZN3ccc8CC3x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y14  : ::ccc::AA3 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC3x4y143pqrEv
  ~CC3x4y14(); // tgen
  CC3x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x4y143pqrEv");}
ccc::CC3x4y14 ::~CC3x4y14(){ note_dtor("_ZN3ccc8CC3x4y14E", this);} // tgen
ccc::CC3x4y14 ::CC3x4y14(){ note_ctor("_ZN3ccc8CC3x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y14E, buf);
    ::ccc::CC3x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y14E);
    dp->::ccc::CC3x4y14::~CC3x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y14E(Test__ZN3ccc8CC3x4y14E, "_ZN3ccc8CC3x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y14C1Ev();
extern void _ZN3ccc8CC3x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y14E[] = {
  NSPAIR(_ZN3ccc8CC3x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x4y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x4y143pqrEv,_ZThn4_N3ccc8CC3x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x4y143pqrEv,_ZThn4_N3ccc8CC3x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y14E[];
Class_Descriptor cd__ZN3ccc8CC3x4y14E = {  "_ZN3ccc8CC3x4y14E", // class name
  bases__ZN3ccc8CC3x4y14E, 2,
  &(vtc__ZN3ccc8CC3x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x4y15  : ::ccc::AA3 , ::ccc::BB4 {
  ~CC3x4y15(); // tgen
  CC3x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x4y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x4y15 ::~CC3x4y15(){ note_dtor("_ZN3ccc8CC3x4y15E", this);} // tgen
ccc::CC3x4y15 ::CC3x4y15(){ note_ctor("_ZN3ccc8CC3x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x4y15E, buf);
    ::ccc::CC3x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x4y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC3x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x4y15E);
    dp->::ccc::CC3x4y15::~CC3x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x4y15E(Test__ZN3ccc8CC3x4y15E, "_ZN3ccc8CC3x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x4y15C1Ev();
extern void _ZN3ccc8CC3x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x4y15E[] = {
  NSPAIR(_ZN3ccc8CC3x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC3x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x4y15E[];
Class_Descriptor cd__ZN3ccc8CC3x4y15E = {  "_ZN3ccc8CC3x4y15E", // class name
  bases__ZN3ccc8CC3x4y15E, 2,
  &(vtc__ZN3ccc8CC3x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y0  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y03pqrEv
  ~CC3x5y0(); // tgen
  CC3x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y0E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y03abcEv");}
void  ccc::CC3x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y03efgEv");}
void  ccc::CC3x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y03pqrEv");}
ccc::CC3x5y0 ::~CC3x5y0(){ note_dtor("_ZN3ccc7CC3x5y0E", this);} // tgen
ccc::CC3x5y0 ::CC3x5y0(){ note_ctor("_ZN3ccc7CC3x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y0E, buf);
    ::ccc::CC3x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y0E);
    dp->::ccc::CC3x5y0::~CC3x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y0E(Test__ZN3ccc7CC3x5y0E, "_ZN3ccc7CC3x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y0C1Ev();
extern void _ZN3ccc7CC3x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y0E[] = {
  NSPAIR(_ZN3ccc7CC3x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y0E[];
extern void _ZN3ccc7CC3x5y03efgEv();
extern void _ZN3ccc7CC3x5y03pqrEv();
extern void _ZN3ccc7CC3x5y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03pqrEv,_ZThn4_N3ccc7CC3x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03efgEv,_ZThn4_N3ccc7CC3x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y03abcEv,_ZThn4_N3ccc7CC3x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y03pqrEv,_ZThn4_N3ccc7CC3x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y03efgEv,_ZThn4_N3ccc7CC3x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y03abcEv,_ZThn4_N3ccc7CC3x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y0E[];
Class_Descriptor cd__ZN3ccc7CC3x5y0E = {  "_ZN3ccc7CC3x5y0E", // class name
  bases__ZN3ccc7CC3x5y0E, 2,
  &(vtc__ZN3ccc7CC3x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y1  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x5y13efgEv
  ~CC3x5y1(); // tgen
  CC3x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y1E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y13abcEv");}
void  ccc::CC3x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y13pqrEv");}
void  ccc::CC3x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y13efgEv");}
ccc::CC3x5y1 ::~CC3x5y1(){ note_dtor("_ZN3ccc7CC3x5y1E", this);} // tgen
ccc::CC3x5y1 ::CC3x5y1(){ note_ctor("_ZN3ccc7CC3x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y1E, buf);
    ::ccc::CC3x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y1E);
    dp->::ccc::CC3x5y1::~CC3x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y1E(Test__ZN3ccc7CC3x5y1E, "_ZN3ccc7CC3x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y1C1Ev();
extern void _ZN3ccc7CC3x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y1E[] = {
  NSPAIR(_ZN3ccc7CC3x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y1E[];
extern void _ZN3ccc7CC3x5y13efgEv();
extern void _ZN3ccc7CC3x5y13pqrEv();
extern void _ZN3ccc7CC3x5y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13pqrEv,_ZThn4_N3ccc7CC3x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13efgEv,_ZThn4_N3ccc7CC3x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y13abcEv,_ZThn4_N3ccc7CC3x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y13pqrEv,_ZThn4_N3ccc7CC3x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y13efgEv,_ZThn4_N3ccc7CC3x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y13abcEv,_ZThn4_N3ccc7CC3x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y1E[];
Class_Descriptor cd__ZN3ccc7CC3x5y1E = {  "_ZN3ccc7CC3x5y1E", // class name
  bases__ZN3ccc7CC3x5y1E, 2,
  &(vtc__ZN3ccc7CC3x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y2  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y23pqrEv
  ~CC3x5y2(); // tgen
  CC3x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y2E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y23efgEv");}
void  ccc::CC3x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y23abcEv");}
void  ccc::CC3x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y23pqrEv");}
ccc::CC3x5y2 ::~CC3x5y2(){ note_dtor("_ZN3ccc7CC3x5y2E", this);} // tgen
ccc::CC3x5y2 ::CC3x5y2(){ note_ctor("_ZN3ccc7CC3x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y2E, buf);
    ::ccc::CC3x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y2E);
    dp->::ccc::CC3x5y2::~CC3x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y2E(Test__ZN3ccc7CC3x5y2E, "_ZN3ccc7CC3x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y2C1Ev();
extern void _ZN3ccc7CC3x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y2E[] = {
  NSPAIR(_ZN3ccc7CC3x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y2E[];
extern void _ZN3ccc7CC3x5y23efgEv();
extern void _ZN3ccc7CC3x5y23pqrEv();
extern void _ZN3ccc7CC3x5y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23pqrEv,_ZThn4_N3ccc7CC3x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23efgEv,_ZThn4_N3ccc7CC3x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y23abcEv,_ZThn4_N3ccc7CC3x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y23pqrEv,_ZThn4_N3ccc7CC3x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y23efgEv,_ZThn4_N3ccc7CC3x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y23abcEv,_ZThn4_N3ccc7CC3x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y2E[];
Class_Descriptor cd__ZN3ccc7CC3x5y2E = {  "_ZN3ccc7CC3x5y2E", // class name
  bases__ZN3ccc7CC3x5y2E, 2,
  &(vtc__ZN3ccc7CC3x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y3  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x5y33abcEv
  ~CC3x5y3(); // tgen
  CC3x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y3E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y33efgEv");}
void  ccc::CC3x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y33pqrEv");}
void  ccc::CC3x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y33abcEv");}
ccc::CC3x5y3 ::~CC3x5y3(){ note_dtor("_ZN3ccc7CC3x5y3E", this);} // tgen
ccc::CC3x5y3 ::CC3x5y3(){ note_ctor("_ZN3ccc7CC3x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y3E, buf);
    ::ccc::CC3x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y3E);
    dp->::ccc::CC3x5y3::~CC3x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y3E(Test__ZN3ccc7CC3x5y3E, "_ZN3ccc7CC3x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y3C1Ev();
extern void _ZN3ccc7CC3x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y3E[] = {
  NSPAIR(_ZN3ccc7CC3x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y3E[];
extern void _ZN3ccc7CC3x5y33efgEv();
extern void _ZN3ccc7CC3x5y33pqrEv();
extern void _ZN3ccc7CC3x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33pqrEv,_ZThn4_N3ccc7CC3x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33efgEv,_ZThn4_N3ccc7CC3x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y33abcEv,_ZThn4_N3ccc7CC3x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y33pqrEv,_ZThn4_N3ccc7CC3x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y33efgEv,_ZThn4_N3ccc7CC3x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y33abcEv,_ZThn4_N3ccc7CC3x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y3E[];
Class_Descriptor cd__ZN3ccc7CC3x5y3E = {  "_ZN3ccc7CC3x5y3E", // class name
  bases__ZN3ccc7CC3x5y3E, 2,
  &(vtc__ZN3ccc7CC3x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y4  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC3x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y43efgEv
  ~CC3x5y4(); // tgen
  CC3x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y4E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y43pqrEv");}
void  ccc::CC3x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y43abcEv");}
void  ccc::CC3x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y43efgEv");}
ccc::CC3x5y4 ::~CC3x5y4(){ note_dtor("_ZN3ccc7CC3x5y4E", this);} // tgen
ccc::CC3x5y4 ::CC3x5y4(){ note_ctor("_ZN3ccc7CC3x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y4E, buf);
    ::ccc::CC3x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y4E);
    dp->::ccc::CC3x5y4::~CC3x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y4E(Test__ZN3ccc7CC3x5y4E, "_ZN3ccc7CC3x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y4C1Ev();
extern void _ZN3ccc7CC3x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y4E[] = {
  NSPAIR(_ZN3ccc7CC3x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y4E[];
extern void _ZN3ccc7CC3x5y43efgEv();
extern void _ZN3ccc7CC3x5y43pqrEv();
extern void _ZN3ccc7CC3x5y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43pqrEv,_ZThn4_N3ccc7CC3x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43efgEv,_ZThn4_N3ccc7CC3x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y43abcEv,_ZThn4_N3ccc7CC3x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y43pqrEv,_ZThn4_N3ccc7CC3x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y43efgEv,_ZThn4_N3ccc7CC3x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y43abcEv,_ZThn4_N3ccc7CC3x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y4E[];
Class_Descriptor cd__ZN3ccc7CC3x5y4E = {  "_ZN3ccc7CC3x5y4E", // class name
  bases__ZN3ccc7CC3x5y4E, 2,
  &(vtc__ZN3ccc7CC3x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y5  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC3x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y53abcEv
  ~CC3x5y5(); // tgen
  CC3x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y5E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y53pqrEv");}
void  ccc::CC3x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y53efgEv");}
void  ccc::CC3x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y53abcEv");}
ccc::CC3x5y5 ::~CC3x5y5(){ note_dtor("_ZN3ccc7CC3x5y5E", this);} // tgen
ccc::CC3x5y5 ::CC3x5y5(){ note_ctor("_ZN3ccc7CC3x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y5E, buf);
    ::ccc::CC3x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y5E);
    dp->::ccc::CC3x5y5::~CC3x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y5E(Test__ZN3ccc7CC3x5y5E, "_ZN3ccc7CC3x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y5C1Ev();
extern void _ZN3ccc7CC3x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y5E[] = {
  NSPAIR(_ZN3ccc7CC3x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y5E[];
extern void _ZN3ccc7CC3x5y53efgEv();
extern void _ZN3ccc7CC3x5y53pqrEv();
extern void _ZN3ccc7CC3x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53pqrEv,_ZThn4_N3ccc7CC3x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53efgEv,_ZThn4_N3ccc7CC3x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y53abcEv,_ZThn4_N3ccc7CC3x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y53pqrEv,_ZThn4_N3ccc7CC3x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y53efgEv,_ZThn4_N3ccc7CC3x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y53abcEv,_ZThn4_N3ccc7CC3x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y5E[];
Class_Descriptor cd__ZN3ccc7CC3x5y5E = {  "_ZN3ccc7CC3x5y5E", // class name
  bases__ZN3ccc7CC3x5y5E, 2,
  &(vtc__ZN3ccc7CC3x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y6  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x5y63efgEv
  ~CC3x5y6(); // tgen
  CC3x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y6E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y63abcEv");}
void  ccc::CC3x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y63efgEv");}
ccc::CC3x5y6 ::~CC3x5y6(){ note_dtor("_ZN3ccc7CC3x5y6E", this);} // tgen
ccc::CC3x5y6 ::CC3x5y6(){ note_ctor("_ZN3ccc7CC3x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y6E, buf);
    ::ccc::CC3x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y6E);
    dp->::ccc::CC3x5y6::~CC3x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y6E(Test__ZN3ccc7CC3x5y6E, "_ZN3ccc7CC3x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y6C1Ev();
extern void _ZN3ccc7CC3x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y6E[] = {
  NSPAIR(_ZN3ccc7CC3x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y6E[];
extern void _ZN3ccc7CC3x5y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y63efgEv,_ZThn4_N3ccc7CC3x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y63abcEv,_ZThn4_N3ccc7CC3x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y63efgEv,_ZThn4_N3ccc7CC3x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y63abcEv,_ZThn4_N3ccc7CC3x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y6E[];
Class_Descriptor cd__ZN3ccc7CC3x5y6E = {  "_ZN3ccc7CC3x5y6E", // class name
  bases__ZN3ccc7CC3x5y6E, 2,
  &(vtc__ZN3ccc7CC3x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y7  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC3x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y73pqrEv
  ~CC3x5y7(); // tgen
  CC3x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y7E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y73abcEv");}
void  ccc::CC3x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y73pqrEv");}
ccc::CC3x5y7 ::~CC3x5y7(){ note_dtor("_ZN3ccc7CC3x5y7E", this);} // tgen
ccc::CC3x5y7 ::CC3x5y7(){ note_ctor("_ZN3ccc7CC3x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y7E, buf);
    ::ccc::CC3x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y7E);
    dp->::ccc::CC3x5y7::~CC3x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y7E(Test__ZN3ccc7CC3x5y7E, "_ZN3ccc7CC3x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y7C1Ev();
extern void _ZN3ccc7CC3x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y7E[] = {
  NSPAIR(_ZN3ccc7CC3x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x5y73pqrEv();
extern void _ZN3ccc7CC3x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y73pqrEv,_ZThn4_N3ccc7CC3x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y73abcEv,_ZThn4_N3ccc7CC3x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y73pqrEv,_ZThn4_N3ccc7CC3x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y73abcEv,_ZThn4_N3ccc7CC3x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y7E[];
Class_Descriptor cd__ZN3ccc7CC3x5y7E = {  "_ZN3ccc7CC3x5y7E", // class name
  bases__ZN3ccc7CC3x5y7E, 2,
  &(vtc__ZN3ccc7CC3x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y8  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x5y83abcEv
  ~CC3x5y8(); // tgen
  CC3x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y8E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y83efgEv");}
void  ccc::CC3x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x5y83abcEv");}
ccc::CC3x5y8 ::~CC3x5y8(){ note_dtor("_ZN3ccc7CC3x5y8E", this);} // tgen
ccc::CC3x5y8 ::CC3x5y8(){ note_ctor("_ZN3ccc7CC3x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y8E, buf);
    ::ccc::CC3x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y8E);
    dp->::ccc::CC3x5y8::~CC3x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y8E(Test__ZN3ccc7CC3x5y8E, "_ZN3ccc7CC3x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y8C1Ev();
extern void _ZN3ccc7CC3x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y8E[] = {
  NSPAIR(_ZN3ccc7CC3x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y8E[];
extern void _ZN3ccc7CC3x5y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y83efgEv,_ZThn4_N3ccc7CC3x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y83abcEv,_ZThn4_N3ccc7CC3x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y83efgEv,_ZThn4_N3ccc7CC3x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y83abcEv,_ZThn4_N3ccc7CC3x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y8E[];
Class_Descriptor cd__ZN3ccc7CC3x5y8E = {  "_ZN3ccc7CC3x5y8E", // class name
  bases__ZN3ccc7CC3x5y8E, 2,
  &(vtc__ZN3ccc7CC3x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y9  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC3x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x5y93pqrEv
  ~CC3x5y9(); // tgen
  CC3x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x5y9E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x5y93efgEv");}
void  ccc::CC3x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x5y93pqrEv");}
ccc::CC3x5y9 ::~CC3x5y9(){ note_dtor("_ZN3ccc7CC3x5y9E", this);} // tgen
ccc::CC3x5y9 ::CC3x5y9(){ note_ctor("_ZN3ccc7CC3x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x5y9E, buf);
    ::ccc::CC3x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x5y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC3x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x5y9E);
    dp->::ccc::CC3x5y9::~CC3x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x5y9E(Test__ZN3ccc7CC3x5y9E, "_ZN3ccc7CC3x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x5y9C1Ev();
extern void _ZN3ccc7CC3x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x5y9E[] = {
  NSPAIR(_ZN3ccc7CC3x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC3x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y9E[];
extern void _ZN3ccc7CC3x5y93efgEv();
extern void _ZN3ccc7CC3x5y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y93pqrEv,_ZThn4_N3ccc7CC3x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x5y93efgEv,_ZThn4_N3ccc7CC3x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y93pqrEv,_ZThn4_N3ccc7CC3x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x5y93efgEv,_ZThn4_N3ccc7CC3x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x5y9E[];
Class_Descriptor cd__ZN3ccc7CC3x5y9E = {  "_ZN3ccc7CC3x5y9E", // class name
  bases__ZN3ccc7CC3x5y9E, 2,
  &(vtc__ZN3ccc7CC3x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y10  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x5y103abcEv
  ~CC3x5y10(); // tgen
  CC3x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y10E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y103pqrEv");}
void  ccc::CC3x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x5y103abcEv");}
ccc::CC3x5y10 ::~CC3x5y10(){ note_dtor("_ZN3ccc8CC3x5y10E", this);} // tgen
ccc::CC3x5y10 ::CC3x5y10(){ note_ctor("_ZN3ccc8CC3x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y10E, buf);
    ::ccc::CC3x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y10E);
    dp->::ccc::CC3x5y10::~CC3x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y10E(Test__ZN3ccc8CC3x5y10E, "_ZN3ccc8CC3x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y10C1Ev();
extern void _ZN3ccc8CC3x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y10E[] = {
  NSPAIR(_ZN3ccc8CC3x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x5y103pqrEv();
extern void _ZN3ccc8CC3x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y103pqrEv,_ZThn4_N3ccc8CC3x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y103abcEv,_ZThn4_N3ccc8CC3x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y103pqrEv,_ZThn4_N3ccc8CC3x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y103abcEv,_ZThn4_N3ccc8CC3x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y10E[];
Class_Descriptor cd__ZN3ccc8CC3x5y10E = {  "_ZN3ccc8CC3x5y10E", // class name
  bases__ZN3ccc8CC3x5y10E, 2,
  &(vtc__ZN3ccc8CC3x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y11  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x5y113efgEv
  ~CC3x5y11(); // tgen
  CC3x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y11E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y113pqrEv");}
void  ccc::CC3x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x5y113efgEv");}
ccc::CC3x5y11 ::~CC3x5y11(){ note_dtor("_ZN3ccc8CC3x5y11E", this);} // tgen
ccc::CC3x5y11 ::CC3x5y11(){ note_ctor("_ZN3ccc8CC3x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y11E, buf);
    ::ccc::CC3x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y11E);
    dp->::ccc::CC3x5y11::~CC3x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y11E(Test__ZN3ccc8CC3x5y11E, "_ZN3ccc8CC3x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y11C1Ev();
extern void _ZN3ccc8CC3x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y11E[] = {
  NSPAIR(_ZN3ccc8CC3x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y11E[];
extern void _ZN3ccc8CC3x5y113efgEv();
extern void _ZN3ccc8CC3x5y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y113pqrEv,_ZThn4_N3ccc8CC3x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y113efgEv,_ZThn4_N3ccc8CC3x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y113pqrEv,_ZThn4_N3ccc8CC3x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y113efgEv,_ZThn4_N3ccc8CC3x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y11E[];
Class_Descriptor cd__ZN3ccc8CC3x5y11E = {  "_ZN3ccc8CC3x5y11E", // class name
  bases__ZN3ccc8CC3x5y11E, 2,
  &(vtc__ZN3ccc8CC3x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y12  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC3x5y123abcEv
  ~CC3x5y12(); // tgen
  CC3x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC3x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x5y123abcEv");}
ccc::CC3x5y12 ::~CC3x5y12(){ note_dtor("_ZN3ccc8CC3x5y12E", this);} // tgen
ccc::CC3x5y12 ::CC3x5y12(){ note_ctor("_ZN3ccc8CC3x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y12E, buf);
    ::ccc::CC3x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y12E);
    dp->::ccc::CC3x5y12::~CC3x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y12E(Test__ZN3ccc8CC3x5y12E, "_ZN3ccc8CC3x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y12C1Ev();
extern void _ZN3ccc8CC3x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y12E[] = {
  NSPAIR(_ZN3ccc8CC3x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y123abcEv,_ZThn4_N3ccc8CC3x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y123abcEv,_ZThn4_N3ccc8CC3x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y12E[];
Class_Descriptor cd__ZN3ccc8CC3x5y12E = {  "_ZN3ccc8CC3x5y12E", // class name
  bases__ZN3ccc8CC3x5y12E, 2,
  &(vtc__ZN3ccc8CC3x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y13  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC3x5y133efgEv
  ~CC3x5y13(); // tgen
  CC3x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC3x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x5y133efgEv");}
ccc::CC3x5y13 ::~CC3x5y13(){ note_dtor("_ZN3ccc8CC3x5y13E", this);} // tgen
ccc::CC3x5y13 ::CC3x5y13(){ note_ctor("_ZN3ccc8CC3x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y13E, buf);
    ::ccc::CC3x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y13E);
    dp->::ccc::CC3x5y13::~CC3x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y13E(Test__ZN3ccc8CC3x5y13E, "_ZN3ccc8CC3x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y13C1Ev();
extern void _ZN3ccc8CC3x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y13E[] = {
  NSPAIR(_ZN3ccc8CC3x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y13E[];
extern void _ZN3ccc8CC3x5y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y133efgEv,_ZThn4_N3ccc8CC3x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y133efgEv,_ZThn4_N3ccc8CC3x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y13E[];
Class_Descriptor cd__ZN3ccc8CC3x5y13E = {  "_ZN3ccc8CC3x5y13E", // class name
  bases__ZN3ccc8CC3x5y13E, 2,
  &(vtc__ZN3ccc8CC3x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y14  : ::ccc::AA3 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC3x5y143pqrEv
  ~CC3x5y14(); // tgen
  CC3x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x5y143pqrEv");}
ccc::CC3x5y14 ::~CC3x5y14(){ note_dtor("_ZN3ccc8CC3x5y14E", this);} // tgen
ccc::CC3x5y14 ::CC3x5y14(){ note_ctor("_ZN3ccc8CC3x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y14E, buf);
    ::ccc::CC3x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y14E);
    dp->::ccc::CC3x5y14::~CC3x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y14E(Test__ZN3ccc8CC3x5y14E, "_ZN3ccc8CC3x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y14C1Ev();
extern void _ZN3ccc8CC3x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y14E[] = {
  NSPAIR(_ZN3ccc8CC3x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x5y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x5y143pqrEv,_ZThn4_N3ccc8CC3x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x5y143pqrEv,_ZThn4_N3ccc8CC3x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y14E[];
Class_Descriptor cd__ZN3ccc8CC3x5y14E = {  "_ZN3ccc8CC3x5y14E", // class name
  bases__ZN3ccc8CC3x5y14E, 2,
  &(vtc__ZN3ccc8CC3x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x5y15  : ::ccc::AA3 , ::ccc::BB5 {
  ~CC3x5y15(); // tgen
  CC3x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x5y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC3x5y15 ::~CC3x5y15(){ note_dtor("_ZN3ccc8CC3x5y15E", this);} // tgen
ccc::CC3x5y15 ::CC3x5y15(){ note_ctor("_ZN3ccc8CC3x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x5y15E, buf);
    ::ccc::CC3x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x5y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC3x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x5y15E);
    dp->::ccc::CC3x5y15::~CC3x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x5y15E(Test__ZN3ccc8CC3x5y15E, "_ZN3ccc8CC3x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x5y15C1Ev();
extern void _ZN3ccc8CC3x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x5y15E[] = {
  NSPAIR(_ZN3ccc8CC3x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC3x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x5y15E[];
Class_Descriptor cd__ZN3ccc8CC3x5y15E = {  "_ZN3ccc8CC3x5y15E", // class name
  bases__ZN3ccc8CC3x5y15E, 2,
  &(vtc__ZN3ccc8CC3x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y0  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y03pqrEv
  ~CC3x6y0(); // tgen
  CC3x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y0E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y03abcEv");}
void  ccc::CC3x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y03efgEv");}
void  ccc::CC3x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y03pqrEv");}
ccc::CC3x6y0 ::~CC3x6y0(){ note_dtor("_ZN3ccc7CC3x6y0E", this);} // tgen
ccc::CC3x6y0 ::CC3x6y0(){ note_ctor("_ZN3ccc7CC3x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y0E, buf);
    ::ccc::CC3x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y0E);
    dp->::ccc::CC3x6y0::~CC3x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y0E(Test__ZN3ccc7CC3x6y0E, "_ZN3ccc7CC3x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y0C1Ev();
extern void _ZN3ccc7CC3x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y0E[] = {
  NSPAIR(_ZN3ccc7CC3x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y0E[];
extern void _ZN3ccc7CC3x6y03efgEv();
extern void _ZN3ccc7CC3x6y03pqrEv();
extern void _ZN3ccc7CC3x6y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y03abcEv,_ZThn4_N3ccc7CC3x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y03efgEv,_ZThn4_N3ccc7CC3x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y03abcEv,_ZThn4_N3ccc7CC3x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y03efgEv,_ZThn4_N3ccc7CC3x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y0E[];
Class_Descriptor cd__ZN3ccc7CC3x6y0E = {  "_ZN3ccc7CC3x6y0E", // class name
  bases__ZN3ccc7CC3x6y0E, 2,
  &(vtc__ZN3ccc7CC3x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y1  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x6y13efgEv
  ~CC3x6y1(); // tgen
  CC3x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y1E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y13abcEv");}
void  ccc::CC3x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y13pqrEv");}
void  ccc::CC3x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y13efgEv");}
ccc::CC3x6y1 ::~CC3x6y1(){ note_dtor("_ZN3ccc7CC3x6y1E", this);} // tgen
ccc::CC3x6y1 ::CC3x6y1(){ note_ctor("_ZN3ccc7CC3x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y1E, buf);
    ::ccc::CC3x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y1E);
    dp->::ccc::CC3x6y1::~CC3x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y1E(Test__ZN3ccc7CC3x6y1E, "_ZN3ccc7CC3x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y1C1Ev();
extern void _ZN3ccc7CC3x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y1E[] = {
  NSPAIR(_ZN3ccc7CC3x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y1E[];
extern void _ZN3ccc7CC3x6y13efgEv();
extern void _ZN3ccc7CC3x6y13pqrEv();
extern void _ZN3ccc7CC3x6y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y13abcEv,_ZThn4_N3ccc7CC3x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y13efgEv,_ZThn4_N3ccc7CC3x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y13abcEv,_ZThn4_N3ccc7CC3x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y13efgEv,_ZThn4_N3ccc7CC3x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y1E[];
Class_Descriptor cd__ZN3ccc7CC3x6y1E = {  "_ZN3ccc7CC3x6y1E", // class name
  bases__ZN3ccc7CC3x6y1E, 2,
  &(vtc__ZN3ccc7CC3x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y2  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y23pqrEv
  ~CC3x6y2(); // tgen
  CC3x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y2E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y23efgEv");}
void  ccc::CC3x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y23abcEv");}
void  ccc::CC3x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y23pqrEv");}
ccc::CC3x6y2 ::~CC3x6y2(){ note_dtor("_ZN3ccc7CC3x6y2E", this);} // tgen
ccc::CC3x6y2 ::CC3x6y2(){ note_ctor("_ZN3ccc7CC3x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y2E, buf);
    ::ccc::CC3x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y2E);
    dp->::ccc::CC3x6y2::~CC3x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y2E(Test__ZN3ccc7CC3x6y2E, "_ZN3ccc7CC3x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y2C1Ev();
extern void _ZN3ccc7CC3x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y2E[] = {
  NSPAIR(_ZN3ccc7CC3x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y2E[];
extern void _ZN3ccc7CC3x6y23efgEv();
extern void _ZN3ccc7CC3x6y23pqrEv();
extern void _ZN3ccc7CC3x6y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y23abcEv,_ZThn4_N3ccc7CC3x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y23efgEv,_ZThn4_N3ccc7CC3x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y23abcEv,_ZThn4_N3ccc7CC3x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y23efgEv,_ZThn4_N3ccc7CC3x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y2E[];
Class_Descriptor cd__ZN3ccc7CC3x6y2E = {  "_ZN3ccc7CC3x6y2E", // class name
  bases__ZN3ccc7CC3x6y2E, 2,
  &(vtc__ZN3ccc7CC3x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y3  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x6y33abcEv
  ~CC3x6y3(); // tgen
  CC3x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y3E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y33efgEv");}
void  ccc::CC3x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y33pqrEv");}
void  ccc::CC3x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y33abcEv");}
ccc::CC3x6y3 ::~CC3x6y3(){ note_dtor("_ZN3ccc7CC3x6y3E", this);} // tgen
ccc::CC3x6y3 ::CC3x6y3(){ note_ctor("_ZN3ccc7CC3x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y3E, buf);
    ::ccc::CC3x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y3E);
    dp->::ccc::CC3x6y3::~CC3x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y3E(Test__ZN3ccc7CC3x6y3E, "_ZN3ccc7CC3x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y3C1Ev();
extern void _ZN3ccc7CC3x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y3E[] = {
  NSPAIR(_ZN3ccc7CC3x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y3E[];
extern void _ZN3ccc7CC3x6y33efgEv();
extern void _ZN3ccc7CC3x6y33pqrEv();
extern void _ZN3ccc7CC3x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y33abcEv,_ZThn4_N3ccc7CC3x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y33efgEv,_ZThn4_N3ccc7CC3x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y33abcEv,_ZThn4_N3ccc7CC3x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y33efgEv,_ZThn4_N3ccc7CC3x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y3E[];
Class_Descriptor cd__ZN3ccc7CC3x6y3E = {  "_ZN3ccc7CC3x6y3E", // class name
  bases__ZN3ccc7CC3x6y3E, 2,
  &(vtc__ZN3ccc7CC3x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y4  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC3x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y43efgEv
  ~CC3x6y4(); // tgen
  CC3x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y4E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y43pqrEv");}
void  ccc::CC3x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y43abcEv");}
void  ccc::CC3x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y43efgEv");}
ccc::CC3x6y4 ::~CC3x6y4(){ note_dtor("_ZN3ccc7CC3x6y4E", this);} // tgen
ccc::CC3x6y4 ::CC3x6y4(){ note_ctor("_ZN3ccc7CC3x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y4E, buf);
    ::ccc::CC3x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y4E);
    dp->::ccc::CC3x6y4::~CC3x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y4E(Test__ZN3ccc7CC3x6y4E, "_ZN3ccc7CC3x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y4C1Ev();
extern void _ZN3ccc7CC3x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y4E[] = {
  NSPAIR(_ZN3ccc7CC3x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y4E[];
extern void _ZN3ccc7CC3x6y43efgEv();
extern void _ZN3ccc7CC3x6y43pqrEv();
extern void _ZN3ccc7CC3x6y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y43abcEv,_ZThn4_N3ccc7CC3x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y43efgEv,_ZThn4_N3ccc7CC3x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y43abcEv,_ZThn4_N3ccc7CC3x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y43efgEv,_ZThn4_N3ccc7CC3x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y4E[];
Class_Descriptor cd__ZN3ccc7CC3x6y4E = {  "_ZN3ccc7CC3x6y4E", // class name
  bases__ZN3ccc7CC3x6y4E, 2,
  &(vtc__ZN3ccc7CC3x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y5  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC3x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y53abcEv
  ~CC3x6y5(); // tgen
  CC3x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y5E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y53pqrEv");}
void  ccc::CC3x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y53efgEv");}
void  ccc::CC3x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y53abcEv");}
ccc::CC3x6y5 ::~CC3x6y5(){ note_dtor("_ZN3ccc7CC3x6y5E", this);} // tgen
ccc::CC3x6y5 ::CC3x6y5(){ note_ctor("_ZN3ccc7CC3x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y5E, buf);
    ::ccc::CC3x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y5E);
    dp->::ccc::CC3x6y5::~CC3x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y5E(Test__ZN3ccc7CC3x6y5E, "_ZN3ccc7CC3x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y5C1Ev();
extern void _ZN3ccc7CC3x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y5E[] = {
  NSPAIR(_ZN3ccc7CC3x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y5E[];
extern void _ZN3ccc7CC3x6y53efgEv();
extern void _ZN3ccc7CC3x6y53pqrEv();
extern void _ZN3ccc7CC3x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y53abcEv,_ZThn4_N3ccc7CC3x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y53efgEv,_ZThn4_N3ccc7CC3x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y53abcEv,_ZThn4_N3ccc7CC3x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y53efgEv,_ZThn4_N3ccc7CC3x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y5E[];
Class_Descriptor cd__ZN3ccc7CC3x6y5E = {  "_ZN3ccc7CC3x6y5E", // class name
  bases__ZN3ccc7CC3x6y5E, 2,
  &(vtc__ZN3ccc7CC3x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y6  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x6y63efgEv
  ~CC3x6y6(); // tgen
  CC3x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y6E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y63abcEv");}
void  ccc::CC3x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y63efgEv");}
ccc::CC3x6y6 ::~CC3x6y6(){ note_dtor("_ZN3ccc7CC3x6y6E", this);} // tgen
ccc::CC3x6y6 ::CC3x6y6(){ note_ctor("_ZN3ccc7CC3x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y6E, buf);
    ::ccc::CC3x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y6E);
    dp->::ccc::CC3x6y6::~CC3x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y6E(Test__ZN3ccc7CC3x6y6E, "_ZN3ccc7CC3x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y6C1Ev();
extern void _ZN3ccc7CC3x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y6E[] = {
  NSPAIR(_ZN3ccc7CC3x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y6E[];
extern void _ZN3ccc7CC3x6y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y63abcEv,_ZThn4_N3ccc7CC3x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y63efgEv,_ZThn4_N3ccc7CC3x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y63abcEv,_ZThn4_N3ccc7CC3x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y63efgEv,_ZThn4_N3ccc7CC3x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y6E[];
Class_Descriptor cd__ZN3ccc7CC3x6y6E = {  "_ZN3ccc7CC3x6y6E", // class name
  bases__ZN3ccc7CC3x6y6E, 2,
  &(vtc__ZN3ccc7CC3x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y7  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC3x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y73pqrEv
  ~CC3x6y7(); // tgen
  CC3x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y7E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y73abcEv");}
void  ccc::CC3x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y73pqrEv");}
ccc::CC3x6y7 ::~CC3x6y7(){ note_dtor("_ZN3ccc7CC3x6y7E", this);} // tgen
ccc::CC3x6y7 ::CC3x6y7(){ note_ctor("_ZN3ccc7CC3x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y7E, buf);
    ::ccc::CC3x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y7E);
    dp->::ccc::CC3x6y7::~CC3x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y7E(Test__ZN3ccc7CC3x6y7E, "_ZN3ccc7CC3x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y7C1Ev();
extern void _ZN3ccc7CC3x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y7E[] = {
  NSPAIR(_ZN3ccc7CC3x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x6y73pqrEv();
extern void _ZN3ccc7CC3x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y73abcEv,_ZThn4_N3ccc7CC3x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y73abcEv,_ZThn4_N3ccc7CC3x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y7E[];
Class_Descriptor cd__ZN3ccc7CC3x6y7E = {  "_ZN3ccc7CC3x6y7E", // class name
  bases__ZN3ccc7CC3x6y7E, 2,
  &(vtc__ZN3ccc7CC3x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y8  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x6y83abcEv
  ~CC3x6y8(); // tgen
  CC3x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y8E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y83efgEv");}
void  ccc::CC3x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x6y83abcEv");}
ccc::CC3x6y8 ::~CC3x6y8(){ note_dtor("_ZN3ccc7CC3x6y8E", this);} // tgen
ccc::CC3x6y8 ::CC3x6y8(){ note_ctor("_ZN3ccc7CC3x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y8E, buf);
    ::ccc::CC3x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y8E);
    dp->::ccc::CC3x6y8::~CC3x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y8E(Test__ZN3ccc7CC3x6y8E, "_ZN3ccc7CC3x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y8C1Ev();
extern void _ZN3ccc7CC3x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y8E[] = {
  NSPAIR(_ZN3ccc7CC3x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y8E[];
extern void _ZN3ccc7CC3x6y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y83abcEv,_ZThn4_N3ccc7CC3x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y83efgEv,_ZThn4_N3ccc7CC3x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y83abcEv,_ZThn4_N3ccc7CC3x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y83efgEv,_ZThn4_N3ccc7CC3x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y8E[];
Class_Descriptor cd__ZN3ccc7CC3x6y8E = {  "_ZN3ccc7CC3x6y8E", // class name
  bases__ZN3ccc7CC3x6y8E, 2,
  &(vtc__ZN3ccc7CC3x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y9  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC3x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x6y93pqrEv
  ~CC3x6y9(); // tgen
  CC3x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x6y9E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x6y93efgEv");}
void  ccc::CC3x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x6y93pqrEv");}
ccc::CC3x6y9 ::~CC3x6y9(){ note_dtor("_ZN3ccc7CC3x6y9E", this);} // tgen
ccc::CC3x6y9 ::CC3x6y9(){ note_ctor("_ZN3ccc7CC3x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x6y9E, buf);
    ::ccc::CC3x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x6y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC3x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x6y9E);
    dp->::ccc::CC3x6y9::~CC3x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x6y9E(Test__ZN3ccc7CC3x6y9E, "_ZN3ccc7CC3x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x6y9C1Ev();
extern void _ZN3ccc7CC3x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x6y9E[] = {
  NSPAIR(_ZN3ccc7CC3x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC3x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y9E[];
extern void _ZN3ccc7CC3x6y93efgEv();
extern void _ZN3ccc7CC3x6y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x6y93efgEv,_ZThn4_N3ccc7CC3x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x6y93efgEv,_ZThn4_N3ccc7CC3x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x6y9E[];
Class_Descriptor cd__ZN3ccc7CC3x6y9E = {  "_ZN3ccc7CC3x6y9E", // class name
  bases__ZN3ccc7CC3x6y9E, 2,
  &(vtc__ZN3ccc7CC3x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y10  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x6y103abcEv
  ~CC3x6y10(); // tgen
  CC3x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y10E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y103pqrEv");}
void  ccc::CC3x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x6y103abcEv");}
ccc::CC3x6y10 ::~CC3x6y10(){ note_dtor("_ZN3ccc8CC3x6y10E", this);} // tgen
ccc::CC3x6y10 ::CC3x6y10(){ note_ctor("_ZN3ccc8CC3x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y10E, buf);
    ::ccc::CC3x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y10E);
    dp->::ccc::CC3x6y10::~CC3x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y10E(Test__ZN3ccc8CC3x6y10E, "_ZN3ccc8CC3x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y10C1Ev();
extern void _ZN3ccc8CC3x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y10E[] = {
  NSPAIR(_ZN3ccc8CC3x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x6y103pqrEv();
extern void _ZN3ccc8CC3x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y103abcEv,_ZThn4_N3ccc8CC3x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x6y103abcEv,_ZThn4_N3ccc8CC3x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y10E[];
Class_Descriptor cd__ZN3ccc8CC3x6y10E = {  "_ZN3ccc8CC3x6y10E", // class name
  bases__ZN3ccc8CC3x6y10E, 2,
  &(vtc__ZN3ccc8CC3x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y11  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x6y113efgEv
  ~CC3x6y11(); // tgen
  CC3x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y11E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y113pqrEv");}
void  ccc::CC3x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x6y113efgEv");}
ccc::CC3x6y11 ::~CC3x6y11(){ note_dtor("_ZN3ccc8CC3x6y11E", this);} // tgen
ccc::CC3x6y11 ::CC3x6y11(){ note_ctor("_ZN3ccc8CC3x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y11E, buf);
    ::ccc::CC3x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y11E);
    dp->::ccc::CC3x6y11::~CC3x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y11E(Test__ZN3ccc8CC3x6y11E, "_ZN3ccc8CC3x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y11C1Ev();
extern void _ZN3ccc8CC3x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y11E[] = {
  NSPAIR(_ZN3ccc8CC3x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y11E[];
extern void _ZN3ccc8CC3x6y113efgEv();
extern void _ZN3ccc8CC3x6y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y113efgEv,_ZThn4_N3ccc8CC3x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x6y113efgEv,_ZThn4_N3ccc8CC3x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y11E[];
Class_Descriptor cd__ZN3ccc8CC3x6y11E = {  "_ZN3ccc8CC3x6y11E", // class name
  bases__ZN3ccc8CC3x6y11E, 2,
  &(vtc__ZN3ccc8CC3x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y12  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC3x6y123abcEv
  ~CC3x6y12(); // tgen
  CC3x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x6y123abcEv");}
ccc::CC3x6y12 ::~CC3x6y12(){ note_dtor("_ZN3ccc8CC3x6y12E", this);} // tgen
ccc::CC3x6y12 ::CC3x6y12(){ note_ctor("_ZN3ccc8CC3x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y12E, buf);
    ::ccc::CC3x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y12E);
    dp->::ccc::CC3x6y12::~CC3x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y12E(Test__ZN3ccc8CC3x6y12E, "_ZN3ccc8CC3x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y12C1Ev();
extern void _ZN3ccc8CC3x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y12E[] = {
  NSPAIR(_ZN3ccc8CC3x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y123abcEv,_ZThn4_N3ccc8CC3x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x6y123abcEv,_ZThn4_N3ccc8CC3x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y12E[];
Class_Descriptor cd__ZN3ccc8CC3x6y12E = {  "_ZN3ccc8CC3x6y12E", // class name
  bases__ZN3ccc8CC3x6y12E, 2,
  &(vtc__ZN3ccc8CC3x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y13  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC3x6y133efgEv
  ~CC3x6y13(); // tgen
  CC3x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x6y133efgEv");}
ccc::CC3x6y13 ::~CC3x6y13(){ note_dtor("_ZN3ccc8CC3x6y13E", this);} // tgen
ccc::CC3x6y13 ::CC3x6y13(){ note_ctor("_ZN3ccc8CC3x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y13E, buf);
    ::ccc::CC3x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y13E);
    dp->::ccc::CC3x6y13::~CC3x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y13E(Test__ZN3ccc8CC3x6y13E, "_ZN3ccc8CC3x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y13C1Ev();
extern void _ZN3ccc8CC3x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y13E[] = {
  NSPAIR(_ZN3ccc8CC3x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y13E[];
extern void _ZN3ccc8CC3x6y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x6y133efgEv,_ZThn4_N3ccc8CC3x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x6y133efgEv,_ZThn4_N3ccc8CC3x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y13E[];
Class_Descriptor cd__ZN3ccc8CC3x6y13E = {  "_ZN3ccc8CC3x6y13E", // class name
  bases__ZN3ccc8CC3x6y13E, 2,
  &(vtc__ZN3ccc8CC3x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y14  : ::ccc::AA3 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC3x6y143pqrEv
  ~CC3x6y14(); // tgen
  CC3x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x6y143pqrEv");}
ccc::CC3x6y14 ::~CC3x6y14(){ note_dtor("_ZN3ccc8CC3x6y14E", this);} // tgen
ccc::CC3x6y14 ::CC3x6y14(){ note_ctor("_ZN3ccc8CC3x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y14E, buf);
    ::ccc::CC3x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y14E);
    dp->::ccc::CC3x6y14::~CC3x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y14E(Test__ZN3ccc8CC3x6y14E, "_ZN3ccc8CC3x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y14C1Ev();
extern void _ZN3ccc8CC3x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y14E[] = {
  NSPAIR(_ZN3ccc8CC3x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x6y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y14E[];
Class_Descriptor cd__ZN3ccc8CC3x6y14E = {  "_ZN3ccc8CC3x6y14E", // class name
  bases__ZN3ccc8CC3x6y14E, 2,
  &(vtc__ZN3ccc8CC3x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x6y15  : ::ccc::AA3 , ::ccc::BB6 {
  ~CC3x6y15(); // tgen
  CC3x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x6y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x6y15 ::~CC3x6y15(){ note_dtor("_ZN3ccc8CC3x6y15E", this);} // tgen
ccc::CC3x6y15 ::CC3x6y15(){ note_ctor("_ZN3ccc8CC3x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x6y15E, buf);
    ::ccc::CC3x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x6y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC3x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x6y15E);
    dp->::ccc::CC3x6y15::~CC3x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x6y15E(Test__ZN3ccc8CC3x6y15E, "_ZN3ccc8CC3x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x6y15C1Ev();
extern void _ZN3ccc8CC3x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x6y15E[] = {
  NSPAIR(_ZN3ccc8CC3x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC3x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x6y15E[];
Class_Descriptor cd__ZN3ccc8CC3x6y15E = {  "_ZN3ccc8CC3x6y15E", // class name
  bases__ZN3ccc8CC3x6y15E, 2,
  &(vtc__ZN3ccc8CC3x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y0  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y03pqrEv
  ~CC3x7y0(); // tgen
  CC3x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y0E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y03abcEv");}
void  ccc::CC3x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y03efgEv");}
void  ccc::CC3x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y03pqrEv");}
ccc::CC3x7y0 ::~CC3x7y0(){ note_dtor("_ZN3ccc7CC3x7y0E", this);} // tgen
ccc::CC3x7y0 ::CC3x7y0(){ note_ctor("_ZN3ccc7CC3x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y0E, buf);
    ::ccc::CC3x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y0E);
    dp->::ccc::CC3x7y0::~CC3x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y0E(Test__ZN3ccc7CC3x7y0E, "_ZN3ccc7CC3x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y0C1Ev();
extern void _ZN3ccc7CC3x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y0E[] = {
  NSPAIR(_ZN3ccc7CC3x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y0E[];
extern void _ZN3ccc7CC3x7y03efgEv();
extern void _ZN3ccc7CC3x7y03pqrEv();
extern void _ZN3ccc7CC3x7y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y03abcEv,_ZThn4_N3ccc7CC3x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y03pqrEv,_ZThn4_N3ccc7CC3x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y03abcEv,_ZThn4_N3ccc7CC3x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y03pqrEv,_ZThn4_N3ccc7CC3x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y0E[];
Class_Descriptor cd__ZN3ccc7CC3x7y0E = {  "_ZN3ccc7CC3x7y0E", // class name
  bases__ZN3ccc7CC3x7y0E, 2,
  &(vtc__ZN3ccc7CC3x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y1  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x7y13efgEv
  ~CC3x7y1(); // tgen
  CC3x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y1E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y13abcEv");}
void  ccc::CC3x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y13pqrEv");}
void  ccc::CC3x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y13efgEv");}
ccc::CC3x7y1 ::~CC3x7y1(){ note_dtor("_ZN3ccc7CC3x7y1E", this);} // tgen
ccc::CC3x7y1 ::CC3x7y1(){ note_ctor("_ZN3ccc7CC3x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y1E, buf);
    ::ccc::CC3x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y1E);
    dp->::ccc::CC3x7y1::~CC3x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y1E(Test__ZN3ccc7CC3x7y1E, "_ZN3ccc7CC3x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y1C1Ev();
extern void _ZN3ccc7CC3x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y1E[] = {
  NSPAIR(_ZN3ccc7CC3x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y1E[];
extern void _ZN3ccc7CC3x7y13efgEv();
extern void _ZN3ccc7CC3x7y13pqrEv();
extern void _ZN3ccc7CC3x7y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y13abcEv,_ZThn4_N3ccc7CC3x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y13pqrEv,_ZThn4_N3ccc7CC3x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y13abcEv,_ZThn4_N3ccc7CC3x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y13pqrEv,_ZThn4_N3ccc7CC3x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y1E[];
Class_Descriptor cd__ZN3ccc7CC3x7y1E = {  "_ZN3ccc7CC3x7y1E", // class name
  bases__ZN3ccc7CC3x7y1E, 2,
  &(vtc__ZN3ccc7CC3x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y2  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y23pqrEv
  ~CC3x7y2(); // tgen
  CC3x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y2E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y23efgEv");}
void  ccc::CC3x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y23abcEv");}
void  ccc::CC3x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y23pqrEv");}
ccc::CC3x7y2 ::~CC3x7y2(){ note_dtor("_ZN3ccc7CC3x7y2E", this);} // tgen
ccc::CC3x7y2 ::CC3x7y2(){ note_ctor("_ZN3ccc7CC3x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y2E, buf);
    ::ccc::CC3x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y2E);
    dp->::ccc::CC3x7y2::~CC3x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y2E(Test__ZN3ccc7CC3x7y2E, "_ZN3ccc7CC3x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y2C1Ev();
extern void _ZN3ccc7CC3x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y2E[] = {
  NSPAIR(_ZN3ccc7CC3x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y2E[];
extern void _ZN3ccc7CC3x7y23efgEv();
extern void _ZN3ccc7CC3x7y23pqrEv();
extern void _ZN3ccc7CC3x7y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y23abcEv,_ZThn4_N3ccc7CC3x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y23pqrEv,_ZThn4_N3ccc7CC3x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y23abcEv,_ZThn4_N3ccc7CC3x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y23pqrEv,_ZThn4_N3ccc7CC3x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y2E[];
Class_Descriptor cd__ZN3ccc7CC3x7y2E = {  "_ZN3ccc7CC3x7y2E", // class name
  bases__ZN3ccc7CC3x7y2E, 2,
  &(vtc__ZN3ccc7CC3x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y3  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x7y33abcEv
  ~CC3x7y3(); // tgen
  CC3x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y3E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y33efgEv");}
void  ccc::CC3x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y33pqrEv");}
void  ccc::CC3x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y33abcEv");}
ccc::CC3x7y3 ::~CC3x7y3(){ note_dtor("_ZN3ccc7CC3x7y3E", this);} // tgen
ccc::CC3x7y3 ::CC3x7y3(){ note_ctor("_ZN3ccc7CC3x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y3E, buf);
    ::ccc::CC3x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y3E);
    dp->::ccc::CC3x7y3::~CC3x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y3E(Test__ZN3ccc7CC3x7y3E, "_ZN3ccc7CC3x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y3C1Ev();
extern void _ZN3ccc7CC3x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y3E[] = {
  NSPAIR(_ZN3ccc7CC3x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y3E[];
extern void _ZN3ccc7CC3x7y33efgEv();
extern void _ZN3ccc7CC3x7y33pqrEv();
extern void _ZN3ccc7CC3x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y33abcEv,_ZThn4_N3ccc7CC3x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y33pqrEv,_ZThn4_N3ccc7CC3x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y33abcEv,_ZThn4_N3ccc7CC3x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y33pqrEv,_ZThn4_N3ccc7CC3x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y3E[];
Class_Descriptor cd__ZN3ccc7CC3x7y3E = {  "_ZN3ccc7CC3x7y3E", // class name
  bases__ZN3ccc7CC3x7y3E, 2,
  &(vtc__ZN3ccc7CC3x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y4  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC3x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y43efgEv
  ~CC3x7y4(); // tgen
  CC3x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y4E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y43pqrEv");}
void  ccc::CC3x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y43abcEv");}
void  ccc::CC3x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y43efgEv");}
ccc::CC3x7y4 ::~CC3x7y4(){ note_dtor("_ZN3ccc7CC3x7y4E", this);} // tgen
ccc::CC3x7y4 ::CC3x7y4(){ note_ctor("_ZN3ccc7CC3x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y4E, buf);
    ::ccc::CC3x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y4E);
    dp->::ccc::CC3x7y4::~CC3x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y4E(Test__ZN3ccc7CC3x7y4E, "_ZN3ccc7CC3x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y4C1Ev();
extern void _ZN3ccc7CC3x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y4E[] = {
  NSPAIR(_ZN3ccc7CC3x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y4E[];
extern void _ZN3ccc7CC3x7y43efgEv();
extern void _ZN3ccc7CC3x7y43pqrEv();
extern void _ZN3ccc7CC3x7y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y43abcEv,_ZThn4_N3ccc7CC3x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y43pqrEv,_ZThn4_N3ccc7CC3x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y43abcEv,_ZThn4_N3ccc7CC3x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y43pqrEv,_ZThn4_N3ccc7CC3x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y4E[];
Class_Descriptor cd__ZN3ccc7CC3x7y4E = {  "_ZN3ccc7CC3x7y4E", // class name
  bases__ZN3ccc7CC3x7y4E, 2,
  &(vtc__ZN3ccc7CC3x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y5  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC3x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y53abcEv
  ~CC3x7y5(); // tgen
  CC3x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y5E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y53pqrEv");}
void  ccc::CC3x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y53efgEv");}
void  ccc::CC3x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y53abcEv");}
ccc::CC3x7y5 ::~CC3x7y5(){ note_dtor("_ZN3ccc7CC3x7y5E", this);} // tgen
ccc::CC3x7y5 ::CC3x7y5(){ note_ctor("_ZN3ccc7CC3x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y5E, buf);
    ::ccc::CC3x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y5E);
    dp->::ccc::CC3x7y5::~CC3x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y5E(Test__ZN3ccc7CC3x7y5E, "_ZN3ccc7CC3x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y5C1Ev();
extern void _ZN3ccc7CC3x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y5E[] = {
  NSPAIR(_ZN3ccc7CC3x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y5E[];
extern void _ZN3ccc7CC3x7y53efgEv();
extern void _ZN3ccc7CC3x7y53pqrEv();
extern void _ZN3ccc7CC3x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y53abcEv,_ZThn4_N3ccc7CC3x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y53pqrEv,_ZThn4_N3ccc7CC3x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y53abcEv,_ZThn4_N3ccc7CC3x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y53pqrEv,_ZThn4_N3ccc7CC3x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y5E[];
Class_Descriptor cd__ZN3ccc7CC3x7y5E = {  "_ZN3ccc7CC3x7y5E", // class name
  bases__ZN3ccc7CC3x7y5E, 2,
  &(vtc__ZN3ccc7CC3x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y6  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x7y63efgEv
  ~CC3x7y6(); // tgen
  CC3x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y6E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y63abcEv");}
void  ccc::CC3x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y63efgEv");}
ccc::CC3x7y6 ::~CC3x7y6(){ note_dtor("_ZN3ccc7CC3x7y6E", this);} // tgen
ccc::CC3x7y6 ::CC3x7y6(){ note_ctor("_ZN3ccc7CC3x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y6E, buf);
    ::ccc::CC3x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y6E);
    dp->::ccc::CC3x7y6::~CC3x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y6E(Test__ZN3ccc7CC3x7y6E, "_ZN3ccc7CC3x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y6C1Ev();
extern void _ZN3ccc7CC3x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y6E[] = {
  NSPAIR(_ZN3ccc7CC3x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y6E[];
extern void _ZN3ccc7CC3x7y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y63abcEv,_ZThn4_N3ccc7CC3x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y63abcEv,_ZThn4_N3ccc7CC3x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y6E[];
Class_Descriptor cd__ZN3ccc7CC3x7y6E = {  "_ZN3ccc7CC3x7y6E", // class name
  bases__ZN3ccc7CC3x7y6E, 2,
  &(vtc__ZN3ccc7CC3x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y7  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC3x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y73pqrEv
  ~CC3x7y7(); // tgen
  CC3x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y7E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y73abcEv");}
void  ccc::CC3x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y73pqrEv");}
ccc::CC3x7y7 ::~CC3x7y7(){ note_dtor("_ZN3ccc7CC3x7y7E", this);} // tgen
ccc::CC3x7y7 ::CC3x7y7(){ note_ctor("_ZN3ccc7CC3x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y7E, buf);
    ::ccc::CC3x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y7E);
    dp->::ccc::CC3x7y7::~CC3x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y7E(Test__ZN3ccc7CC3x7y7E, "_ZN3ccc7CC3x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y7C1Ev();
extern void _ZN3ccc7CC3x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y7E[] = {
  NSPAIR(_ZN3ccc7CC3x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x7y73pqrEv();
extern void _ZN3ccc7CC3x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y73abcEv,_ZThn4_N3ccc7CC3x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y73pqrEv,_ZThn4_N3ccc7CC3x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y73abcEv,_ZThn4_N3ccc7CC3x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y73pqrEv,_ZThn4_N3ccc7CC3x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y7E[];
Class_Descriptor cd__ZN3ccc7CC3x7y7E = {  "_ZN3ccc7CC3x7y7E", // class name
  bases__ZN3ccc7CC3x7y7E, 2,
  &(vtc__ZN3ccc7CC3x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y8  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x7y83abcEv
  ~CC3x7y8(); // tgen
  CC3x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y8E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y83efgEv");}
void  ccc::CC3x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x7y83abcEv");}
ccc::CC3x7y8 ::~CC3x7y8(){ note_dtor("_ZN3ccc7CC3x7y8E", this);} // tgen
ccc::CC3x7y8 ::CC3x7y8(){ note_ctor("_ZN3ccc7CC3x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y8E, buf);
    ::ccc::CC3x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y8E);
    dp->::ccc::CC3x7y8::~CC3x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y8E(Test__ZN3ccc7CC3x7y8E, "_ZN3ccc7CC3x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y8C1Ev();
extern void _ZN3ccc7CC3x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y8E[] = {
  NSPAIR(_ZN3ccc7CC3x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y8E[];
extern void _ZN3ccc7CC3x7y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y83abcEv,_ZThn4_N3ccc7CC3x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y83abcEv,_ZThn4_N3ccc7CC3x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y8E[];
Class_Descriptor cd__ZN3ccc7CC3x7y8E = {  "_ZN3ccc7CC3x7y8E", // class name
  bases__ZN3ccc7CC3x7y8E, 2,
  &(vtc__ZN3ccc7CC3x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y9  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC3x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x7y93pqrEv
  ~CC3x7y9(); // tgen
  CC3x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x7y9E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x7y93efgEv");}
void  ccc::CC3x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x7y93pqrEv");}
ccc::CC3x7y9 ::~CC3x7y9(){ note_dtor("_ZN3ccc7CC3x7y9E", this);} // tgen
ccc::CC3x7y9 ::CC3x7y9(){ note_ctor("_ZN3ccc7CC3x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x7y9E, buf);
    ::ccc::CC3x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x7y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC3x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x7y9E);
    dp->::ccc::CC3x7y9::~CC3x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x7y9E(Test__ZN3ccc7CC3x7y9E, "_ZN3ccc7CC3x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x7y9C1Ev();
extern void _ZN3ccc7CC3x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x7y9E[] = {
  NSPAIR(_ZN3ccc7CC3x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC3x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y9E[];
extern void _ZN3ccc7CC3x7y93efgEv();
extern void _ZN3ccc7CC3x7y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x7y93pqrEv,_ZThn4_N3ccc7CC3x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x7y93pqrEv,_ZThn4_N3ccc7CC3x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x7y9E[];
Class_Descriptor cd__ZN3ccc7CC3x7y9E = {  "_ZN3ccc7CC3x7y9E", // class name
  bases__ZN3ccc7CC3x7y9E, 2,
  &(vtc__ZN3ccc7CC3x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y10  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x7y103abcEv
  ~CC3x7y10(); // tgen
  CC3x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y10E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y103pqrEv");}
void  ccc::CC3x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x7y103abcEv");}
ccc::CC3x7y10 ::~CC3x7y10(){ note_dtor("_ZN3ccc8CC3x7y10E", this);} // tgen
ccc::CC3x7y10 ::CC3x7y10(){ note_ctor("_ZN3ccc8CC3x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y10E, buf);
    ::ccc::CC3x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y10E);
    dp->::ccc::CC3x7y10::~CC3x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y10E(Test__ZN3ccc8CC3x7y10E, "_ZN3ccc8CC3x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y10C1Ev();
extern void _ZN3ccc8CC3x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y10E[] = {
  NSPAIR(_ZN3ccc8CC3x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x7y103pqrEv();
extern void _ZN3ccc8CC3x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y103abcEv,_ZThn4_N3ccc8CC3x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y103pqrEv,_ZThn4_N3ccc8CC3x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x7y103abcEv,_ZThn4_N3ccc8CC3x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x7y103pqrEv,_ZThn4_N3ccc8CC3x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y10E[];
Class_Descriptor cd__ZN3ccc8CC3x7y10E = {  "_ZN3ccc8CC3x7y10E", // class name
  bases__ZN3ccc8CC3x7y10E, 2,
  &(vtc__ZN3ccc8CC3x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y11  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x7y113efgEv
  ~CC3x7y11(); // tgen
  CC3x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y11E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y113pqrEv");}
void  ccc::CC3x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x7y113efgEv");}
ccc::CC3x7y11 ::~CC3x7y11(){ note_dtor("_ZN3ccc8CC3x7y11E", this);} // tgen
ccc::CC3x7y11 ::CC3x7y11(){ note_ctor("_ZN3ccc8CC3x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y11E, buf);
    ::ccc::CC3x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y11E);
    dp->::ccc::CC3x7y11::~CC3x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y11E(Test__ZN3ccc8CC3x7y11E, "_ZN3ccc8CC3x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y11C1Ev();
extern void _ZN3ccc8CC3x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y11E[] = {
  NSPAIR(_ZN3ccc8CC3x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y11E[];
extern void _ZN3ccc8CC3x7y113efgEv();
extern void _ZN3ccc8CC3x7y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y113pqrEv,_ZThn4_N3ccc8CC3x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x7y113pqrEv,_ZThn4_N3ccc8CC3x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y11E[];
Class_Descriptor cd__ZN3ccc8CC3x7y11E = {  "_ZN3ccc8CC3x7y11E", // class name
  bases__ZN3ccc8CC3x7y11E, 2,
  &(vtc__ZN3ccc8CC3x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y12  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC3x7y123abcEv
  ~CC3x7y12(); // tgen
  CC3x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x7y123abcEv");}
ccc::CC3x7y12 ::~CC3x7y12(){ note_dtor("_ZN3ccc8CC3x7y12E", this);} // tgen
ccc::CC3x7y12 ::CC3x7y12(){ note_ctor("_ZN3ccc8CC3x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y12E, buf);
    ::ccc::CC3x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y12E);
    dp->::ccc::CC3x7y12::~CC3x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y12E(Test__ZN3ccc8CC3x7y12E, "_ZN3ccc8CC3x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y12C1Ev();
extern void _ZN3ccc8CC3x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y12E[] = {
  NSPAIR(_ZN3ccc8CC3x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y123abcEv,_ZThn4_N3ccc8CC3x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x7y123abcEv,_ZThn4_N3ccc8CC3x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y12E[];
Class_Descriptor cd__ZN3ccc8CC3x7y12E = {  "_ZN3ccc8CC3x7y12E", // class name
  bases__ZN3ccc8CC3x7y12E, 2,
  &(vtc__ZN3ccc8CC3x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y13  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC3x7y133efgEv
  ~CC3x7y13(); // tgen
  CC3x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x7y133efgEv");}
ccc::CC3x7y13 ::~CC3x7y13(){ note_dtor("_ZN3ccc8CC3x7y13E", this);} // tgen
ccc::CC3x7y13 ::CC3x7y13(){ note_ctor("_ZN3ccc8CC3x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y13E, buf);
    ::ccc::CC3x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y13E);
    dp->::ccc::CC3x7y13::~CC3x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y13E(Test__ZN3ccc8CC3x7y13E, "_ZN3ccc8CC3x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y13C1Ev();
extern void _ZN3ccc8CC3x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y13E[] = {
  NSPAIR(_ZN3ccc8CC3x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y13E[];
extern void _ZN3ccc8CC3x7y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y13E[];
Class_Descriptor cd__ZN3ccc8CC3x7y13E = {  "_ZN3ccc8CC3x7y13E", // class name
  bases__ZN3ccc8CC3x7y13E, 2,
  &(vtc__ZN3ccc8CC3x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y14  : ::ccc::AA3 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC3x7y143pqrEv
  ~CC3x7y14(); // tgen
  CC3x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x7y143pqrEv");}
ccc::CC3x7y14 ::~CC3x7y14(){ note_dtor("_ZN3ccc8CC3x7y14E", this);} // tgen
ccc::CC3x7y14 ::CC3x7y14(){ note_ctor("_ZN3ccc8CC3x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y14E, buf);
    ::ccc::CC3x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y14E);
    dp->::ccc::CC3x7y14::~CC3x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y14E(Test__ZN3ccc8CC3x7y14E, "_ZN3ccc8CC3x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y14C1Ev();
extern void _ZN3ccc8CC3x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y14E[] = {
  NSPAIR(_ZN3ccc8CC3x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x7y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x7y143pqrEv,_ZThn4_N3ccc8CC3x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x7y143pqrEv,_ZThn4_N3ccc8CC3x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y14E[];
Class_Descriptor cd__ZN3ccc8CC3x7y14E = {  "_ZN3ccc8CC3x7y14E", // class name
  bases__ZN3ccc8CC3x7y14E, 2,
  &(vtc__ZN3ccc8CC3x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x7y15  : ::ccc::AA3 , ::ccc::BB7 {
  ~CC3x7y15(); // tgen
  CC3x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x7y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x7y15 ::~CC3x7y15(){ note_dtor("_ZN3ccc8CC3x7y15E", this);} // tgen
ccc::CC3x7y15 ::CC3x7y15(){ note_ctor("_ZN3ccc8CC3x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x7y15E, buf);
    ::ccc::CC3x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x7y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC3x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x7y15E);
    dp->::ccc::CC3x7y15::~CC3x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x7y15E(Test__ZN3ccc8CC3x7y15E, "_ZN3ccc8CC3x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x7y15C1Ev();
extern void _ZN3ccc8CC3x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x7y15E[] = {
  NSPAIR(_ZN3ccc8CC3x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC3x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x7y15E[];
Class_Descriptor cd__ZN3ccc8CC3x7y15E = {  "_ZN3ccc8CC3x7y15E", // class name
  bases__ZN3ccc8CC3x7y15E, 2,
  &(vtc__ZN3ccc8CC3x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y0  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y03pqrEv
  ~CC3x8y0(); // tgen
  CC3x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y0E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y03abcEv");}
void  ccc::CC3x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y03efgEv");}
void  ccc::CC3x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y03pqrEv");}
ccc::CC3x8y0 ::~CC3x8y0(){ note_dtor("_ZN3ccc7CC3x8y0E", this);} // tgen
ccc::CC3x8y0 ::CC3x8y0(){ note_ctor("_ZN3ccc7CC3x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y0E, buf);
    ::ccc::CC3x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y0E);
    dp->::ccc::CC3x8y0::~CC3x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y0E(Test__ZN3ccc7CC3x8y0E, "_ZN3ccc7CC3x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y0C1Ev();
extern void _ZN3ccc7CC3x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y0E[] = {
  NSPAIR(_ZN3ccc7CC3x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y0E[];
extern void _ZN3ccc7CC3x8y03efgEv();
extern void _ZN3ccc7CC3x8y03pqrEv();
extern void _ZN3ccc7CC3x8y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y03efgEv,_ZThn4_N3ccc7CC3x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y03abcEv,_ZThn4_N3ccc7CC3x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y03efgEv,_ZThn4_N3ccc7CC3x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y03abcEv,_ZThn4_N3ccc7CC3x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y0E[];
Class_Descriptor cd__ZN3ccc7CC3x8y0E = {  "_ZN3ccc7CC3x8y0E", // class name
  bases__ZN3ccc7CC3x8y0E, 2,
  &(vtc__ZN3ccc7CC3x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y1  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x8y13efgEv
  ~CC3x8y1(); // tgen
  CC3x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y1E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y13abcEv");}
void  ccc::CC3x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y13pqrEv");}
void  ccc::CC3x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y13efgEv");}
ccc::CC3x8y1 ::~CC3x8y1(){ note_dtor("_ZN3ccc7CC3x8y1E", this);} // tgen
ccc::CC3x8y1 ::CC3x8y1(){ note_ctor("_ZN3ccc7CC3x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y1E, buf);
    ::ccc::CC3x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y1E);
    dp->::ccc::CC3x8y1::~CC3x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y1E(Test__ZN3ccc7CC3x8y1E, "_ZN3ccc7CC3x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y1C1Ev();
extern void _ZN3ccc7CC3x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y1E[] = {
  NSPAIR(_ZN3ccc7CC3x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y1E[];
extern void _ZN3ccc7CC3x8y13efgEv();
extern void _ZN3ccc7CC3x8y13pqrEv();
extern void _ZN3ccc7CC3x8y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y13efgEv,_ZThn4_N3ccc7CC3x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y13abcEv,_ZThn4_N3ccc7CC3x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y13efgEv,_ZThn4_N3ccc7CC3x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y13abcEv,_ZThn4_N3ccc7CC3x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y1E[];
Class_Descriptor cd__ZN3ccc7CC3x8y1E = {  "_ZN3ccc7CC3x8y1E", // class name
  bases__ZN3ccc7CC3x8y1E, 2,
  &(vtc__ZN3ccc7CC3x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y2  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y23pqrEv
  ~CC3x8y2(); // tgen
  CC3x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y2E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y23efgEv");}
void  ccc::CC3x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y23abcEv");}
void  ccc::CC3x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y23pqrEv");}
ccc::CC3x8y2 ::~CC3x8y2(){ note_dtor("_ZN3ccc7CC3x8y2E", this);} // tgen
ccc::CC3x8y2 ::CC3x8y2(){ note_ctor("_ZN3ccc7CC3x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y2E, buf);
    ::ccc::CC3x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y2E);
    dp->::ccc::CC3x8y2::~CC3x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y2E(Test__ZN3ccc7CC3x8y2E, "_ZN3ccc7CC3x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y2C1Ev();
extern void _ZN3ccc7CC3x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y2E[] = {
  NSPAIR(_ZN3ccc7CC3x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y2E[];
extern void _ZN3ccc7CC3x8y23efgEv();
extern void _ZN3ccc7CC3x8y23pqrEv();
extern void _ZN3ccc7CC3x8y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y23efgEv,_ZThn4_N3ccc7CC3x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y23abcEv,_ZThn4_N3ccc7CC3x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y23efgEv,_ZThn4_N3ccc7CC3x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y23abcEv,_ZThn4_N3ccc7CC3x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y2E[];
Class_Descriptor cd__ZN3ccc7CC3x8y2E = {  "_ZN3ccc7CC3x8y2E", // class name
  bases__ZN3ccc7CC3x8y2E, 2,
  &(vtc__ZN3ccc7CC3x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y3  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x8y33abcEv
  ~CC3x8y3(); // tgen
  CC3x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y3E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y33efgEv");}
void  ccc::CC3x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y33pqrEv");}
void  ccc::CC3x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y33abcEv");}
ccc::CC3x8y3 ::~CC3x8y3(){ note_dtor("_ZN3ccc7CC3x8y3E", this);} // tgen
ccc::CC3x8y3 ::CC3x8y3(){ note_ctor("_ZN3ccc7CC3x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y3E, buf);
    ::ccc::CC3x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y3E);
    dp->::ccc::CC3x8y3::~CC3x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y3E(Test__ZN3ccc7CC3x8y3E, "_ZN3ccc7CC3x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y3C1Ev();
extern void _ZN3ccc7CC3x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y3E[] = {
  NSPAIR(_ZN3ccc7CC3x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y3E[];
extern void _ZN3ccc7CC3x8y33efgEv();
extern void _ZN3ccc7CC3x8y33pqrEv();
extern void _ZN3ccc7CC3x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y33efgEv,_ZThn4_N3ccc7CC3x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y33abcEv,_ZThn4_N3ccc7CC3x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y33efgEv,_ZThn4_N3ccc7CC3x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y33abcEv,_ZThn4_N3ccc7CC3x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y3E[];
Class_Descriptor cd__ZN3ccc7CC3x8y3E = {  "_ZN3ccc7CC3x8y3E", // class name
  bases__ZN3ccc7CC3x8y3E, 2,
  &(vtc__ZN3ccc7CC3x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y4  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC3x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y43efgEv
  ~CC3x8y4(); // tgen
  CC3x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y4E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y43pqrEv");}
void  ccc::CC3x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y43abcEv");}
void  ccc::CC3x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y43efgEv");}
ccc::CC3x8y4 ::~CC3x8y4(){ note_dtor("_ZN3ccc7CC3x8y4E", this);} // tgen
ccc::CC3x8y4 ::CC3x8y4(){ note_ctor("_ZN3ccc7CC3x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y4E, buf);
    ::ccc::CC3x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y4E);
    dp->::ccc::CC3x8y4::~CC3x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y4E(Test__ZN3ccc7CC3x8y4E, "_ZN3ccc7CC3x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y4C1Ev();
extern void _ZN3ccc7CC3x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y4E[] = {
  NSPAIR(_ZN3ccc7CC3x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y4E[];
extern void _ZN3ccc7CC3x8y43efgEv();
extern void _ZN3ccc7CC3x8y43pqrEv();
extern void _ZN3ccc7CC3x8y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y43efgEv,_ZThn4_N3ccc7CC3x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y43abcEv,_ZThn4_N3ccc7CC3x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y43efgEv,_ZThn4_N3ccc7CC3x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y43abcEv,_ZThn4_N3ccc7CC3x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y4E[];
Class_Descriptor cd__ZN3ccc7CC3x8y4E = {  "_ZN3ccc7CC3x8y4E", // class name
  bases__ZN3ccc7CC3x8y4E, 2,
  &(vtc__ZN3ccc7CC3x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y5  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC3x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y53abcEv
  ~CC3x8y5(); // tgen
  CC3x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y5E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y53pqrEv");}
void  ccc::CC3x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y53efgEv");}
void  ccc::CC3x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y53abcEv");}
ccc::CC3x8y5 ::~CC3x8y5(){ note_dtor("_ZN3ccc7CC3x8y5E", this);} // tgen
ccc::CC3x8y5 ::CC3x8y5(){ note_ctor("_ZN3ccc7CC3x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y5E, buf);
    ::ccc::CC3x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y5E);
    dp->::ccc::CC3x8y5::~CC3x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y5E(Test__ZN3ccc7CC3x8y5E, "_ZN3ccc7CC3x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y5C1Ev();
extern void _ZN3ccc7CC3x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y5E[] = {
  NSPAIR(_ZN3ccc7CC3x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y5E[];
extern void _ZN3ccc7CC3x8y53efgEv();
extern void _ZN3ccc7CC3x8y53pqrEv();
extern void _ZN3ccc7CC3x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y53efgEv,_ZThn4_N3ccc7CC3x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y53abcEv,_ZThn4_N3ccc7CC3x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y53efgEv,_ZThn4_N3ccc7CC3x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y53abcEv,_ZThn4_N3ccc7CC3x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y5E[];
Class_Descriptor cd__ZN3ccc7CC3x8y5E = {  "_ZN3ccc7CC3x8y5E", // class name
  bases__ZN3ccc7CC3x8y5E, 2,
  &(vtc__ZN3ccc7CC3x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y6  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x8y63efgEv
  ~CC3x8y6(); // tgen
  CC3x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y6E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y63abcEv");}
void  ccc::CC3x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y63efgEv");}
ccc::CC3x8y6 ::~CC3x8y6(){ note_dtor("_ZN3ccc7CC3x8y6E", this);} // tgen
ccc::CC3x8y6 ::CC3x8y6(){ note_ctor("_ZN3ccc7CC3x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y6E, buf);
    ::ccc::CC3x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y6E);
    dp->::ccc::CC3x8y6::~CC3x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y6E(Test__ZN3ccc7CC3x8y6E, "_ZN3ccc7CC3x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y6C1Ev();
extern void _ZN3ccc7CC3x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y6E[] = {
  NSPAIR(_ZN3ccc7CC3x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y6E[];
extern void _ZN3ccc7CC3x8y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y63efgEv,_ZThn4_N3ccc7CC3x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y63abcEv,_ZThn4_N3ccc7CC3x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y63efgEv,_ZThn4_N3ccc7CC3x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y63abcEv,_ZThn4_N3ccc7CC3x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y6E[];
Class_Descriptor cd__ZN3ccc7CC3x8y6E = {  "_ZN3ccc7CC3x8y6E", // class name
  bases__ZN3ccc7CC3x8y6E, 2,
  &(vtc__ZN3ccc7CC3x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y7  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC3x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y73pqrEv
  ~CC3x8y7(); // tgen
  CC3x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y7E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y73abcEv");}
void  ccc::CC3x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y73pqrEv");}
ccc::CC3x8y7 ::~CC3x8y7(){ note_dtor("_ZN3ccc7CC3x8y7E", this);} // tgen
ccc::CC3x8y7 ::CC3x8y7(){ note_ctor("_ZN3ccc7CC3x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y7E, buf);
    ::ccc::CC3x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y7E);
    dp->::ccc::CC3x8y7::~CC3x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y7E(Test__ZN3ccc7CC3x8y7E, "_ZN3ccc7CC3x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y7C1Ev();
extern void _ZN3ccc7CC3x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y7E[] = {
  NSPAIR(_ZN3ccc7CC3x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x8y73pqrEv();
extern void _ZN3ccc7CC3x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y73abcEv,_ZThn4_N3ccc7CC3x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y73abcEv,_ZThn4_N3ccc7CC3x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y7E[];
Class_Descriptor cd__ZN3ccc7CC3x8y7E = {  "_ZN3ccc7CC3x8y7E", // class name
  bases__ZN3ccc7CC3x8y7E, 2,
  &(vtc__ZN3ccc7CC3x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y8  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x8y83abcEv
  ~CC3x8y8(); // tgen
  CC3x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y8E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y83efgEv");}
void  ccc::CC3x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x8y83abcEv");}
ccc::CC3x8y8 ::~CC3x8y8(){ note_dtor("_ZN3ccc7CC3x8y8E", this);} // tgen
ccc::CC3x8y8 ::CC3x8y8(){ note_ctor("_ZN3ccc7CC3x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y8E, buf);
    ::ccc::CC3x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y8E);
    dp->::ccc::CC3x8y8::~CC3x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y8E(Test__ZN3ccc7CC3x8y8E, "_ZN3ccc7CC3x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y8C1Ev();
extern void _ZN3ccc7CC3x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y8E[] = {
  NSPAIR(_ZN3ccc7CC3x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y8E[];
extern void _ZN3ccc7CC3x8y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y83efgEv,_ZThn4_N3ccc7CC3x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y83abcEv,_ZThn4_N3ccc7CC3x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y83efgEv,_ZThn4_N3ccc7CC3x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y83abcEv,_ZThn4_N3ccc7CC3x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y8E[];
Class_Descriptor cd__ZN3ccc7CC3x8y8E = {  "_ZN3ccc7CC3x8y8E", // class name
  bases__ZN3ccc7CC3x8y8E, 2,
  &(vtc__ZN3ccc7CC3x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y9  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC3x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x8y93pqrEv
  ~CC3x8y9(); // tgen
  CC3x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x8y9E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x8y93efgEv");}
void  ccc::CC3x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x8y93pqrEv");}
ccc::CC3x8y9 ::~CC3x8y9(){ note_dtor("_ZN3ccc7CC3x8y9E", this);} // tgen
ccc::CC3x8y9 ::CC3x8y9(){ note_ctor("_ZN3ccc7CC3x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x8y9E, buf);
    ::ccc::CC3x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x8y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC3x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x8y9E);
    dp->::ccc::CC3x8y9::~CC3x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x8y9E(Test__ZN3ccc7CC3x8y9E, "_ZN3ccc7CC3x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x8y9C1Ev();
extern void _ZN3ccc7CC3x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x8y9E[] = {
  NSPAIR(_ZN3ccc7CC3x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC3x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y9E[];
extern void _ZN3ccc7CC3x8y93efgEv();
extern void _ZN3ccc7CC3x8y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x8y93efgEv,_ZThn4_N3ccc7CC3x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x8y93efgEv,_ZThn4_N3ccc7CC3x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x8y9E[];
Class_Descriptor cd__ZN3ccc7CC3x8y9E = {  "_ZN3ccc7CC3x8y9E", // class name
  bases__ZN3ccc7CC3x8y9E, 2,
  &(vtc__ZN3ccc7CC3x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y10  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x8y103abcEv
  ~CC3x8y10(); // tgen
  CC3x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y10E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y103pqrEv");}
void  ccc::CC3x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x8y103abcEv");}
ccc::CC3x8y10 ::~CC3x8y10(){ note_dtor("_ZN3ccc8CC3x8y10E", this);} // tgen
ccc::CC3x8y10 ::CC3x8y10(){ note_ctor("_ZN3ccc8CC3x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y10E, buf);
    ::ccc::CC3x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y10E);
    dp->::ccc::CC3x8y10::~CC3x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y10E(Test__ZN3ccc8CC3x8y10E, "_ZN3ccc8CC3x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y10C1Ev();
extern void _ZN3ccc8CC3x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y10E[] = {
  NSPAIR(_ZN3ccc8CC3x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x8y103pqrEv();
extern void _ZN3ccc8CC3x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y103abcEv,_ZThn4_N3ccc8CC3x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x8y103abcEv,_ZThn4_N3ccc8CC3x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y10E[];
Class_Descriptor cd__ZN3ccc8CC3x8y10E = {  "_ZN3ccc8CC3x8y10E", // class name
  bases__ZN3ccc8CC3x8y10E, 2,
  &(vtc__ZN3ccc8CC3x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y11  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x8y113efgEv
  ~CC3x8y11(); // tgen
  CC3x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y11E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y113pqrEv");}
void  ccc::CC3x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x8y113efgEv");}
ccc::CC3x8y11 ::~CC3x8y11(){ note_dtor("_ZN3ccc8CC3x8y11E", this);} // tgen
ccc::CC3x8y11 ::CC3x8y11(){ note_ctor("_ZN3ccc8CC3x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y11E, buf);
    ::ccc::CC3x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y11E);
    dp->::ccc::CC3x8y11::~CC3x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y11E(Test__ZN3ccc8CC3x8y11E, "_ZN3ccc8CC3x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y11C1Ev();
extern void _ZN3ccc8CC3x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y11E[] = {
  NSPAIR(_ZN3ccc8CC3x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y11E[];
extern void _ZN3ccc8CC3x8y113efgEv();
extern void _ZN3ccc8CC3x8y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y113efgEv,_ZThn4_N3ccc8CC3x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x8y113efgEv,_ZThn4_N3ccc8CC3x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y11E[];
Class_Descriptor cd__ZN3ccc8CC3x8y11E = {  "_ZN3ccc8CC3x8y11E", // class name
  bases__ZN3ccc8CC3x8y11E, 2,
  &(vtc__ZN3ccc8CC3x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y12  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC3x8y123abcEv
  ~CC3x8y12(); // tgen
  CC3x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x8y123abcEv");}
ccc::CC3x8y12 ::~CC3x8y12(){ note_dtor("_ZN3ccc8CC3x8y12E", this);} // tgen
ccc::CC3x8y12 ::CC3x8y12(){ note_ctor("_ZN3ccc8CC3x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y12E, buf);
    ::ccc::CC3x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y12E);
    dp->::ccc::CC3x8y12::~CC3x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y12E(Test__ZN3ccc8CC3x8y12E, "_ZN3ccc8CC3x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y12C1Ev();
extern void _ZN3ccc8CC3x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y12E[] = {
  NSPAIR(_ZN3ccc8CC3x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y123abcEv,_ZThn4_N3ccc8CC3x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x8y123abcEv,_ZThn4_N3ccc8CC3x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y12E[];
Class_Descriptor cd__ZN3ccc8CC3x8y12E = {  "_ZN3ccc8CC3x8y12E", // class name
  bases__ZN3ccc8CC3x8y12E, 2,
  &(vtc__ZN3ccc8CC3x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y13  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC3x8y133efgEv
  ~CC3x8y13(); // tgen
  CC3x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x8y133efgEv");}
ccc::CC3x8y13 ::~CC3x8y13(){ note_dtor("_ZN3ccc8CC3x8y13E", this);} // tgen
ccc::CC3x8y13 ::CC3x8y13(){ note_ctor("_ZN3ccc8CC3x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y13E, buf);
    ::ccc::CC3x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y13E);
    dp->::ccc::CC3x8y13::~CC3x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y13E(Test__ZN3ccc8CC3x8y13E, "_ZN3ccc8CC3x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y13C1Ev();
extern void _ZN3ccc8CC3x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y13E[] = {
  NSPAIR(_ZN3ccc8CC3x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y13E[];
extern void _ZN3ccc8CC3x8y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x8y133efgEv,_ZThn4_N3ccc8CC3x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x8y133efgEv,_ZThn4_N3ccc8CC3x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y13E[];
Class_Descriptor cd__ZN3ccc8CC3x8y13E = {  "_ZN3ccc8CC3x8y13E", // class name
  bases__ZN3ccc8CC3x8y13E, 2,
  &(vtc__ZN3ccc8CC3x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y14  : ::ccc::AA3 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC3x8y143pqrEv
  ~CC3x8y14(); // tgen
  CC3x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x8y143pqrEv");}
ccc::CC3x8y14 ::~CC3x8y14(){ note_dtor("_ZN3ccc8CC3x8y14E", this);} // tgen
ccc::CC3x8y14 ::CC3x8y14(){ note_ctor("_ZN3ccc8CC3x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y14E, buf);
    ::ccc::CC3x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y14E);
    dp->::ccc::CC3x8y14::~CC3x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y14E(Test__ZN3ccc8CC3x8y14E, "_ZN3ccc8CC3x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y14C1Ev();
extern void _ZN3ccc8CC3x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y14E[] = {
  NSPAIR(_ZN3ccc8CC3x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x8y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y14E[];
Class_Descriptor cd__ZN3ccc8CC3x8y14E = {  "_ZN3ccc8CC3x8y14E", // class name
  bases__ZN3ccc8CC3x8y14E, 2,
  &(vtc__ZN3ccc8CC3x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x8y15  : ::ccc::AA3 , ::ccc::BB8 {
  ~CC3x8y15(); // tgen
  CC3x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x8y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x8y15 ::~CC3x8y15(){ note_dtor("_ZN3ccc8CC3x8y15E", this);} // tgen
ccc::CC3x8y15 ::CC3x8y15(){ note_ctor("_ZN3ccc8CC3x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x8y15E, buf);
    ::ccc::CC3x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x8y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC3x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x8y15E);
    dp->::ccc::CC3x8y15::~CC3x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x8y15E(Test__ZN3ccc8CC3x8y15E, "_ZN3ccc8CC3x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x8y15C1Ev();
extern void _ZN3ccc8CC3x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x8y15E[] = {
  NSPAIR(_ZN3ccc8CC3x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC3x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x8y15E[];
Class_Descriptor cd__ZN3ccc8CC3x8y15E = {  "_ZN3ccc8CC3x8y15E", // class name
  bases__ZN3ccc8CC3x8y15E, 2,
  &(vtc__ZN3ccc8CC3x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y0  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y03pqrEv
  ~CC3x9y0(); // tgen
  CC3x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y0E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y03abcEv");}
void  ccc::CC3x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y03efgEv");}
void  ccc::CC3x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y03pqrEv");}
ccc::CC3x9y0 ::~CC3x9y0(){ note_dtor("_ZN3ccc7CC3x9y0E", this);} // tgen
ccc::CC3x9y0 ::CC3x9y0(){ note_ctor("_ZN3ccc7CC3x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y0E, buf);
    ::ccc::CC3x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y0E);
    dp->::ccc::CC3x9y0::~CC3x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y0E(Test__ZN3ccc7CC3x9y0E, "_ZN3ccc7CC3x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y0C1Ev();
extern void _ZN3ccc7CC3x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y0E[] = {
  NSPAIR(_ZN3ccc7CC3x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y0E[];
extern void _ZN3ccc7CC3x9y03efgEv();
extern void _ZN3ccc7CC3x9y03pqrEv();
extern void _ZN3ccc7CC3x9y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y03efgEv,_ZThn4_N3ccc7CC3x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y03pqrEv,_ZThn4_N3ccc7CC3x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y03efgEv,_ZThn4_N3ccc7CC3x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y03pqrEv,_ZThn4_N3ccc7CC3x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y0E[];
Class_Descriptor cd__ZN3ccc7CC3x9y0E = {  "_ZN3ccc7CC3x9y0E", // class name
  bases__ZN3ccc7CC3x9y0E, 2,
  &(vtc__ZN3ccc7CC3x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y1  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x9y13efgEv
  ~CC3x9y1(); // tgen
  CC3x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y1E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y13abcEv");}
void  ccc::CC3x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y13pqrEv");}
void  ccc::CC3x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y13efgEv");}
ccc::CC3x9y1 ::~CC3x9y1(){ note_dtor("_ZN3ccc7CC3x9y1E", this);} // tgen
ccc::CC3x9y1 ::CC3x9y1(){ note_ctor("_ZN3ccc7CC3x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y1E, buf);
    ::ccc::CC3x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y1E);
    dp->::ccc::CC3x9y1::~CC3x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y1E(Test__ZN3ccc7CC3x9y1E, "_ZN3ccc7CC3x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y1C1Ev();
extern void _ZN3ccc7CC3x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y1E[] = {
  NSPAIR(_ZN3ccc7CC3x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y1E[];
extern void _ZN3ccc7CC3x9y13efgEv();
extern void _ZN3ccc7CC3x9y13pqrEv();
extern void _ZN3ccc7CC3x9y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y13efgEv,_ZThn4_N3ccc7CC3x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y13pqrEv,_ZThn4_N3ccc7CC3x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y13efgEv,_ZThn4_N3ccc7CC3x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y13pqrEv,_ZThn4_N3ccc7CC3x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y1E[];
Class_Descriptor cd__ZN3ccc7CC3x9y1E = {  "_ZN3ccc7CC3x9y1E", // class name
  bases__ZN3ccc7CC3x9y1E, 2,
  &(vtc__ZN3ccc7CC3x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y2  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y23pqrEv
  ~CC3x9y2(); // tgen
  CC3x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y2E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y23efgEv");}
void  ccc::CC3x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y23abcEv");}
void  ccc::CC3x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y23pqrEv");}
ccc::CC3x9y2 ::~CC3x9y2(){ note_dtor("_ZN3ccc7CC3x9y2E", this);} // tgen
ccc::CC3x9y2 ::CC3x9y2(){ note_ctor("_ZN3ccc7CC3x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y2E, buf);
    ::ccc::CC3x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y2E);
    dp->::ccc::CC3x9y2::~CC3x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y2E(Test__ZN3ccc7CC3x9y2E, "_ZN3ccc7CC3x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y2C1Ev();
extern void _ZN3ccc7CC3x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y2E[] = {
  NSPAIR(_ZN3ccc7CC3x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y2E[];
extern void _ZN3ccc7CC3x9y23efgEv();
extern void _ZN3ccc7CC3x9y23pqrEv();
extern void _ZN3ccc7CC3x9y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y23efgEv,_ZThn4_N3ccc7CC3x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y23pqrEv,_ZThn4_N3ccc7CC3x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y23efgEv,_ZThn4_N3ccc7CC3x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y23pqrEv,_ZThn4_N3ccc7CC3x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y2E[];
Class_Descriptor cd__ZN3ccc7CC3x9y2E = {  "_ZN3ccc7CC3x9y2E", // class name
  bases__ZN3ccc7CC3x9y2E, 2,
  &(vtc__ZN3ccc7CC3x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y3  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x9y33abcEv
  ~CC3x9y3(); // tgen
  CC3x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y3E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y33efgEv");}
void  ccc::CC3x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y33pqrEv");}
void  ccc::CC3x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y33abcEv");}
ccc::CC3x9y3 ::~CC3x9y3(){ note_dtor("_ZN3ccc7CC3x9y3E", this);} // tgen
ccc::CC3x9y3 ::CC3x9y3(){ note_ctor("_ZN3ccc7CC3x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y3E, buf);
    ::ccc::CC3x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y3E);
    dp->::ccc::CC3x9y3::~CC3x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y3E(Test__ZN3ccc7CC3x9y3E, "_ZN3ccc7CC3x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y3C1Ev();
extern void _ZN3ccc7CC3x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y3E[] = {
  NSPAIR(_ZN3ccc7CC3x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y3E[];
extern void _ZN3ccc7CC3x9y33efgEv();
extern void _ZN3ccc7CC3x9y33pqrEv();
extern void _ZN3ccc7CC3x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y33efgEv,_ZThn4_N3ccc7CC3x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y33pqrEv,_ZThn4_N3ccc7CC3x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y33efgEv,_ZThn4_N3ccc7CC3x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y33pqrEv,_ZThn4_N3ccc7CC3x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y3E[];
Class_Descriptor cd__ZN3ccc7CC3x9y3E = {  "_ZN3ccc7CC3x9y3E", // class name
  bases__ZN3ccc7CC3x9y3E, 2,
  &(vtc__ZN3ccc7CC3x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y4  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC3x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC3x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y43efgEv
  ~CC3x9y4(); // tgen
  CC3x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y4E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y43pqrEv");}
void  ccc::CC3x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y43abcEv");}
void  ccc::CC3x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y43efgEv");}
ccc::CC3x9y4 ::~CC3x9y4(){ note_dtor("_ZN3ccc7CC3x9y4E", this);} // tgen
ccc::CC3x9y4 ::CC3x9y4(){ note_ctor("_ZN3ccc7CC3x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y4E, buf);
    ::ccc::CC3x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y4E);
    dp->::ccc::CC3x9y4::~CC3x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y4E(Test__ZN3ccc7CC3x9y4E, "_ZN3ccc7CC3x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y4C1Ev();
extern void _ZN3ccc7CC3x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y4E[] = {
  NSPAIR(_ZN3ccc7CC3x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y4E[];
extern void _ZN3ccc7CC3x9y43efgEv();
extern void _ZN3ccc7CC3x9y43pqrEv();
extern void _ZN3ccc7CC3x9y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y43efgEv,_ZThn4_N3ccc7CC3x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y43pqrEv,_ZThn4_N3ccc7CC3x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y43efgEv,_ZThn4_N3ccc7CC3x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y43pqrEv,_ZThn4_N3ccc7CC3x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y4E[];
Class_Descriptor cd__ZN3ccc7CC3x9y4E = {  "_ZN3ccc7CC3x9y4E", // class name
  bases__ZN3ccc7CC3x9y4E, 2,
  &(vtc__ZN3ccc7CC3x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y5  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC3x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC3x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y53abcEv
  ~CC3x9y5(); // tgen
  CC3x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y5E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y53pqrEv");}
void  ccc::CC3x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y53efgEv");}
void  ccc::CC3x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y53abcEv");}
ccc::CC3x9y5 ::~CC3x9y5(){ note_dtor("_ZN3ccc7CC3x9y5E", this);} // tgen
ccc::CC3x9y5 ::CC3x9y5(){ note_ctor("_ZN3ccc7CC3x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y5E, buf);
    ::ccc::CC3x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y5E);
    dp->::ccc::CC3x9y5::~CC3x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y5E(Test__ZN3ccc7CC3x9y5E, "_ZN3ccc7CC3x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y5C1Ev();
extern void _ZN3ccc7CC3x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y5E[] = {
  NSPAIR(_ZN3ccc7CC3x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y5E[];
extern void _ZN3ccc7CC3x9y53efgEv();
extern void _ZN3ccc7CC3x9y53pqrEv();
extern void _ZN3ccc7CC3x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y53efgEv,_ZThn4_N3ccc7CC3x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y53pqrEv,_ZThn4_N3ccc7CC3x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y53efgEv,_ZThn4_N3ccc7CC3x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y53pqrEv,_ZThn4_N3ccc7CC3x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y5E[];
Class_Descriptor cd__ZN3ccc7CC3x9y5E = {  "_ZN3ccc7CC3x9y5E", // class name
  bases__ZN3ccc7CC3x9y5E, 2,
  &(vtc__ZN3ccc7CC3x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y6  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC3x9y63efgEv
  ~CC3x9y6(); // tgen
  CC3x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y6E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y63abcEv");}
void  ccc::CC3x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y63efgEv");}
ccc::CC3x9y6 ::~CC3x9y6(){ note_dtor("_ZN3ccc7CC3x9y6E", this);} // tgen
ccc::CC3x9y6 ::CC3x9y6(){ note_ctor("_ZN3ccc7CC3x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y6E, buf);
    ::ccc::CC3x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y6E);
    dp->::ccc::CC3x9y6::~CC3x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y6E(Test__ZN3ccc7CC3x9y6E, "_ZN3ccc7CC3x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y6C1Ev();
extern void _ZN3ccc7CC3x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y6E[] = {
  NSPAIR(_ZN3ccc7CC3x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y6E[];
extern void _ZN3ccc7CC3x9y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y63efgEv,_ZThn4_N3ccc7CC3x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y63efgEv,_ZThn4_N3ccc7CC3x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y6E[];
Class_Descriptor cd__ZN3ccc7CC3x9y6E = {  "_ZN3ccc7CC3x9y6E", // class name
  bases__ZN3ccc7CC3x9y6E, 2,
  &(vtc__ZN3ccc7CC3x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y7  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC3x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y73pqrEv
  ~CC3x9y7(); // tgen
  CC3x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y7E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y73abcEv");}
void  ccc::CC3x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y73pqrEv");}
ccc::CC3x9y7 ::~CC3x9y7(){ note_dtor("_ZN3ccc7CC3x9y7E", this);} // tgen
ccc::CC3x9y7 ::CC3x9y7(){ note_ctor("_ZN3ccc7CC3x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y7E, buf);
    ::ccc::CC3x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y7E);
    dp->::ccc::CC3x9y7::~CC3x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y7E(Test__ZN3ccc7CC3x9y7E, "_ZN3ccc7CC3x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y7C1Ev();
extern void _ZN3ccc7CC3x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y7E[] = {
  NSPAIR(_ZN3ccc7CC3x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc7CC3x9y73pqrEv();
extern void _ZN3ccc7CC3x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y73pqrEv,_ZThn4_N3ccc7CC3x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y73pqrEv,_ZThn4_N3ccc7CC3x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y7E[];
Class_Descriptor cd__ZN3ccc7CC3x9y7E = {  "_ZN3ccc7CC3x9y7E", // class name
  bases__ZN3ccc7CC3x9y7E, 2,
  &(vtc__ZN3ccc7CC3x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y8  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC3x9y83abcEv
  ~CC3x9y8(); // tgen
  CC3x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y8E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y83efgEv");}
void  ccc::CC3x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC3x9y83abcEv");}
ccc::CC3x9y8 ::~CC3x9y8(){ note_dtor("_ZN3ccc7CC3x9y8E", this);} // tgen
ccc::CC3x9y8 ::CC3x9y8(){ note_ctor("_ZN3ccc7CC3x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y8E, buf);
    ::ccc::CC3x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y8E);
    dp->::ccc::CC3x9y8::~CC3x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y8E(Test__ZN3ccc7CC3x9y8E, "_ZN3ccc7CC3x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y8C1Ev();
extern void _ZN3ccc7CC3x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y8E[] = {
  NSPAIR(_ZN3ccc7CC3x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y8E[];
extern void _ZN3ccc7CC3x9y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc7CC3x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y83efgEv,_ZThn4_N3ccc7CC3x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y83efgEv,_ZThn4_N3ccc7CC3x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y8E[];
Class_Descriptor cd__ZN3ccc7CC3x9y8E = {  "_ZN3ccc7CC3x9y8E", // class name
  bases__ZN3ccc7CC3x9y8E, 2,
  &(vtc__ZN3ccc7CC3x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y9  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC3x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC3x9y93pqrEv
  ~CC3x9y9(); // tgen
  CC3x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC3x9y9E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC3x9y93efgEv");}
void  ccc::CC3x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC3x9y93pqrEv");}
ccc::CC3x9y9 ::~CC3x9y9(){ note_dtor("_ZN3ccc7CC3x9y9E", this);} // tgen
ccc::CC3x9y9 ::CC3x9y9(){ note_ctor("_ZN3ccc7CC3x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC3x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC3x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC3x9y9E, buf);
    ::ccc::CC3x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC3x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC3x9y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc7CC3x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC3x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC3x9y9E);
    dp->::ccc::CC3x9y9::~CC3x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC3x9y9E(Test__ZN3ccc7CC3x9y9E, "_ZN3ccc7CC3x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC3x9y9C1Ev();
extern void _ZN3ccc7CC3x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC3x9y9E[] = {
  NSPAIR(_ZN3ccc7CC3x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC3x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC3x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y9E[];
extern void _ZN3ccc7CC3x9y93efgEv();
extern void _ZN3ccc7CC3x9y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y93efgEv,_ZThn4_N3ccc7CC3x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC3x9y93pqrEv,_ZThn4_N3ccc7CC3x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC3x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC3x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC3x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y93efgEv,_ZThn4_N3ccc7CC3x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC3x9y93pqrEv,_ZThn4_N3ccc7CC3x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC3x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC3x9y9E[];
Class_Descriptor cd__ZN3ccc7CC3x9y9E = {  "_ZN3ccc7CC3x9y9E", // class name
  bases__ZN3ccc7CC3x9y9E, 2,
  &(vtc__ZN3ccc7CC3x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC3x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC3x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y10  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x9y103abcEv
  ~CC3x9y10(); // tgen
  CC3x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y10E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y103pqrEv");}
void  ccc::CC3x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x9y103abcEv");}
ccc::CC3x9y10 ::~CC3x9y10(){ note_dtor("_ZN3ccc8CC3x9y10E", this);} // tgen
ccc::CC3x9y10 ::CC3x9y10(){ note_ctor("_ZN3ccc8CC3x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y10E, buf);
    ::ccc::CC3x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y10E);
    dp->::ccc::CC3x9y10::~CC3x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y10E(Test__ZN3ccc8CC3x9y10E, "_ZN3ccc8CC3x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y10C1Ev();
extern void _ZN3ccc8CC3x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y10E[] = {
  NSPAIR(_ZN3ccc8CC3x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x9y103pqrEv();
extern void _ZN3ccc8CC3x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y103pqrEv,_ZThn4_N3ccc8CC3x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x9y103pqrEv,_ZThn4_N3ccc8CC3x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y10E[];
Class_Descriptor cd__ZN3ccc8CC3x9y10E = {  "_ZN3ccc8CC3x9y10E", // class name
  bases__ZN3ccc8CC3x9y10E, 2,
  &(vtc__ZN3ccc8CC3x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y11  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x9y113efgEv
  ~CC3x9y11(); // tgen
  CC3x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y11E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y113pqrEv");}
void  ccc::CC3x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x9y113efgEv");}
ccc::CC3x9y11 ::~CC3x9y11(){ note_dtor("_ZN3ccc8CC3x9y11E", this);} // tgen
ccc::CC3x9y11 ::CC3x9y11(){ note_ctor("_ZN3ccc8CC3x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y11E, buf);
    ::ccc::CC3x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y11E);
    dp->::ccc::CC3x9y11::~CC3x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y11E(Test__ZN3ccc8CC3x9y11E, "_ZN3ccc8CC3x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y11C1Ev();
extern void _ZN3ccc8CC3x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y11E[] = {
  NSPAIR(_ZN3ccc8CC3x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y11E[];
extern void _ZN3ccc8CC3x9y113efgEv();
extern void _ZN3ccc8CC3x9y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y113efgEv,_ZThn4_N3ccc8CC3x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y113pqrEv,_ZThn4_N3ccc8CC3x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x9y113efgEv,_ZThn4_N3ccc8CC3x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x9y113pqrEv,_ZThn4_N3ccc8CC3x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y11E[];
Class_Descriptor cd__ZN3ccc8CC3x9y11E = {  "_ZN3ccc8CC3x9y11E", // class name
  bases__ZN3ccc8CC3x9y11E, 2,
  &(vtc__ZN3ccc8CC3x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y12  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC3x9y123abcEv
  ~CC3x9y12(); // tgen
  CC3x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x9y123abcEv");}
ccc::CC3x9y12 ::~CC3x9y12(){ note_dtor("_ZN3ccc8CC3x9y12E", this);} // tgen
ccc::CC3x9y12 ::CC3x9y12(){ note_ctor("_ZN3ccc8CC3x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y12E, buf);
    ::ccc::CC3x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y12E);
    dp->::ccc::CC3x9y12::~CC3x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y12E(Test__ZN3ccc8CC3x9y12E, "_ZN3ccc8CC3x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y12C1Ev();
extern void _ZN3ccc8CC3x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y12E[] = {
  NSPAIR(_ZN3ccc8CC3x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y12E[];
Class_Descriptor cd__ZN3ccc8CC3x9y12E = {  "_ZN3ccc8CC3x9y12E", // class name
  bases__ZN3ccc8CC3x9y12E, 2,
  &(vtc__ZN3ccc8CC3x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y13  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC3x9y133efgEv
  ~CC3x9y13(); // tgen
  CC3x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y13E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x9y133efgEv");}
ccc::CC3x9y13 ::~CC3x9y13(){ note_dtor("_ZN3ccc8CC3x9y13E", this);} // tgen
ccc::CC3x9y13 ::CC3x9y13(){ note_ctor("_ZN3ccc8CC3x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y13E, buf);
    ::ccc::CC3x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y13E);
    dp->::ccc::CC3x9y13::~CC3x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y13E(Test__ZN3ccc8CC3x9y13E, "_ZN3ccc8CC3x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y13C1Ev();
extern void _ZN3ccc8CC3x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y13E[] = {
  NSPAIR(_ZN3ccc8CC3x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y13E[];
extern void _ZN3ccc8CC3x9y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y133efgEv,_ZThn4_N3ccc8CC3x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x9y133efgEv,_ZThn4_N3ccc8CC3x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y13E[];
Class_Descriptor cd__ZN3ccc8CC3x9y13E = {  "_ZN3ccc8CC3x9y13E", // class name
  bases__ZN3ccc8CC3x9y13E, 2,
  &(vtc__ZN3ccc8CC3x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y14  : ::ccc::AA3 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC3x9y143pqrEv
  ~CC3x9y14(); // tgen
  CC3x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y14E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x9y143pqrEv");}
ccc::CC3x9y14 ::~CC3x9y14(){ note_dtor("_ZN3ccc8CC3x9y14E", this);} // tgen
ccc::CC3x9y14 ::CC3x9y14(){ note_ctor("_ZN3ccc8CC3x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y14E, buf);
    ::ccc::CC3x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y14E);
    dp->::ccc::CC3x9y14::~CC3x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y14E(Test__ZN3ccc8CC3x9y14E, "_ZN3ccc8CC3x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y14C1Ev();
extern void _ZN3ccc8CC3x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y14E[] = {
  NSPAIR(_ZN3ccc8CC3x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x9y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x9y143pqrEv,_ZThn4_N3ccc8CC3x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x9y143pqrEv,_ZThn4_N3ccc8CC3x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y14E[];
Class_Descriptor cd__ZN3ccc8CC3x9y14E = {  "_ZN3ccc8CC3x9y14E", // class name
  bases__ZN3ccc8CC3x9y14E, 2,
  &(vtc__ZN3ccc8CC3x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x9y15  : ::ccc::AA3 , ::ccc::BB9 {
  ~CC3x9y15(); // tgen
  CC3x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC3x9y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x9y15 ::~CC3x9y15(){ note_dtor("_ZN3ccc8CC3x9y15E", this);} // tgen
ccc::CC3x9y15 ::CC3x9y15(){ note_ctor("_ZN3ccc8CC3x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC3x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x9y15E, buf);
    ::ccc::CC3x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x9y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC3x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x9y15E);
    dp->::ccc::CC3x9y15::~CC3x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x9y15E(Test__ZN3ccc8CC3x9y15E, "_ZN3ccc8CC3x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x9y15C1Ev();
extern void _ZN3ccc8CC3x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC3x9y15E[] = {
  NSPAIR(_ZN3ccc8CC3x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC3x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC3x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x9y15E[];
Class_Descriptor cd__ZN3ccc8CC3x9y15E = {  "_ZN3ccc8CC3x9y15E", // class name
  bases__ZN3ccc8CC3x9y15E, 2,
  &(vtc__ZN3ccc8CC3x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y0  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y03pqrEv
  ~CC3x10y0(); // tgen
  CC3x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y0E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y03abcEv");}
void  ccc::CC3x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y03efgEv");}
void  ccc::CC3x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y03pqrEv");}
ccc::CC3x10y0 ::~CC3x10y0(){ note_dtor("_ZN3ccc8CC3x10y0E", this);} // tgen
ccc::CC3x10y0 ::CC3x10y0(){ note_ctor("_ZN3ccc8CC3x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y0E, buf);
    ::ccc::CC3x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y0E);
    dp->::ccc::CC3x10y0::~CC3x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y0E(Test__ZN3ccc8CC3x10y0E, "_ZN3ccc8CC3x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y0C1Ev();
extern void _ZN3ccc8CC3x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y0E[] = {
  NSPAIR(_ZN3ccc8CC3x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y0E[];
extern void _ZN3ccc8CC3x10y03efgEv();
extern void _ZN3ccc8CC3x10y03pqrEv();
extern void _ZN3ccc8CC3x10y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y03pqrEv,_ZThn4_N3ccc8CC3x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y03abcEv,_ZThn4_N3ccc8CC3x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y03pqrEv,_ZThn4_N3ccc8CC3x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y03abcEv,_ZThn4_N3ccc8CC3x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y0E[];
Class_Descriptor cd__ZN3ccc8CC3x10y0E = {  "_ZN3ccc8CC3x10y0E", // class name
  bases__ZN3ccc8CC3x10y0E, 2,
  &(vtc__ZN3ccc8CC3x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y1  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x10y13efgEv
  ~CC3x10y1(); // tgen
  CC3x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y1E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y13abcEv");}
void  ccc::CC3x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y13pqrEv");}
void  ccc::CC3x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y13efgEv");}
ccc::CC3x10y1 ::~CC3x10y1(){ note_dtor("_ZN3ccc8CC3x10y1E", this);} // tgen
ccc::CC3x10y1 ::CC3x10y1(){ note_ctor("_ZN3ccc8CC3x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y1E, buf);
    ::ccc::CC3x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y1E);
    dp->::ccc::CC3x10y1::~CC3x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y1E(Test__ZN3ccc8CC3x10y1E, "_ZN3ccc8CC3x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y1C1Ev();
extern void _ZN3ccc8CC3x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y1E[] = {
  NSPAIR(_ZN3ccc8CC3x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y1E[];
extern void _ZN3ccc8CC3x10y13efgEv();
extern void _ZN3ccc8CC3x10y13pqrEv();
extern void _ZN3ccc8CC3x10y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y13pqrEv,_ZThn4_N3ccc8CC3x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y13abcEv,_ZThn4_N3ccc8CC3x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y13pqrEv,_ZThn4_N3ccc8CC3x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y13abcEv,_ZThn4_N3ccc8CC3x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y1E[];
Class_Descriptor cd__ZN3ccc8CC3x10y1E = {  "_ZN3ccc8CC3x10y1E", // class name
  bases__ZN3ccc8CC3x10y1E, 2,
  &(vtc__ZN3ccc8CC3x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y2  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y23pqrEv
  ~CC3x10y2(); // tgen
  CC3x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y2E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y23efgEv");}
void  ccc::CC3x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y23abcEv");}
void  ccc::CC3x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y23pqrEv");}
ccc::CC3x10y2 ::~CC3x10y2(){ note_dtor("_ZN3ccc8CC3x10y2E", this);} // tgen
ccc::CC3x10y2 ::CC3x10y2(){ note_ctor("_ZN3ccc8CC3x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y2E, buf);
    ::ccc::CC3x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y2E);
    dp->::ccc::CC3x10y2::~CC3x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y2E(Test__ZN3ccc8CC3x10y2E, "_ZN3ccc8CC3x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y2C1Ev();
extern void _ZN3ccc8CC3x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y2E[] = {
  NSPAIR(_ZN3ccc8CC3x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y2E[];
extern void _ZN3ccc8CC3x10y23efgEv();
extern void _ZN3ccc8CC3x10y23pqrEv();
extern void _ZN3ccc8CC3x10y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y23pqrEv,_ZThn4_N3ccc8CC3x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y23abcEv,_ZThn4_N3ccc8CC3x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y23pqrEv,_ZThn4_N3ccc8CC3x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y23abcEv,_ZThn4_N3ccc8CC3x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y2E[];
Class_Descriptor cd__ZN3ccc8CC3x10y2E = {  "_ZN3ccc8CC3x10y2E", // class name
  bases__ZN3ccc8CC3x10y2E, 2,
  &(vtc__ZN3ccc8CC3x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y3  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x10y33abcEv
  ~CC3x10y3(); // tgen
  CC3x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y3E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y33efgEv");}
void  ccc::CC3x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y33pqrEv");}
void  ccc::CC3x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y33abcEv");}
ccc::CC3x10y3 ::~CC3x10y3(){ note_dtor("_ZN3ccc8CC3x10y3E", this);} // tgen
ccc::CC3x10y3 ::CC3x10y3(){ note_ctor("_ZN3ccc8CC3x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y3E, buf);
    ::ccc::CC3x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y3E);
    dp->::ccc::CC3x10y3::~CC3x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y3E(Test__ZN3ccc8CC3x10y3E, "_ZN3ccc8CC3x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y3C1Ev();
extern void _ZN3ccc8CC3x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y3E[] = {
  NSPAIR(_ZN3ccc8CC3x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y3E[];
extern void _ZN3ccc8CC3x10y33efgEv();
extern void _ZN3ccc8CC3x10y33pqrEv();
extern void _ZN3ccc8CC3x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y33pqrEv,_ZThn4_N3ccc8CC3x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y33abcEv,_ZThn4_N3ccc8CC3x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y33pqrEv,_ZThn4_N3ccc8CC3x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y33abcEv,_ZThn4_N3ccc8CC3x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y3E[];
Class_Descriptor cd__ZN3ccc8CC3x10y3E = {  "_ZN3ccc8CC3x10y3E", // class name
  bases__ZN3ccc8CC3x10y3E, 2,
  &(vtc__ZN3ccc8CC3x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y4  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC3x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y43efgEv
  ~CC3x10y4(); // tgen
  CC3x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y4E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y43pqrEv");}
void  ccc::CC3x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y43abcEv");}
void  ccc::CC3x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y43efgEv");}
ccc::CC3x10y4 ::~CC3x10y4(){ note_dtor("_ZN3ccc8CC3x10y4E", this);} // tgen
ccc::CC3x10y4 ::CC3x10y4(){ note_ctor("_ZN3ccc8CC3x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y4E, buf);
    ::ccc::CC3x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y4E);
    dp->::ccc::CC3x10y4::~CC3x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y4E(Test__ZN3ccc8CC3x10y4E, "_ZN3ccc8CC3x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y4C1Ev();
extern void _ZN3ccc8CC3x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y4E[] = {
  NSPAIR(_ZN3ccc8CC3x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y4E[];
extern void _ZN3ccc8CC3x10y43efgEv();
extern void _ZN3ccc8CC3x10y43pqrEv();
extern void _ZN3ccc8CC3x10y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y43pqrEv,_ZThn4_N3ccc8CC3x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y43abcEv,_ZThn4_N3ccc8CC3x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y43pqrEv,_ZThn4_N3ccc8CC3x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y43abcEv,_ZThn4_N3ccc8CC3x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y4E[];
Class_Descriptor cd__ZN3ccc8CC3x10y4E = {  "_ZN3ccc8CC3x10y4E", // class name
  bases__ZN3ccc8CC3x10y4E, 2,
  &(vtc__ZN3ccc8CC3x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y5  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC3x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y53abcEv
  ~CC3x10y5(); // tgen
  CC3x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y5E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y53pqrEv");}
void  ccc::CC3x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y53efgEv");}
void  ccc::CC3x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y53abcEv");}
ccc::CC3x10y5 ::~CC3x10y5(){ note_dtor("_ZN3ccc8CC3x10y5E", this);} // tgen
ccc::CC3x10y5 ::CC3x10y5(){ note_ctor("_ZN3ccc8CC3x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y5E, buf);
    ::ccc::CC3x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y5E);
    dp->::ccc::CC3x10y5::~CC3x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y5E(Test__ZN3ccc8CC3x10y5E, "_ZN3ccc8CC3x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y5C1Ev();
extern void _ZN3ccc8CC3x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y5E[] = {
  NSPAIR(_ZN3ccc8CC3x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y5E[];
extern void _ZN3ccc8CC3x10y53efgEv();
extern void _ZN3ccc8CC3x10y53pqrEv();
extern void _ZN3ccc8CC3x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y53pqrEv,_ZThn4_N3ccc8CC3x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y53abcEv,_ZThn4_N3ccc8CC3x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y53pqrEv,_ZThn4_N3ccc8CC3x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y53abcEv,_ZThn4_N3ccc8CC3x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y5E[];
Class_Descriptor cd__ZN3ccc8CC3x10y5E = {  "_ZN3ccc8CC3x10y5E", // class name
  bases__ZN3ccc8CC3x10y5E, 2,
  &(vtc__ZN3ccc8CC3x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y6  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x10y63efgEv
  ~CC3x10y6(); // tgen
  CC3x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y6E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y63abcEv");}
void  ccc::CC3x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y63efgEv");}
ccc::CC3x10y6 ::~CC3x10y6(){ note_dtor("_ZN3ccc8CC3x10y6E", this);} // tgen
ccc::CC3x10y6 ::CC3x10y6(){ note_ctor("_ZN3ccc8CC3x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y6E, buf);
    ::ccc::CC3x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y6E);
    dp->::ccc::CC3x10y6::~CC3x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y6E(Test__ZN3ccc8CC3x10y6E, "_ZN3ccc8CC3x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y6C1Ev();
extern void _ZN3ccc8CC3x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y6E[] = {
  NSPAIR(_ZN3ccc8CC3x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y6E[];
extern void _ZN3ccc8CC3x10y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y63abcEv,_ZThn4_N3ccc8CC3x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y63abcEv,_ZThn4_N3ccc8CC3x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y6E[];
Class_Descriptor cd__ZN3ccc8CC3x10y6E = {  "_ZN3ccc8CC3x10y6E", // class name
  bases__ZN3ccc8CC3x10y6E, 2,
  &(vtc__ZN3ccc8CC3x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y7  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC3x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y73pqrEv
  ~CC3x10y7(); // tgen
  CC3x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y7E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y73abcEv");}
void  ccc::CC3x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y73pqrEv");}
ccc::CC3x10y7 ::~CC3x10y7(){ note_dtor("_ZN3ccc8CC3x10y7E", this);} // tgen
ccc::CC3x10y7 ::CC3x10y7(){ note_ctor("_ZN3ccc8CC3x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y7E, buf);
    ::ccc::CC3x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y7E);
    dp->::ccc::CC3x10y7::~CC3x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y7E(Test__ZN3ccc8CC3x10y7E, "_ZN3ccc8CC3x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y7C1Ev();
extern void _ZN3ccc8CC3x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y7E[] = {
  NSPAIR(_ZN3ccc8CC3x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x10y73pqrEv();
extern void _ZN3ccc8CC3x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y73pqrEv,_ZThn4_N3ccc8CC3x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y73abcEv,_ZThn4_N3ccc8CC3x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y73pqrEv,_ZThn4_N3ccc8CC3x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y73abcEv,_ZThn4_N3ccc8CC3x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y7E[];
Class_Descriptor cd__ZN3ccc8CC3x10y7E = {  "_ZN3ccc8CC3x10y7E", // class name
  bases__ZN3ccc8CC3x10y7E, 2,
  &(vtc__ZN3ccc8CC3x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y8  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x10y83abcEv
  ~CC3x10y8(); // tgen
  CC3x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y8E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y83efgEv");}
void  ccc::CC3x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x10y83abcEv");}
ccc::CC3x10y8 ::~CC3x10y8(){ note_dtor("_ZN3ccc8CC3x10y8E", this);} // tgen
ccc::CC3x10y8 ::CC3x10y8(){ note_ctor("_ZN3ccc8CC3x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y8E, buf);
    ::ccc::CC3x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y8E);
    dp->::ccc::CC3x10y8::~CC3x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y8E(Test__ZN3ccc8CC3x10y8E, "_ZN3ccc8CC3x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y8C1Ev();
extern void _ZN3ccc8CC3x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y8E[] = {
  NSPAIR(_ZN3ccc8CC3x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y8E[];
extern void _ZN3ccc8CC3x10y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y83abcEv,_ZThn4_N3ccc8CC3x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y83abcEv,_ZThn4_N3ccc8CC3x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y8E[];
Class_Descriptor cd__ZN3ccc8CC3x10y8E = {  "_ZN3ccc8CC3x10y8E", // class name
  bases__ZN3ccc8CC3x10y8E, 2,
  &(vtc__ZN3ccc8CC3x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y9  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC3x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x10y93pqrEv
  ~CC3x10y9(); // tgen
  CC3x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x10y9E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x10y93efgEv");}
void  ccc::CC3x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x10y93pqrEv");}
ccc::CC3x10y9 ::~CC3x10y9(){ note_dtor("_ZN3ccc8CC3x10y9E", this);} // tgen
ccc::CC3x10y9 ::CC3x10y9(){ note_ctor("_ZN3ccc8CC3x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x10y9E, buf);
    ::ccc::CC3x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x10y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC3x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x10y9E);
    dp->::ccc::CC3x10y9::~CC3x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x10y9E(Test__ZN3ccc8CC3x10y9E, "_ZN3ccc8CC3x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x10y9C1Ev();
extern void _ZN3ccc8CC3x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x10y9E[] = {
  NSPAIR(_ZN3ccc8CC3x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC3x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y9E[];
extern void _ZN3ccc8CC3x10y93efgEv();
extern void _ZN3ccc8CC3x10y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x10y93pqrEv,_ZThn4_N3ccc8CC3x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x10y93pqrEv,_ZThn4_N3ccc8CC3x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x10y9E[];
Class_Descriptor cd__ZN3ccc8CC3x10y9E = {  "_ZN3ccc8CC3x10y9E", // class name
  bases__ZN3ccc8CC3x10y9E, 2,
  &(vtc__ZN3ccc8CC3x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y10  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x10y103abcEv
  ~CC3x10y10(); // tgen
  CC3x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y10E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y103pqrEv");}
void  ccc::CC3x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x10y103abcEv");}
ccc::CC3x10y10 ::~CC3x10y10(){ note_dtor("_ZN3ccc9CC3x10y10E", this);} // tgen
ccc::CC3x10y10 ::CC3x10y10(){ note_ctor("_ZN3ccc9CC3x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y10E, buf);
    ::ccc::CC3x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y10E);
    dp->::ccc::CC3x10y10::~CC3x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y10E(Test__ZN3ccc9CC3x10y10E, "_ZN3ccc9CC3x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y10C1Ev();
extern void _ZN3ccc9CC3x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y10E[] = {
  NSPAIR(_ZN3ccc9CC3x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x10y103pqrEv();
extern void _ZN3ccc9CC3x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y103pqrEv,_ZThn4_N3ccc9CC3x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y103abcEv,_ZThn4_N3ccc9CC3x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x10y103pqrEv,_ZThn4_N3ccc9CC3x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x10y103abcEv,_ZThn4_N3ccc9CC3x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y10E[];
Class_Descriptor cd__ZN3ccc9CC3x10y10E = {  "_ZN3ccc9CC3x10y10E", // class name
  bases__ZN3ccc9CC3x10y10E, 2,
  &(vtc__ZN3ccc9CC3x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y11  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x10y113efgEv
  ~CC3x10y11(); // tgen
  CC3x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y11E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y113pqrEv");}
void  ccc::CC3x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x10y113efgEv");}
ccc::CC3x10y11 ::~CC3x10y11(){ note_dtor("_ZN3ccc9CC3x10y11E", this);} // tgen
ccc::CC3x10y11 ::CC3x10y11(){ note_ctor("_ZN3ccc9CC3x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y11E, buf);
    ::ccc::CC3x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y11E);
    dp->::ccc::CC3x10y11::~CC3x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y11E(Test__ZN3ccc9CC3x10y11E, "_ZN3ccc9CC3x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y11C1Ev();
extern void _ZN3ccc9CC3x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y11E[] = {
  NSPAIR(_ZN3ccc9CC3x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y11E[];
extern void _ZN3ccc9CC3x10y113efgEv();
extern void _ZN3ccc9CC3x10y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y113pqrEv,_ZThn4_N3ccc9CC3x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x10y113pqrEv,_ZThn4_N3ccc9CC3x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y11E[];
Class_Descriptor cd__ZN3ccc9CC3x10y11E = {  "_ZN3ccc9CC3x10y11E", // class name
  bases__ZN3ccc9CC3x10y11E, 2,
  &(vtc__ZN3ccc9CC3x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y12  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC3x10y123abcEv
  ~CC3x10y12(); // tgen
  CC3x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x10y123abcEv");}
ccc::CC3x10y12 ::~CC3x10y12(){ note_dtor("_ZN3ccc9CC3x10y12E", this);} // tgen
ccc::CC3x10y12 ::CC3x10y12(){ note_ctor("_ZN3ccc9CC3x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y12E, buf);
    ::ccc::CC3x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y12E);
    dp->::ccc::CC3x10y12::~CC3x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y12E(Test__ZN3ccc9CC3x10y12E, "_ZN3ccc9CC3x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y12C1Ev();
extern void _ZN3ccc9CC3x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y12E[] = {
  NSPAIR(_ZN3ccc9CC3x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y123abcEv,_ZThn4_N3ccc9CC3x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x10y123abcEv,_ZThn4_N3ccc9CC3x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y12E[];
Class_Descriptor cd__ZN3ccc9CC3x10y12E = {  "_ZN3ccc9CC3x10y12E", // class name
  bases__ZN3ccc9CC3x10y12E, 2,
  &(vtc__ZN3ccc9CC3x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y13  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC3x10y133efgEv
  ~CC3x10y13(); // tgen
  CC3x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x10y133efgEv");}
ccc::CC3x10y13 ::~CC3x10y13(){ note_dtor("_ZN3ccc9CC3x10y13E", this);} // tgen
ccc::CC3x10y13 ::CC3x10y13(){ note_ctor("_ZN3ccc9CC3x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y13E, buf);
    ::ccc::CC3x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y13E);
    dp->::ccc::CC3x10y13::~CC3x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y13E(Test__ZN3ccc9CC3x10y13E, "_ZN3ccc9CC3x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y13C1Ev();
extern void _ZN3ccc9CC3x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y13E[] = {
  NSPAIR(_ZN3ccc9CC3x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y13E[];
extern void _ZN3ccc9CC3x10y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y13E[];
Class_Descriptor cd__ZN3ccc9CC3x10y13E = {  "_ZN3ccc9CC3x10y13E", // class name
  bases__ZN3ccc9CC3x10y13E, 2,
  &(vtc__ZN3ccc9CC3x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y14  : ::ccc::AA3 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC3x10y143pqrEv
  ~CC3x10y14(); // tgen
  CC3x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x10y143pqrEv");}
ccc::CC3x10y14 ::~CC3x10y14(){ note_dtor("_ZN3ccc9CC3x10y14E", this);} // tgen
ccc::CC3x10y14 ::CC3x10y14(){ note_ctor("_ZN3ccc9CC3x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y14E, buf);
    ::ccc::CC3x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y14E);
    dp->::ccc::CC3x10y14::~CC3x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y14E(Test__ZN3ccc9CC3x10y14E, "_ZN3ccc9CC3x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y14C1Ev();
extern void _ZN3ccc9CC3x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y14E[] = {
  NSPAIR(_ZN3ccc9CC3x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x10y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x10y143pqrEv,_ZThn4_N3ccc9CC3x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x10y143pqrEv,_ZThn4_N3ccc9CC3x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y14E[];
Class_Descriptor cd__ZN3ccc9CC3x10y14E = {  "_ZN3ccc9CC3x10y14E", // class name
  bases__ZN3ccc9CC3x10y14E, 2,
  &(vtc__ZN3ccc9CC3x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x10y15  : ::ccc::AA3 , ::ccc::BB10 {
  ~CC3x10y15(); // tgen
  CC3x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x10y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x10y15 ::~CC3x10y15(){ note_dtor("_ZN3ccc9CC3x10y15E", this);} // tgen
ccc::CC3x10y15 ::CC3x10y15(){ note_ctor("_ZN3ccc9CC3x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x10y15E, buf);
    ::ccc::CC3x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x10y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC3x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x10y15E);
    dp->::ccc::CC3x10y15::~CC3x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x10y15E(Test__ZN3ccc9CC3x10y15E, "_ZN3ccc9CC3x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x10y15C1Ev();
extern void _ZN3ccc9CC3x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x10y15E[] = {
  NSPAIR(_ZN3ccc9CC3x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC3x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x10y15E[];
Class_Descriptor cd__ZN3ccc9CC3x10y15E = {  "_ZN3ccc9CC3x10y15E", // class name
  bases__ZN3ccc9CC3x10y15E, 2,
  &(vtc__ZN3ccc9CC3x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y0  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y03pqrEv
  ~CC3x11y0(); // tgen
  CC3x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y0E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y03abcEv");}
void  ccc::CC3x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y03efgEv");}
void  ccc::CC3x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y03pqrEv");}
ccc::CC3x11y0 ::~CC3x11y0(){ note_dtor("_ZN3ccc8CC3x11y0E", this);} // tgen
ccc::CC3x11y0 ::CC3x11y0(){ note_ctor("_ZN3ccc8CC3x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y0E, buf);
    ::ccc::CC3x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y0E);
    dp->::ccc::CC3x11y0::~CC3x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y0E(Test__ZN3ccc8CC3x11y0E, "_ZN3ccc8CC3x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y0C1Ev();
extern void _ZN3ccc8CC3x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y0E[] = {
  NSPAIR(_ZN3ccc8CC3x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y0E[];
extern void _ZN3ccc8CC3x11y03efgEv();
extern void _ZN3ccc8CC3x11y03pqrEv();
extern void _ZN3ccc8CC3x11y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y03pqrEv,_ZThn4_N3ccc8CC3x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y03efgEv,_ZThn4_N3ccc8CC3x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y03pqrEv,_ZThn4_N3ccc8CC3x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y03efgEv,_ZThn4_N3ccc8CC3x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y0E[];
Class_Descriptor cd__ZN3ccc8CC3x11y0E = {  "_ZN3ccc8CC3x11y0E", // class name
  bases__ZN3ccc8CC3x11y0E, 2,
  &(vtc__ZN3ccc8CC3x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y1  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x11y13efgEv
  ~CC3x11y1(); // tgen
  CC3x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y1E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y13abcEv");}
void  ccc::CC3x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y13pqrEv");}
void  ccc::CC3x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y13efgEv");}
ccc::CC3x11y1 ::~CC3x11y1(){ note_dtor("_ZN3ccc8CC3x11y1E", this);} // tgen
ccc::CC3x11y1 ::CC3x11y1(){ note_ctor("_ZN3ccc8CC3x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y1E, buf);
    ::ccc::CC3x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y1E);
    dp->::ccc::CC3x11y1::~CC3x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y1E(Test__ZN3ccc8CC3x11y1E, "_ZN3ccc8CC3x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y1C1Ev();
extern void _ZN3ccc8CC3x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y1E[] = {
  NSPAIR(_ZN3ccc8CC3x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y1E[];
extern void _ZN3ccc8CC3x11y13efgEv();
extern void _ZN3ccc8CC3x11y13pqrEv();
extern void _ZN3ccc8CC3x11y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y13pqrEv,_ZThn4_N3ccc8CC3x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y13efgEv,_ZThn4_N3ccc8CC3x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y13pqrEv,_ZThn4_N3ccc8CC3x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y13efgEv,_ZThn4_N3ccc8CC3x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y1E[];
Class_Descriptor cd__ZN3ccc8CC3x11y1E = {  "_ZN3ccc8CC3x11y1E", // class name
  bases__ZN3ccc8CC3x11y1E, 2,
  &(vtc__ZN3ccc8CC3x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y2  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y23pqrEv
  ~CC3x11y2(); // tgen
  CC3x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y2E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y23efgEv");}
void  ccc::CC3x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y23abcEv");}
void  ccc::CC3x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y23pqrEv");}
ccc::CC3x11y2 ::~CC3x11y2(){ note_dtor("_ZN3ccc8CC3x11y2E", this);} // tgen
ccc::CC3x11y2 ::CC3x11y2(){ note_ctor("_ZN3ccc8CC3x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y2E, buf);
    ::ccc::CC3x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y2E);
    dp->::ccc::CC3x11y2::~CC3x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y2E(Test__ZN3ccc8CC3x11y2E, "_ZN3ccc8CC3x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y2C1Ev();
extern void _ZN3ccc8CC3x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y2E[] = {
  NSPAIR(_ZN3ccc8CC3x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y2E[];
extern void _ZN3ccc8CC3x11y23efgEv();
extern void _ZN3ccc8CC3x11y23pqrEv();
extern void _ZN3ccc8CC3x11y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y23pqrEv,_ZThn4_N3ccc8CC3x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y23efgEv,_ZThn4_N3ccc8CC3x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y23pqrEv,_ZThn4_N3ccc8CC3x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y23efgEv,_ZThn4_N3ccc8CC3x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y2E[];
Class_Descriptor cd__ZN3ccc8CC3x11y2E = {  "_ZN3ccc8CC3x11y2E", // class name
  bases__ZN3ccc8CC3x11y2E, 2,
  &(vtc__ZN3ccc8CC3x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y3  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x11y33abcEv
  ~CC3x11y3(); // tgen
  CC3x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y3E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y33efgEv");}
void  ccc::CC3x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y33pqrEv");}
void  ccc::CC3x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y33abcEv");}
ccc::CC3x11y3 ::~CC3x11y3(){ note_dtor("_ZN3ccc8CC3x11y3E", this);} // tgen
ccc::CC3x11y3 ::CC3x11y3(){ note_ctor("_ZN3ccc8CC3x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y3E, buf);
    ::ccc::CC3x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y3E);
    dp->::ccc::CC3x11y3::~CC3x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y3E(Test__ZN3ccc8CC3x11y3E, "_ZN3ccc8CC3x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y3C1Ev();
extern void _ZN3ccc8CC3x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y3E[] = {
  NSPAIR(_ZN3ccc8CC3x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y3E[];
extern void _ZN3ccc8CC3x11y33efgEv();
extern void _ZN3ccc8CC3x11y33pqrEv();
extern void _ZN3ccc8CC3x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y33pqrEv,_ZThn4_N3ccc8CC3x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y33efgEv,_ZThn4_N3ccc8CC3x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y33pqrEv,_ZThn4_N3ccc8CC3x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y33efgEv,_ZThn4_N3ccc8CC3x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y3E[];
Class_Descriptor cd__ZN3ccc8CC3x11y3E = {  "_ZN3ccc8CC3x11y3E", // class name
  bases__ZN3ccc8CC3x11y3E, 2,
  &(vtc__ZN3ccc8CC3x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y4  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC3x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y43efgEv
  ~CC3x11y4(); // tgen
  CC3x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y4E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y43pqrEv");}
void  ccc::CC3x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y43abcEv");}
void  ccc::CC3x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y43efgEv");}
ccc::CC3x11y4 ::~CC3x11y4(){ note_dtor("_ZN3ccc8CC3x11y4E", this);} // tgen
ccc::CC3x11y4 ::CC3x11y4(){ note_ctor("_ZN3ccc8CC3x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y4E, buf);
    ::ccc::CC3x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y4E);
    dp->::ccc::CC3x11y4::~CC3x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y4E(Test__ZN3ccc8CC3x11y4E, "_ZN3ccc8CC3x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y4C1Ev();
extern void _ZN3ccc8CC3x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y4E[] = {
  NSPAIR(_ZN3ccc8CC3x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y4E[];
extern void _ZN3ccc8CC3x11y43efgEv();
extern void _ZN3ccc8CC3x11y43pqrEv();
extern void _ZN3ccc8CC3x11y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y43pqrEv,_ZThn4_N3ccc8CC3x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y43efgEv,_ZThn4_N3ccc8CC3x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y43pqrEv,_ZThn4_N3ccc8CC3x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y43efgEv,_ZThn4_N3ccc8CC3x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y4E[];
Class_Descriptor cd__ZN3ccc8CC3x11y4E = {  "_ZN3ccc8CC3x11y4E", // class name
  bases__ZN3ccc8CC3x11y4E, 2,
  &(vtc__ZN3ccc8CC3x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y5  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC3x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y53abcEv
  ~CC3x11y5(); // tgen
  CC3x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y5E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y53pqrEv");}
void  ccc::CC3x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y53efgEv");}
void  ccc::CC3x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y53abcEv");}
ccc::CC3x11y5 ::~CC3x11y5(){ note_dtor("_ZN3ccc8CC3x11y5E", this);} // tgen
ccc::CC3x11y5 ::CC3x11y5(){ note_ctor("_ZN3ccc8CC3x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y5E, buf);
    ::ccc::CC3x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y5E);
    dp->::ccc::CC3x11y5::~CC3x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y5E(Test__ZN3ccc8CC3x11y5E, "_ZN3ccc8CC3x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y5C1Ev();
extern void _ZN3ccc8CC3x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y5E[] = {
  NSPAIR(_ZN3ccc8CC3x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y5E[];
extern void _ZN3ccc8CC3x11y53efgEv();
extern void _ZN3ccc8CC3x11y53pqrEv();
extern void _ZN3ccc8CC3x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y53pqrEv,_ZThn4_N3ccc8CC3x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y53efgEv,_ZThn4_N3ccc8CC3x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y53pqrEv,_ZThn4_N3ccc8CC3x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y53efgEv,_ZThn4_N3ccc8CC3x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y5E[];
Class_Descriptor cd__ZN3ccc8CC3x11y5E = {  "_ZN3ccc8CC3x11y5E", // class name
  bases__ZN3ccc8CC3x11y5E, 2,
  &(vtc__ZN3ccc8CC3x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y6  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x11y63efgEv
  ~CC3x11y6(); // tgen
  CC3x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y6E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y63abcEv");}
void  ccc::CC3x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y63efgEv");}
ccc::CC3x11y6 ::~CC3x11y6(){ note_dtor("_ZN3ccc8CC3x11y6E", this);} // tgen
ccc::CC3x11y6 ::CC3x11y6(){ note_ctor("_ZN3ccc8CC3x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y6E, buf);
    ::ccc::CC3x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y6E);
    dp->::ccc::CC3x11y6::~CC3x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y6E(Test__ZN3ccc8CC3x11y6E, "_ZN3ccc8CC3x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y6C1Ev();
extern void _ZN3ccc8CC3x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y6E[] = {
  NSPAIR(_ZN3ccc8CC3x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y6E[];
extern void _ZN3ccc8CC3x11y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y63efgEv,_ZThn4_N3ccc8CC3x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y63efgEv,_ZThn4_N3ccc8CC3x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y6E[];
Class_Descriptor cd__ZN3ccc8CC3x11y6E = {  "_ZN3ccc8CC3x11y6E", // class name
  bases__ZN3ccc8CC3x11y6E, 2,
  &(vtc__ZN3ccc8CC3x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y7  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC3x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y73pqrEv
  ~CC3x11y7(); // tgen
  CC3x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y7E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y73abcEv");}
void  ccc::CC3x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y73pqrEv");}
ccc::CC3x11y7 ::~CC3x11y7(){ note_dtor("_ZN3ccc8CC3x11y7E", this);} // tgen
ccc::CC3x11y7 ::CC3x11y7(){ note_ctor("_ZN3ccc8CC3x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y7E, buf);
    ::ccc::CC3x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y7E);
    dp->::ccc::CC3x11y7::~CC3x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y7E(Test__ZN3ccc8CC3x11y7E, "_ZN3ccc8CC3x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y7C1Ev();
extern void _ZN3ccc8CC3x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y7E[] = {
  NSPAIR(_ZN3ccc8CC3x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x11y73pqrEv();
extern void _ZN3ccc8CC3x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y73pqrEv,_ZThn4_N3ccc8CC3x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y73pqrEv,_ZThn4_N3ccc8CC3x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y7E[];
Class_Descriptor cd__ZN3ccc8CC3x11y7E = {  "_ZN3ccc8CC3x11y7E", // class name
  bases__ZN3ccc8CC3x11y7E, 2,
  &(vtc__ZN3ccc8CC3x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y8  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x11y83abcEv
  ~CC3x11y8(); // tgen
  CC3x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y8E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y83efgEv");}
void  ccc::CC3x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x11y83abcEv");}
ccc::CC3x11y8 ::~CC3x11y8(){ note_dtor("_ZN3ccc8CC3x11y8E", this);} // tgen
ccc::CC3x11y8 ::CC3x11y8(){ note_ctor("_ZN3ccc8CC3x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y8E, buf);
    ::ccc::CC3x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y8E);
    dp->::ccc::CC3x11y8::~CC3x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y8E(Test__ZN3ccc8CC3x11y8E, "_ZN3ccc8CC3x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y8C1Ev();
extern void _ZN3ccc8CC3x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y8E[] = {
  NSPAIR(_ZN3ccc8CC3x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y8E[];
extern void _ZN3ccc8CC3x11y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y83efgEv,_ZThn4_N3ccc8CC3x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y83efgEv,_ZThn4_N3ccc8CC3x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y8E[];
Class_Descriptor cd__ZN3ccc8CC3x11y8E = {  "_ZN3ccc8CC3x11y8E", // class name
  bases__ZN3ccc8CC3x11y8E, 2,
  &(vtc__ZN3ccc8CC3x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y9  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC3x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x11y93pqrEv
  ~CC3x11y9(); // tgen
  CC3x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x11y9E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x11y93efgEv");}
void  ccc::CC3x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x11y93pqrEv");}
ccc::CC3x11y9 ::~CC3x11y9(){ note_dtor("_ZN3ccc8CC3x11y9E", this);} // tgen
ccc::CC3x11y9 ::CC3x11y9(){ note_ctor("_ZN3ccc8CC3x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x11y9E, buf);
    ::ccc::CC3x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x11y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC3x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x11y9E);
    dp->::ccc::CC3x11y9::~CC3x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x11y9E(Test__ZN3ccc8CC3x11y9E, "_ZN3ccc8CC3x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x11y9C1Ev();
extern void _ZN3ccc8CC3x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x11y9E[] = {
  NSPAIR(_ZN3ccc8CC3x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC3x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y9E[];
extern void _ZN3ccc8CC3x11y93efgEv();
extern void _ZN3ccc8CC3x11y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y93pqrEv,_ZThn4_N3ccc8CC3x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC3x11y93efgEv,_ZThn4_N3ccc8CC3x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y93pqrEv,_ZThn4_N3ccc8CC3x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x11y93efgEv,_ZThn4_N3ccc8CC3x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x11y9E[];
Class_Descriptor cd__ZN3ccc8CC3x11y9E = {  "_ZN3ccc8CC3x11y9E", // class name
  bases__ZN3ccc8CC3x11y9E, 2,
  &(vtc__ZN3ccc8CC3x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y10  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x11y103abcEv
  ~CC3x11y10(); // tgen
  CC3x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y10E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y103pqrEv");}
void  ccc::CC3x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x11y103abcEv");}
ccc::CC3x11y10 ::~CC3x11y10(){ note_dtor("_ZN3ccc9CC3x11y10E", this);} // tgen
ccc::CC3x11y10 ::CC3x11y10(){ note_ctor("_ZN3ccc9CC3x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y10E, buf);
    ::ccc::CC3x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y10E);
    dp->::ccc::CC3x11y10::~CC3x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y10E(Test__ZN3ccc9CC3x11y10E, "_ZN3ccc9CC3x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y10C1Ev();
extern void _ZN3ccc9CC3x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y10E[] = {
  NSPAIR(_ZN3ccc9CC3x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x11y103pqrEv();
extern void _ZN3ccc9CC3x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y103pqrEv,_ZThn4_N3ccc9CC3x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x11y103pqrEv,_ZThn4_N3ccc9CC3x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y10E[];
Class_Descriptor cd__ZN3ccc9CC3x11y10E = {  "_ZN3ccc9CC3x11y10E", // class name
  bases__ZN3ccc9CC3x11y10E, 2,
  &(vtc__ZN3ccc9CC3x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y11  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x11y113efgEv
  ~CC3x11y11(); // tgen
  CC3x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y11E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y113pqrEv");}
void  ccc::CC3x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x11y113efgEv");}
ccc::CC3x11y11 ::~CC3x11y11(){ note_dtor("_ZN3ccc9CC3x11y11E", this);} // tgen
ccc::CC3x11y11 ::CC3x11y11(){ note_ctor("_ZN3ccc9CC3x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y11E, buf);
    ::ccc::CC3x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y11E);
    dp->::ccc::CC3x11y11::~CC3x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y11E(Test__ZN3ccc9CC3x11y11E, "_ZN3ccc9CC3x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y11C1Ev();
extern void _ZN3ccc9CC3x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y11E[] = {
  NSPAIR(_ZN3ccc9CC3x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y11E[];
extern void _ZN3ccc9CC3x11y113efgEv();
extern void _ZN3ccc9CC3x11y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y113pqrEv,_ZThn4_N3ccc9CC3x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y113efgEv,_ZThn4_N3ccc9CC3x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x11y113pqrEv,_ZThn4_N3ccc9CC3x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x11y113efgEv,_ZThn4_N3ccc9CC3x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y11E[];
Class_Descriptor cd__ZN3ccc9CC3x11y11E = {  "_ZN3ccc9CC3x11y11E", // class name
  bases__ZN3ccc9CC3x11y11E, 2,
  &(vtc__ZN3ccc9CC3x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y12  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC3x11y123abcEv
  ~CC3x11y12(); // tgen
  CC3x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC3x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x11y123abcEv");}
ccc::CC3x11y12 ::~CC3x11y12(){ note_dtor("_ZN3ccc9CC3x11y12E", this);} // tgen
ccc::CC3x11y12 ::CC3x11y12(){ note_ctor("_ZN3ccc9CC3x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y12E, buf);
    ::ccc::CC3x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y12E);
    dp->::ccc::CC3x11y12::~CC3x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y12E(Test__ZN3ccc9CC3x11y12E, "_ZN3ccc9CC3x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y12C1Ev();
extern void _ZN3ccc9CC3x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y12E[] = {
  NSPAIR(_ZN3ccc9CC3x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y12E[];
Class_Descriptor cd__ZN3ccc9CC3x11y12E = {  "_ZN3ccc9CC3x11y12E", // class name
  bases__ZN3ccc9CC3x11y12E, 2,
  &(vtc__ZN3ccc9CC3x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y13  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC3x11y133efgEv
  ~CC3x11y13(); // tgen
  CC3x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y13E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC3x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x11y133efgEv");}
ccc::CC3x11y13 ::~CC3x11y13(){ note_dtor("_ZN3ccc9CC3x11y13E", this);} // tgen
ccc::CC3x11y13 ::CC3x11y13(){ note_ctor("_ZN3ccc9CC3x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y13E, buf);
    ::ccc::CC3x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y13E);
    dp->::ccc::CC3x11y13::~CC3x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y13E(Test__ZN3ccc9CC3x11y13E, "_ZN3ccc9CC3x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y13C1Ev();
extern void _ZN3ccc9CC3x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y13E[] = {
  NSPAIR(_ZN3ccc9CC3x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y13E[];
extern void _ZN3ccc9CC3x11y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y133efgEv,_ZThn4_N3ccc9CC3x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x11y133efgEv,_ZThn4_N3ccc9CC3x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y13E[];
Class_Descriptor cd__ZN3ccc9CC3x11y13E = {  "_ZN3ccc9CC3x11y13E", // class name
  bases__ZN3ccc9CC3x11y13E, 2,
  &(vtc__ZN3ccc9CC3x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y14  : ::ccc::AA3 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC3x11y143pqrEv
  ~CC3x11y14(); // tgen
  CC3x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y14E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC3x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x11y143pqrEv");}
ccc::CC3x11y14 ::~CC3x11y14(){ note_dtor("_ZN3ccc9CC3x11y14E", this);} // tgen
ccc::CC3x11y14 ::CC3x11y14(){ note_ctor("_ZN3ccc9CC3x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y14E, buf);
    ::ccc::CC3x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y14E);
    dp->::ccc::CC3x11y14::~CC3x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y14E(Test__ZN3ccc9CC3x11y14E, "_ZN3ccc9CC3x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y14C1Ev();
extern void _ZN3ccc9CC3x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y14E[] = {
  NSPAIR(_ZN3ccc9CC3x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x11y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x11y143pqrEv,_ZThn4_N3ccc9CC3x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x11y143pqrEv,_ZThn4_N3ccc9CC3x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y14E[];
Class_Descriptor cd__ZN3ccc9CC3x11y14E = {  "_ZN3ccc9CC3x11y14E", // class name
  bases__ZN3ccc9CC3x11y14E, 2,
  &(vtc__ZN3ccc9CC3x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x11y15  : ::ccc::AA3 , ::ccc::BB11 {
  ~CC3x11y15(); // tgen
  CC3x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x11y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC3x11y15 ::~CC3x11y15(){ note_dtor("_ZN3ccc9CC3x11y15E", this);} // tgen
ccc::CC3x11y15 ::CC3x11y15(){ note_ctor("_ZN3ccc9CC3x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x11y15E, buf);
    ::ccc::CC3x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x11y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC3x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x11y15E);
    dp->::ccc::CC3x11y15::~CC3x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x11y15E(Test__ZN3ccc9CC3x11y15E, "_ZN3ccc9CC3x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x11y15C1Ev();
extern void _ZN3ccc9CC3x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x11y15E[] = {
  NSPAIR(_ZN3ccc9CC3x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC3x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x11y15E[];
Class_Descriptor cd__ZN3ccc9CC3x11y15E = {  "_ZN3ccc9CC3x11y15E", // class name
  bases__ZN3ccc9CC3x11y15E, 2,
  &(vtc__ZN3ccc9CC3x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y0  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y03pqrEv
  ~CC3x12y0(); // tgen
  CC3x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y0E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y03abcEv");}
void  ccc::CC3x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y03efgEv");}
void  ccc::CC3x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y03pqrEv");}
ccc::CC3x12y0 ::~CC3x12y0(){ note_dtor("_ZN3ccc8CC3x12y0E", this);} // tgen
ccc::CC3x12y0 ::CC3x12y0(){ note_ctor("_ZN3ccc8CC3x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y0E, buf);
    ::ccc::CC3x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y0E);
    dp->::ccc::CC3x12y0::~CC3x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y0E(Test__ZN3ccc8CC3x12y0E, "_ZN3ccc8CC3x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y0C1Ev();
extern void _ZN3ccc8CC3x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y0E[] = {
  NSPAIR(_ZN3ccc8CC3x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y0E[];
extern void _ZN3ccc8CC3x12y03efgEv();
extern void _ZN3ccc8CC3x12y03pqrEv();
extern void _ZN3ccc8CC3x12y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y03abcEv,_ZThn4_N3ccc8CC3x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y03abcEv,_ZThn4_N3ccc8CC3x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y0E[];
Class_Descriptor cd__ZN3ccc8CC3x12y0E = {  "_ZN3ccc8CC3x12y0E", // class name
  bases__ZN3ccc8CC3x12y0E, 2,
  &(vtc__ZN3ccc8CC3x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y1  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x12y13efgEv
  ~CC3x12y1(); // tgen
  CC3x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y1E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y13abcEv");}
void  ccc::CC3x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y13pqrEv");}
void  ccc::CC3x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y13efgEv");}
ccc::CC3x12y1 ::~CC3x12y1(){ note_dtor("_ZN3ccc8CC3x12y1E", this);} // tgen
ccc::CC3x12y1 ::CC3x12y1(){ note_ctor("_ZN3ccc8CC3x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y1E, buf);
    ::ccc::CC3x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y1E);
    dp->::ccc::CC3x12y1::~CC3x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y1E(Test__ZN3ccc8CC3x12y1E, "_ZN3ccc8CC3x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y1C1Ev();
extern void _ZN3ccc8CC3x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y1E[] = {
  NSPAIR(_ZN3ccc8CC3x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y1E[];
extern void _ZN3ccc8CC3x12y13efgEv();
extern void _ZN3ccc8CC3x12y13pqrEv();
extern void _ZN3ccc8CC3x12y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y13abcEv,_ZThn4_N3ccc8CC3x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y13abcEv,_ZThn4_N3ccc8CC3x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y1E[];
Class_Descriptor cd__ZN3ccc8CC3x12y1E = {  "_ZN3ccc8CC3x12y1E", // class name
  bases__ZN3ccc8CC3x12y1E, 2,
  &(vtc__ZN3ccc8CC3x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y2  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y23pqrEv
  ~CC3x12y2(); // tgen
  CC3x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y2E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y23efgEv");}
void  ccc::CC3x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y23abcEv");}
void  ccc::CC3x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y23pqrEv");}
ccc::CC3x12y2 ::~CC3x12y2(){ note_dtor("_ZN3ccc8CC3x12y2E", this);} // tgen
ccc::CC3x12y2 ::CC3x12y2(){ note_ctor("_ZN3ccc8CC3x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y2E, buf);
    ::ccc::CC3x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y2E);
    dp->::ccc::CC3x12y2::~CC3x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y2E(Test__ZN3ccc8CC3x12y2E, "_ZN3ccc8CC3x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y2C1Ev();
extern void _ZN3ccc8CC3x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y2E[] = {
  NSPAIR(_ZN3ccc8CC3x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y2E[];
extern void _ZN3ccc8CC3x12y23efgEv();
extern void _ZN3ccc8CC3x12y23pqrEv();
extern void _ZN3ccc8CC3x12y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y23abcEv,_ZThn4_N3ccc8CC3x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y23abcEv,_ZThn4_N3ccc8CC3x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y2E[];
Class_Descriptor cd__ZN3ccc8CC3x12y2E = {  "_ZN3ccc8CC3x12y2E", // class name
  bases__ZN3ccc8CC3x12y2E, 2,
  &(vtc__ZN3ccc8CC3x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y3  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x12y33abcEv
  ~CC3x12y3(); // tgen
  CC3x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y3E) C1{ BC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y33efgEv");}
void  ccc::CC3x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y33pqrEv");}
void  ccc::CC3x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y33abcEv");}
ccc::CC3x12y3 ::~CC3x12y3(){ note_dtor("_ZN3ccc8CC3x12y3E", this);} // tgen
ccc::CC3x12y3 ::CC3x12y3(){ note_ctor("_ZN3ccc8CC3x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y3E, buf);
    ::ccc::CC3x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y3E);
    dp->::ccc::CC3x12y3::~CC3x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y3E(Test__ZN3ccc8CC3x12y3E, "_ZN3ccc8CC3x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y3C1Ev();
extern void _ZN3ccc8CC3x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y3E[] = {
  NSPAIR(_ZN3ccc8CC3x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y3E[];
extern void _ZN3ccc8CC3x12y33efgEv();
extern void _ZN3ccc8CC3x12y33pqrEv();
extern void _ZN3ccc8CC3x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y33abcEv,_ZThn4_N3ccc8CC3x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y33abcEv,_ZThn4_N3ccc8CC3x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y3E[];
Class_Descriptor cd__ZN3ccc8CC3x12y3E = {  "_ZN3ccc8CC3x12y3E", // class name
  bases__ZN3ccc8CC3x12y3E, 2,
  &(vtc__ZN3ccc8CC3x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y4  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC3x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y43efgEv
  ~CC3x12y4(); // tgen
  CC3x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y4E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y43pqrEv");}
void  ccc::CC3x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y43abcEv");}
void  ccc::CC3x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y43efgEv");}
ccc::CC3x12y4 ::~CC3x12y4(){ note_dtor("_ZN3ccc8CC3x12y4E", this);} // tgen
ccc::CC3x12y4 ::CC3x12y4(){ note_ctor("_ZN3ccc8CC3x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y4E, buf);
    ::ccc::CC3x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y4E);
    dp->::ccc::CC3x12y4::~CC3x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y4E(Test__ZN3ccc8CC3x12y4E, "_ZN3ccc8CC3x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y4C1Ev();
extern void _ZN3ccc8CC3x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y4E[] = {
  NSPAIR(_ZN3ccc8CC3x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y4E[];
extern void _ZN3ccc8CC3x12y43efgEv();
extern void _ZN3ccc8CC3x12y43pqrEv();
extern void _ZN3ccc8CC3x12y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y43abcEv,_ZThn4_N3ccc8CC3x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y43abcEv,_ZThn4_N3ccc8CC3x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y4E[];
Class_Descriptor cd__ZN3ccc8CC3x12y4E = {  "_ZN3ccc8CC3x12y4E", // class name
  bases__ZN3ccc8CC3x12y4E, 2,
  &(vtc__ZN3ccc8CC3x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y5  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC3x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y53abcEv
  ~CC3x12y5(); // tgen
  CC3x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y5E) C1{ BC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y53pqrEv");}
void  ccc::CC3x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y53efgEv");}
void  ccc::CC3x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y53abcEv");}
ccc::CC3x12y5 ::~CC3x12y5(){ note_dtor("_ZN3ccc8CC3x12y5E", this);} // tgen
ccc::CC3x12y5 ::CC3x12y5(){ note_ctor("_ZN3ccc8CC3x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y5E, buf);
    ::ccc::CC3x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y5E);
    dp->::ccc::CC3x12y5::~CC3x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y5E(Test__ZN3ccc8CC3x12y5E, "_ZN3ccc8CC3x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y5C1Ev();
extern void _ZN3ccc8CC3x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y5E[] = {
  NSPAIR(_ZN3ccc8CC3x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y5E[];
extern void _ZN3ccc8CC3x12y53efgEv();
extern void _ZN3ccc8CC3x12y53pqrEv();
extern void _ZN3ccc8CC3x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y53abcEv,_ZThn4_N3ccc8CC3x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y53abcEv,_ZThn4_N3ccc8CC3x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y5E[];
Class_Descriptor cd__ZN3ccc8CC3x12y5E = {  "_ZN3ccc8CC3x12y5E", // class name
  bases__ZN3ccc8CC3x12y5E, 2,
  &(vtc__ZN3ccc8CC3x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y6  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x12y63efgEv
  ~CC3x12y6(); // tgen
  CC3x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y6E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y63abcEv");}
void  ccc::CC3x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y63efgEv");}
ccc::CC3x12y6 ::~CC3x12y6(){ note_dtor("_ZN3ccc8CC3x12y6E", this);} // tgen
ccc::CC3x12y6 ::CC3x12y6(){ note_ctor("_ZN3ccc8CC3x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y6E, buf);
    ::ccc::CC3x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y6E);
    dp->::ccc::CC3x12y6::~CC3x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y6E(Test__ZN3ccc8CC3x12y6E, "_ZN3ccc8CC3x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y6C1Ev();
extern void _ZN3ccc8CC3x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y6E[] = {
  NSPAIR(_ZN3ccc8CC3x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y6E[];
extern void _ZN3ccc8CC3x12y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y63abcEv,_ZThn4_N3ccc8CC3x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y63abcEv,_ZThn4_N3ccc8CC3x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y6E[];
Class_Descriptor cd__ZN3ccc8CC3x12y6E = {  "_ZN3ccc8CC3x12y6E", // class name
  bases__ZN3ccc8CC3x12y6E, 2,
  &(vtc__ZN3ccc8CC3x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y7  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC3x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y73pqrEv
  ~CC3x12y7(); // tgen
  CC3x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y7E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y73abcEv");}
void  ccc::CC3x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y73pqrEv");}
ccc::CC3x12y7 ::~CC3x12y7(){ note_dtor("_ZN3ccc8CC3x12y7E", this);} // tgen
ccc::CC3x12y7 ::CC3x12y7(){ note_ctor("_ZN3ccc8CC3x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y7E, buf);
    ::ccc::CC3x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y7E);
    dp->::ccc::CC3x12y7::~CC3x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y7E(Test__ZN3ccc8CC3x12y7E, "_ZN3ccc8CC3x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y7C1Ev();
extern void _ZN3ccc8CC3x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y7E[] = {
  NSPAIR(_ZN3ccc8CC3x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x12y73pqrEv();
extern void _ZN3ccc8CC3x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y73abcEv,_ZThn4_N3ccc8CC3x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y73abcEv,_ZThn4_N3ccc8CC3x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y7E[];
Class_Descriptor cd__ZN3ccc8CC3x12y7E = {  "_ZN3ccc8CC3x12y7E", // class name
  bases__ZN3ccc8CC3x12y7E, 2,
  &(vtc__ZN3ccc8CC3x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y8  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x12y83abcEv
  ~CC3x12y8(); // tgen
  CC3x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y8E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y83efgEv");}
void  ccc::CC3x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x12y83abcEv");}
ccc::CC3x12y8 ::~CC3x12y8(){ note_dtor("_ZN3ccc8CC3x12y8E", this);} // tgen
ccc::CC3x12y8 ::CC3x12y8(){ note_ctor("_ZN3ccc8CC3x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y8E, buf);
    ::ccc::CC3x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y8E);
    dp->::ccc::CC3x12y8::~CC3x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y8E(Test__ZN3ccc8CC3x12y8E, "_ZN3ccc8CC3x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y8C1Ev();
extern void _ZN3ccc8CC3x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y8E[] = {
  NSPAIR(_ZN3ccc8CC3x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y8E[];
extern void _ZN3ccc8CC3x12y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x12y83abcEv,_ZThn4_N3ccc8CC3x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x12y83abcEv,_ZThn4_N3ccc8CC3x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y8E[];
Class_Descriptor cd__ZN3ccc8CC3x12y8E = {  "_ZN3ccc8CC3x12y8E", // class name
  bases__ZN3ccc8CC3x12y8E, 2,
  &(vtc__ZN3ccc8CC3x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y9  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC3x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x12y93pqrEv
  ~CC3x12y9(); // tgen
  CC3x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x12y9E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x12y93efgEv");}
void  ccc::CC3x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x12y93pqrEv");}
ccc::CC3x12y9 ::~CC3x12y9(){ note_dtor("_ZN3ccc8CC3x12y9E", this);} // tgen
ccc::CC3x12y9 ::CC3x12y9(){ note_ctor("_ZN3ccc8CC3x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x12y9E, buf);
    ::ccc::CC3x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x12y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC3x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x12y9E);
    dp->::ccc::CC3x12y9::~CC3x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x12y9E(Test__ZN3ccc8CC3x12y9E, "_ZN3ccc8CC3x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x12y9C1Ev();
extern void _ZN3ccc8CC3x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x12y9E[] = {
  NSPAIR(_ZN3ccc8CC3x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC3x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y9E[];
extern void _ZN3ccc8CC3x12y93efgEv();
extern void _ZN3ccc8CC3x12y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x12y9E[];
Class_Descriptor cd__ZN3ccc8CC3x12y9E = {  "_ZN3ccc8CC3x12y9E", // class name
  bases__ZN3ccc8CC3x12y9E, 2,
  &(vtc__ZN3ccc8CC3x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y10  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x12y103abcEv
  ~CC3x12y10(); // tgen
  CC3x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y10E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y103pqrEv");}
void  ccc::CC3x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x12y103abcEv");}
ccc::CC3x12y10 ::~CC3x12y10(){ note_dtor("_ZN3ccc9CC3x12y10E", this);} // tgen
ccc::CC3x12y10 ::CC3x12y10(){ note_ctor("_ZN3ccc9CC3x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y10E, buf);
    ::ccc::CC3x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y10E);
    dp->::ccc::CC3x12y10::~CC3x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y10E(Test__ZN3ccc9CC3x12y10E, "_ZN3ccc9CC3x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y10C1Ev();
extern void _ZN3ccc9CC3x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y10E[] = {
  NSPAIR(_ZN3ccc9CC3x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x12y103pqrEv();
extern void _ZN3ccc9CC3x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y103abcEv,_ZThn4_N3ccc9CC3x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x12y103abcEv,_ZThn4_N3ccc9CC3x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y10E[];
Class_Descriptor cd__ZN3ccc9CC3x12y10E = {  "_ZN3ccc9CC3x12y10E", // class name
  bases__ZN3ccc9CC3x12y10E, 2,
  &(vtc__ZN3ccc9CC3x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y11  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x12y113efgEv
  ~CC3x12y11(); // tgen
  CC3x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y11E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y113pqrEv");}
void  ccc::CC3x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x12y113efgEv");}
ccc::CC3x12y11 ::~CC3x12y11(){ note_dtor("_ZN3ccc9CC3x12y11E", this);} // tgen
ccc::CC3x12y11 ::CC3x12y11(){ note_ctor("_ZN3ccc9CC3x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y11E, buf);
    ::ccc::CC3x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y11E);
    dp->::ccc::CC3x12y11::~CC3x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y11E(Test__ZN3ccc9CC3x12y11E, "_ZN3ccc9CC3x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y11C1Ev();
extern void _ZN3ccc9CC3x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y11E[] = {
  NSPAIR(_ZN3ccc9CC3x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y11E[];
extern void _ZN3ccc9CC3x12y113efgEv();
extern void _ZN3ccc9CC3x12y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y11E[];
Class_Descriptor cd__ZN3ccc9CC3x12y11E = {  "_ZN3ccc9CC3x12y11E", // class name
  bases__ZN3ccc9CC3x12y11E, 2,
  &(vtc__ZN3ccc9CC3x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y12  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC3x12y123abcEv
  ~CC3x12y12(); // tgen
  CC3x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y12E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x12y123abcEv");}
ccc::CC3x12y12 ::~CC3x12y12(){ note_dtor("_ZN3ccc9CC3x12y12E", this);} // tgen
ccc::CC3x12y12 ::CC3x12y12(){ note_ctor("_ZN3ccc9CC3x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y12E, buf);
    ::ccc::CC3x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y12E);
    dp->::ccc::CC3x12y12::~CC3x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y12E(Test__ZN3ccc9CC3x12y12E, "_ZN3ccc9CC3x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y12C1Ev();
extern void _ZN3ccc9CC3x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y12E[] = {
  NSPAIR(_ZN3ccc9CC3x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x12y123abcEv,_ZThn4_N3ccc9CC3x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x12y123abcEv,_ZThn4_N3ccc9CC3x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y12E[];
Class_Descriptor cd__ZN3ccc9CC3x12y12E = {  "_ZN3ccc9CC3x12y12E", // class name
  bases__ZN3ccc9CC3x12y12E, 2,
  &(vtc__ZN3ccc9CC3x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y13  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC3x12y133efgEv
  ~CC3x12y13(); // tgen
  CC3x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y13E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x12y133efgEv");}
ccc::CC3x12y13 ::~CC3x12y13(){ note_dtor("_ZN3ccc9CC3x12y13E", this);} // tgen
ccc::CC3x12y13 ::CC3x12y13(){ note_ctor("_ZN3ccc9CC3x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y13E, buf);
    ::ccc::CC3x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y13E);
    dp->::ccc::CC3x12y13::~CC3x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y13E(Test__ZN3ccc9CC3x12y13E, "_ZN3ccc9CC3x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y13C1Ev();
extern void _ZN3ccc9CC3x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y13E[] = {
  NSPAIR(_ZN3ccc9CC3x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y13E[];
extern void _ZN3ccc9CC3x12y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y13E[];
Class_Descriptor cd__ZN3ccc9CC3x12y13E = {  "_ZN3ccc9CC3x12y13E", // class name
  bases__ZN3ccc9CC3x12y13E, 2,
  &(vtc__ZN3ccc9CC3x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y14  : ::ccc::AA3 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC3x12y143pqrEv
  ~CC3x12y14(); // tgen
  CC3x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y14E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x12y143pqrEv");}
ccc::CC3x12y14 ::~CC3x12y14(){ note_dtor("_ZN3ccc9CC3x12y14E", this);} // tgen
ccc::CC3x12y14 ::CC3x12y14(){ note_ctor("_ZN3ccc9CC3x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y14E, buf);
    ::ccc::CC3x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y14E);
    dp->::ccc::CC3x12y14::~CC3x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y14E(Test__ZN3ccc9CC3x12y14E, "_ZN3ccc9CC3x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y14C1Ev();
extern void _ZN3ccc9CC3x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y14E[] = {
  NSPAIR(_ZN3ccc9CC3x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x12y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y14E[];
Class_Descriptor cd__ZN3ccc9CC3x12y14E = {  "_ZN3ccc9CC3x12y14E", // class name
  bases__ZN3ccc9CC3x12y14E, 2,
  &(vtc__ZN3ccc9CC3x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x12y15  : ::ccc::AA3 , ::ccc::BB12 {
  ~CC3x12y15(); // tgen
  CC3x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x12y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x12y15 ::~CC3x12y15(){ note_dtor("_ZN3ccc9CC3x12y15E", this);} // tgen
ccc::CC3x12y15 ::CC3x12y15(){ note_ctor("_ZN3ccc9CC3x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x12y15E, buf);
    ::ccc::CC3x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x12y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC3x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x12y15E);
    dp->::ccc::CC3x12y15::~CC3x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x12y15E(Test__ZN3ccc9CC3x12y15E, "_ZN3ccc9CC3x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x12y15C1Ev();
extern void _ZN3ccc9CC3x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x12y15E[] = {
  NSPAIR(_ZN3ccc9CC3x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC3x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x12y15E[];
Class_Descriptor cd__ZN3ccc9CC3x12y15E = {  "_ZN3ccc9CC3x12y15E", // class name
  bases__ZN3ccc9CC3x12y15E, 2,
  &(vtc__ZN3ccc9CC3x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y0  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y03pqrEv
  ~CC3x13y0(); // tgen
  CC3x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y0E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y03abcEv");}
void  ccc::CC3x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y03efgEv");}
void  ccc::CC3x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y03pqrEv");}
ccc::CC3x13y0 ::~CC3x13y0(){ note_dtor("_ZN3ccc8CC3x13y0E", this);} // tgen
ccc::CC3x13y0 ::CC3x13y0(){ note_ctor("_ZN3ccc8CC3x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y0E, buf);
    ::ccc::CC3x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y0E);
    dp->::ccc::CC3x13y0::~CC3x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y0E(Test__ZN3ccc8CC3x13y0E, "_ZN3ccc8CC3x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y0C1Ev();
extern void _ZN3ccc8CC3x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y0E[] = {
  NSPAIR(_ZN3ccc8CC3x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y0E[];
extern void _ZN3ccc8CC3x13y03efgEv();
extern void _ZN3ccc8CC3x13y03pqrEv();
extern void _ZN3ccc8CC3x13y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y03efgEv,_ZThn4_N3ccc8CC3x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y03efgEv,_ZThn4_N3ccc8CC3x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y0E[];
Class_Descriptor cd__ZN3ccc8CC3x13y0E = {  "_ZN3ccc8CC3x13y0E", // class name
  bases__ZN3ccc8CC3x13y0E, 2,
  &(vtc__ZN3ccc8CC3x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y1  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x13y13efgEv
  ~CC3x13y1(); // tgen
  CC3x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y1E) C1{ BC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y13abcEv");}
void  ccc::CC3x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y13pqrEv");}
void  ccc::CC3x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y13efgEv");}
ccc::CC3x13y1 ::~CC3x13y1(){ note_dtor("_ZN3ccc8CC3x13y1E", this);} // tgen
ccc::CC3x13y1 ::CC3x13y1(){ note_ctor("_ZN3ccc8CC3x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y1E, buf);
    ::ccc::CC3x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y1E);
    dp->::ccc::CC3x13y1::~CC3x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y1E(Test__ZN3ccc8CC3x13y1E, "_ZN3ccc8CC3x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y1C1Ev();
extern void _ZN3ccc8CC3x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y1E[] = {
  NSPAIR(_ZN3ccc8CC3x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y1E[];
extern void _ZN3ccc8CC3x13y13efgEv();
extern void _ZN3ccc8CC3x13y13pqrEv();
extern void _ZN3ccc8CC3x13y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y13efgEv,_ZThn4_N3ccc8CC3x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y13efgEv,_ZThn4_N3ccc8CC3x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y1E[];
Class_Descriptor cd__ZN3ccc8CC3x13y1E = {  "_ZN3ccc8CC3x13y1E", // class name
  bases__ZN3ccc8CC3x13y1E, 2,
  &(vtc__ZN3ccc8CC3x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y2  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y23pqrEv
  ~CC3x13y2(); // tgen
  CC3x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y2E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y23efgEv");}
void  ccc::CC3x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y23abcEv");}
void  ccc::CC3x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y23pqrEv");}
ccc::CC3x13y2 ::~CC3x13y2(){ note_dtor("_ZN3ccc8CC3x13y2E", this);} // tgen
ccc::CC3x13y2 ::CC3x13y2(){ note_ctor("_ZN3ccc8CC3x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y2E, buf);
    ::ccc::CC3x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y2E);
    dp->::ccc::CC3x13y2::~CC3x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y2E(Test__ZN3ccc8CC3x13y2E, "_ZN3ccc8CC3x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y2C1Ev();
extern void _ZN3ccc8CC3x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y2E[] = {
  NSPAIR(_ZN3ccc8CC3x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y2E[];
extern void _ZN3ccc8CC3x13y23efgEv();
extern void _ZN3ccc8CC3x13y23pqrEv();
extern void _ZN3ccc8CC3x13y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y23efgEv,_ZThn4_N3ccc8CC3x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y23efgEv,_ZThn4_N3ccc8CC3x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y2E[];
Class_Descriptor cd__ZN3ccc8CC3x13y2E = {  "_ZN3ccc8CC3x13y2E", // class name
  bases__ZN3ccc8CC3x13y2E, 2,
  &(vtc__ZN3ccc8CC3x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y3  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x13y33abcEv
  ~CC3x13y3(); // tgen
  CC3x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y3E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y33efgEv");}
void  ccc::CC3x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y33pqrEv");}
void  ccc::CC3x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y33abcEv");}
ccc::CC3x13y3 ::~CC3x13y3(){ note_dtor("_ZN3ccc8CC3x13y3E", this);} // tgen
ccc::CC3x13y3 ::CC3x13y3(){ note_ctor("_ZN3ccc8CC3x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y3E, buf);
    ::ccc::CC3x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y3E);
    dp->::ccc::CC3x13y3::~CC3x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y3E(Test__ZN3ccc8CC3x13y3E, "_ZN3ccc8CC3x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y3C1Ev();
extern void _ZN3ccc8CC3x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y3E[] = {
  NSPAIR(_ZN3ccc8CC3x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y3E[];
extern void _ZN3ccc8CC3x13y33efgEv();
extern void _ZN3ccc8CC3x13y33pqrEv();
extern void _ZN3ccc8CC3x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y33efgEv,_ZThn4_N3ccc8CC3x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y33efgEv,_ZThn4_N3ccc8CC3x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y3E[];
Class_Descriptor cd__ZN3ccc8CC3x13y3E = {  "_ZN3ccc8CC3x13y3E", // class name
  bases__ZN3ccc8CC3x13y3E, 2,
  &(vtc__ZN3ccc8CC3x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y4  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC3x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y43efgEv
  ~CC3x13y4(); // tgen
  CC3x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y4E) C1{ BC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y43pqrEv");}
void  ccc::CC3x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y43abcEv");}
void  ccc::CC3x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y43efgEv");}
ccc::CC3x13y4 ::~CC3x13y4(){ note_dtor("_ZN3ccc8CC3x13y4E", this);} // tgen
ccc::CC3x13y4 ::CC3x13y4(){ note_ctor("_ZN3ccc8CC3x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y4E, buf);
    ::ccc::CC3x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y4E);
    dp->::ccc::CC3x13y4::~CC3x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y4E(Test__ZN3ccc8CC3x13y4E, "_ZN3ccc8CC3x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y4C1Ev();
extern void _ZN3ccc8CC3x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y4E[] = {
  NSPAIR(_ZN3ccc8CC3x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y4E[];
extern void _ZN3ccc8CC3x13y43efgEv();
extern void _ZN3ccc8CC3x13y43pqrEv();
extern void _ZN3ccc8CC3x13y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y43efgEv,_ZThn4_N3ccc8CC3x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y43efgEv,_ZThn4_N3ccc8CC3x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y4E[];
Class_Descriptor cd__ZN3ccc8CC3x13y4E = {  "_ZN3ccc8CC3x13y4E", // class name
  bases__ZN3ccc8CC3x13y4E, 2,
  &(vtc__ZN3ccc8CC3x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y5  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC3x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y53abcEv
  ~CC3x13y5(); // tgen
  CC3x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y5E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y53pqrEv");}
void  ccc::CC3x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y53efgEv");}
void  ccc::CC3x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y53abcEv");}
ccc::CC3x13y5 ::~CC3x13y5(){ note_dtor("_ZN3ccc8CC3x13y5E", this);} // tgen
ccc::CC3x13y5 ::CC3x13y5(){ note_ctor("_ZN3ccc8CC3x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y5E, buf);
    ::ccc::CC3x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y5E);
    dp->::ccc::CC3x13y5::~CC3x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y5E(Test__ZN3ccc8CC3x13y5E, "_ZN3ccc8CC3x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y5C1Ev();
extern void _ZN3ccc8CC3x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y5E[] = {
  NSPAIR(_ZN3ccc8CC3x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y5E[];
extern void _ZN3ccc8CC3x13y53efgEv();
extern void _ZN3ccc8CC3x13y53pqrEv();
extern void _ZN3ccc8CC3x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y53efgEv,_ZThn4_N3ccc8CC3x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y53efgEv,_ZThn4_N3ccc8CC3x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y5E[];
Class_Descriptor cd__ZN3ccc8CC3x13y5E = {  "_ZN3ccc8CC3x13y5E", // class name
  bases__ZN3ccc8CC3x13y5E, 2,
  &(vtc__ZN3ccc8CC3x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y6  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x13y63efgEv
  ~CC3x13y6(); // tgen
  CC3x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y6E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y63abcEv");}
void  ccc::CC3x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y63efgEv");}
ccc::CC3x13y6 ::~CC3x13y6(){ note_dtor("_ZN3ccc8CC3x13y6E", this);} // tgen
ccc::CC3x13y6 ::CC3x13y6(){ note_ctor("_ZN3ccc8CC3x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y6E, buf);
    ::ccc::CC3x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y6E);
    dp->::ccc::CC3x13y6::~CC3x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y6E(Test__ZN3ccc8CC3x13y6E, "_ZN3ccc8CC3x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y6C1Ev();
extern void _ZN3ccc8CC3x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y6E[] = {
  NSPAIR(_ZN3ccc8CC3x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y6E[];
extern void _ZN3ccc8CC3x13y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y63efgEv,_ZThn4_N3ccc8CC3x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y63efgEv,_ZThn4_N3ccc8CC3x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y6E[];
Class_Descriptor cd__ZN3ccc8CC3x13y6E = {  "_ZN3ccc8CC3x13y6E", // class name
  bases__ZN3ccc8CC3x13y6E, 2,
  &(vtc__ZN3ccc8CC3x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y7  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC3x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y73pqrEv
  ~CC3x13y7(); // tgen
  CC3x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y7E) C1{ BC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y73abcEv");}
void  ccc::CC3x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y73pqrEv");}
ccc::CC3x13y7 ::~CC3x13y7(){ note_dtor("_ZN3ccc8CC3x13y7E", this);} // tgen
ccc::CC3x13y7 ::CC3x13y7(){ note_ctor("_ZN3ccc8CC3x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y7E, buf);
    ::ccc::CC3x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y7E);
    dp->::ccc::CC3x13y7::~CC3x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y7E(Test__ZN3ccc8CC3x13y7E, "_ZN3ccc8CC3x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y7C1Ev();
extern void _ZN3ccc8CC3x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y7E[] = {
  NSPAIR(_ZN3ccc8CC3x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x13y73pqrEv();
extern void _ZN3ccc8CC3x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y7E[];
Class_Descriptor cd__ZN3ccc8CC3x13y7E = {  "_ZN3ccc8CC3x13y7E", // class name
  bases__ZN3ccc8CC3x13y7E, 2,
  &(vtc__ZN3ccc8CC3x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y8  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x13y83abcEv
  ~CC3x13y8(); // tgen
  CC3x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y8E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y83efgEv");}
void  ccc::CC3x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x13y83abcEv");}
ccc::CC3x13y8 ::~CC3x13y8(){ note_dtor("_ZN3ccc8CC3x13y8E", this);} // tgen
ccc::CC3x13y8 ::CC3x13y8(){ note_ctor("_ZN3ccc8CC3x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y8E, buf);
    ::ccc::CC3x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y8E);
    dp->::ccc::CC3x13y8::~CC3x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y8E(Test__ZN3ccc8CC3x13y8E, "_ZN3ccc8CC3x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y8C1Ev();
extern void _ZN3ccc8CC3x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y8E[] = {
  NSPAIR(_ZN3ccc8CC3x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y8E[];
extern void _ZN3ccc8CC3x13y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y83efgEv,_ZThn4_N3ccc8CC3x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y83efgEv,_ZThn4_N3ccc8CC3x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y8E[];
Class_Descriptor cd__ZN3ccc8CC3x13y8E = {  "_ZN3ccc8CC3x13y8E", // class name
  bases__ZN3ccc8CC3x13y8E, 2,
  &(vtc__ZN3ccc8CC3x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y9  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC3x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x13y93pqrEv
  ~CC3x13y9(); // tgen
  CC3x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x13y9E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x13y93efgEv");}
void  ccc::CC3x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x13y93pqrEv");}
ccc::CC3x13y9 ::~CC3x13y9(){ note_dtor("_ZN3ccc8CC3x13y9E", this);} // tgen
ccc::CC3x13y9 ::CC3x13y9(){ note_ctor("_ZN3ccc8CC3x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x13y9E, buf);
    ::ccc::CC3x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x13y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC3x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x13y9E);
    dp->::ccc::CC3x13y9::~CC3x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x13y9E(Test__ZN3ccc8CC3x13y9E, "_ZN3ccc8CC3x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x13y9C1Ev();
extern void _ZN3ccc8CC3x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x13y9E[] = {
  NSPAIR(_ZN3ccc8CC3x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC3x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y9E[];
extern void _ZN3ccc8CC3x13y93efgEv();
extern void _ZN3ccc8CC3x13y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x13y93efgEv,_ZThn4_N3ccc8CC3x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x13y93efgEv,_ZThn4_N3ccc8CC3x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x13y9E[];
Class_Descriptor cd__ZN3ccc8CC3x13y9E = {  "_ZN3ccc8CC3x13y9E", // class name
  bases__ZN3ccc8CC3x13y9E, 2,
  &(vtc__ZN3ccc8CC3x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y10  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x13y103abcEv
  ~CC3x13y10(); // tgen
  CC3x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y10E) C1{ BC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y103pqrEv");}
void  ccc::CC3x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x13y103abcEv");}
ccc::CC3x13y10 ::~CC3x13y10(){ note_dtor("_ZN3ccc9CC3x13y10E", this);} // tgen
ccc::CC3x13y10 ::CC3x13y10(){ note_ctor("_ZN3ccc9CC3x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y10E, buf);
    ::ccc::CC3x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y10E);
    dp->::ccc::CC3x13y10::~CC3x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y10E(Test__ZN3ccc9CC3x13y10E, "_ZN3ccc9CC3x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y10C1Ev();
extern void _ZN3ccc9CC3x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y10E[] = {
  NSPAIR(_ZN3ccc9CC3x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x13y103pqrEv();
extern void _ZN3ccc9CC3x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y10E[];
Class_Descriptor cd__ZN3ccc9CC3x13y10E = {  "_ZN3ccc9CC3x13y10E", // class name
  bases__ZN3ccc9CC3x13y10E, 2,
  &(vtc__ZN3ccc9CC3x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y11  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x13y113efgEv
  ~CC3x13y11(); // tgen
  CC3x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y11E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y113pqrEv");}
void  ccc::CC3x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x13y113efgEv");}
ccc::CC3x13y11 ::~CC3x13y11(){ note_dtor("_ZN3ccc9CC3x13y11E", this);} // tgen
ccc::CC3x13y11 ::CC3x13y11(){ note_ctor("_ZN3ccc9CC3x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y11E, buf);
    ::ccc::CC3x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y11E);
    dp->::ccc::CC3x13y11::~CC3x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y11E(Test__ZN3ccc9CC3x13y11E, "_ZN3ccc9CC3x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y11C1Ev();
extern void _ZN3ccc9CC3x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y11E[] = {
  NSPAIR(_ZN3ccc9CC3x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y11E[];
extern void _ZN3ccc9CC3x13y113efgEv();
extern void _ZN3ccc9CC3x13y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y113efgEv,_ZThn4_N3ccc9CC3x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x13y113efgEv,_ZThn4_N3ccc9CC3x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y11E[];
Class_Descriptor cd__ZN3ccc9CC3x13y11E = {  "_ZN3ccc9CC3x13y11E", // class name
  bases__ZN3ccc9CC3x13y11E, 2,
  &(vtc__ZN3ccc9CC3x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y12  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC3x13y123abcEv
  ~CC3x13y12(); // tgen
  CC3x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y12E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x13y123abcEv");}
ccc::CC3x13y12 ::~CC3x13y12(){ note_dtor("_ZN3ccc9CC3x13y12E", this);} // tgen
ccc::CC3x13y12 ::CC3x13y12(){ note_ctor("_ZN3ccc9CC3x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y12E, buf);
    ::ccc::CC3x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y12E);
    dp->::ccc::CC3x13y12::~CC3x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y12E(Test__ZN3ccc9CC3x13y12E, "_ZN3ccc9CC3x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y12C1Ev();
extern void _ZN3ccc9CC3x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y12E[] = {
  NSPAIR(_ZN3ccc9CC3x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y12E[];
Class_Descriptor cd__ZN3ccc9CC3x13y12E = {  "_ZN3ccc9CC3x13y12E", // class name
  bases__ZN3ccc9CC3x13y12E, 2,
  &(vtc__ZN3ccc9CC3x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y13  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC3x13y133efgEv
  ~CC3x13y13(); // tgen
  CC3x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y13E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x13y133efgEv");}
ccc::CC3x13y13 ::~CC3x13y13(){ note_dtor("_ZN3ccc9CC3x13y13E", this);} // tgen
ccc::CC3x13y13 ::CC3x13y13(){ note_ctor("_ZN3ccc9CC3x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y13E, buf);
    ::ccc::CC3x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y13E);
    dp->::ccc::CC3x13y13::~CC3x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y13E(Test__ZN3ccc9CC3x13y13E, "_ZN3ccc9CC3x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y13C1Ev();
extern void _ZN3ccc9CC3x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y13E[] = {
  NSPAIR(_ZN3ccc9CC3x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y13E[];
extern void _ZN3ccc9CC3x13y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x13y133efgEv,_ZThn4_N3ccc9CC3x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x13y133efgEv,_ZThn4_N3ccc9CC3x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y13E[];
Class_Descriptor cd__ZN3ccc9CC3x13y13E = {  "_ZN3ccc9CC3x13y13E", // class name
  bases__ZN3ccc9CC3x13y13E, 2,
  &(vtc__ZN3ccc9CC3x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y14  : ::ccc::AA3 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC3x13y143pqrEv
  ~CC3x13y14(); // tgen
  CC3x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y14E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x13y143pqrEv");}
ccc::CC3x13y14 ::~CC3x13y14(){ note_dtor("_ZN3ccc9CC3x13y14E", this);} // tgen
ccc::CC3x13y14 ::CC3x13y14(){ note_ctor("_ZN3ccc9CC3x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y14E, buf);
    ::ccc::CC3x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y14E);
    dp->::ccc::CC3x13y14::~CC3x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y14E(Test__ZN3ccc9CC3x13y14E, "_ZN3ccc9CC3x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y14C1Ev();
extern void _ZN3ccc9CC3x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y14E[] = {
  NSPAIR(_ZN3ccc9CC3x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x13y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y14E[];
Class_Descriptor cd__ZN3ccc9CC3x13y14E = {  "_ZN3ccc9CC3x13y14E", // class name
  bases__ZN3ccc9CC3x13y14E, 2,
  &(vtc__ZN3ccc9CC3x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x13y15  : ::ccc::AA3 , ::ccc::BB13 {
  ~CC3x13y15(); // tgen
  CC3x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x13y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x13y15 ::~CC3x13y15(){ note_dtor("_ZN3ccc9CC3x13y15E", this);} // tgen
ccc::CC3x13y15 ::CC3x13y15(){ note_ctor("_ZN3ccc9CC3x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x13y15E, buf);
    ::ccc::CC3x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x13y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC3x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x13y15E);
    dp->::ccc::CC3x13y15::~CC3x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x13y15E(Test__ZN3ccc9CC3x13y15E, "_ZN3ccc9CC3x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x13y15C1Ev();
extern void _ZN3ccc9CC3x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x13y15E[] = {
  NSPAIR(_ZN3ccc9CC3x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC3x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x13y15E[];
Class_Descriptor cd__ZN3ccc9CC3x13y15E = {  "_ZN3ccc9CC3x13y15E", // class name
  bases__ZN3ccc9CC3x13y15E, 2,
  &(vtc__ZN3ccc9CC3x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y0  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y03pqrEv
  ~CC3x14y0(); // tgen
  CC3x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y0E) C1{ BC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y03abcEv");}
void  ccc::CC3x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y03efgEv");}
void  ccc::CC3x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y03pqrEv");}
ccc::CC3x14y0 ::~CC3x14y0(){ note_dtor("_ZN3ccc8CC3x14y0E", this);} // tgen
ccc::CC3x14y0 ::CC3x14y0(){ note_ctor("_ZN3ccc8CC3x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y0E, buf);
    ::ccc::CC3x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y0E);
    dp->::ccc::CC3x14y0::~CC3x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y0E(Test__ZN3ccc8CC3x14y0E, "_ZN3ccc8CC3x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y0C1Ev();
extern void _ZN3ccc8CC3x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y0E[] = {
  NSPAIR(_ZN3ccc8CC3x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y0E[];
extern void _ZN3ccc8CC3x14y03efgEv();
extern void _ZN3ccc8CC3x14y03pqrEv();
extern void _ZN3ccc8CC3x14y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y03pqrEv,_ZThn4_N3ccc8CC3x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y03pqrEv,_ZThn4_N3ccc8CC3x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y0E[];
Class_Descriptor cd__ZN3ccc8CC3x14y0E = {  "_ZN3ccc8CC3x14y0E", // class name
  bases__ZN3ccc8CC3x14y0E, 2,
  &(vtc__ZN3ccc8CC3x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y1  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x14y13efgEv
  ~CC3x14y1(); // tgen
  CC3x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y1E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y13abcEv");}
void  ccc::CC3x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y13pqrEv");}
void  ccc::CC3x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y13efgEv");}
ccc::CC3x14y1 ::~CC3x14y1(){ note_dtor("_ZN3ccc8CC3x14y1E", this);} // tgen
ccc::CC3x14y1 ::CC3x14y1(){ note_ctor("_ZN3ccc8CC3x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y1E, buf);
    ::ccc::CC3x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y1E);
    dp->::ccc::CC3x14y1::~CC3x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y1E(Test__ZN3ccc8CC3x14y1E, "_ZN3ccc8CC3x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y1C1Ev();
extern void _ZN3ccc8CC3x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y1E[] = {
  NSPAIR(_ZN3ccc8CC3x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y1E[];
extern void _ZN3ccc8CC3x14y13efgEv();
extern void _ZN3ccc8CC3x14y13pqrEv();
extern void _ZN3ccc8CC3x14y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y13pqrEv,_ZThn4_N3ccc8CC3x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y13pqrEv,_ZThn4_N3ccc8CC3x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y1E[];
Class_Descriptor cd__ZN3ccc8CC3x14y1E = {  "_ZN3ccc8CC3x14y1E", // class name
  bases__ZN3ccc8CC3x14y1E, 2,
  &(vtc__ZN3ccc8CC3x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y2  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y23pqrEv
  ~CC3x14y2(); // tgen
  CC3x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y2E) C1{ BC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y23efgEv");}
void  ccc::CC3x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y23abcEv");}
void  ccc::CC3x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y23pqrEv");}
ccc::CC3x14y2 ::~CC3x14y2(){ note_dtor("_ZN3ccc8CC3x14y2E", this);} // tgen
ccc::CC3x14y2 ::CC3x14y2(){ note_ctor("_ZN3ccc8CC3x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y2E, buf);
    ::ccc::CC3x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y2E);
    dp->::ccc::CC3x14y2::~CC3x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y2E(Test__ZN3ccc8CC3x14y2E, "_ZN3ccc8CC3x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y2C1Ev();
extern void _ZN3ccc8CC3x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y2E[] = {
  NSPAIR(_ZN3ccc8CC3x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y2E[];
extern void _ZN3ccc8CC3x14y23efgEv();
extern void _ZN3ccc8CC3x14y23pqrEv();
extern void _ZN3ccc8CC3x14y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y23pqrEv,_ZThn4_N3ccc8CC3x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y23pqrEv,_ZThn4_N3ccc8CC3x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y2E[];
Class_Descriptor cd__ZN3ccc8CC3x14y2E = {  "_ZN3ccc8CC3x14y2E", // class name
  bases__ZN3ccc8CC3x14y2E, 2,
  &(vtc__ZN3ccc8CC3x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y3  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x14y33abcEv
  ~CC3x14y3(); // tgen
  CC3x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y3E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y33efgEv");}
void  ccc::CC3x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y33pqrEv");}
void  ccc::CC3x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y33abcEv");}
ccc::CC3x14y3 ::~CC3x14y3(){ note_dtor("_ZN3ccc8CC3x14y3E", this);} // tgen
ccc::CC3x14y3 ::CC3x14y3(){ note_ctor("_ZN3ccc8CC3x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y3E, buf);
    ::ccc::CC3x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y3E);
    dp->::ccc::CC3x14y3::~CC3x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y3E(Test__ZN3ccc8CC3x14y3E, "_ZN3ccc8CC3x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y3C1Ev();
extern void _ZN3ccc8CC3x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y3E[] = {
  NSPAIR(_ZN3ccc8CC3x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y3E[];
extern void _ZN3ccc8CC3x14y33efgEv();
extern void _ZN3ccc8CC3x14y33pqrEv();
extern void _ZN3ccc8CC3x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y33pqrEv,_ZThn4_N3ccc8CC3x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y33pqrEv,_ZThn4_N3ccc8CC3x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y3E[];
Class_Descriptor cd__ZN3ccc8CC3x14y3E = {  "_ZN3ccc8CC3x14y3E", // class name
  bases__ZN3ccc8CC3x14y3E, 2,
  &(vtc__ZN3ccc8CC3x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y4  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC3x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y43efgEv
  ~CC3x14y4(); // tgen
  CC3x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y4E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y43pqrEv");}
void  ccc::CC3x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y43abcEv");}
void  ccc::CC3x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y43efgEv");}
ccc::CC3x14y4 ::~CC3x14y4(){ note_dtor("_ZN3ccc8CC3x14y4E", this);} // tgen
ccc::CC3x14y4 ::CC3x14y4(){ note_ctor("_ZN3ccc8CC3x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y4E, buf);
    ::ccc::CC3x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y4E);
    dp->::ccc::CC3x14y4::~CC3x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y4E(Test__ZN3ccc8CC3x14y4E, "_ZN3ccc8CC3x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y4C1Ev();
extern void _ZN3ccc8CC3x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y4E[] = {
  NSPAIR(_ZN3ccc8CC3x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y4E[];
extern void _ZN3ccc8CC3x14y43efgEv();
extern void _ZN3ccc8CC3x14y43pqrEv();
extern void _ZN3ccc8CC3x14y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y43pqrEv,_ZThn4_N3ccc8CC3x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y43pqrEv,_ZThn4_N3ccc8CC3x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y4E[];
Class_Descriptor cd__ZN3ccc8CC3x14y4E = {  "_ZN3ccc8CC3x14y4E", // class name
  bases__ZN3ccc8CC3x14y4E, 2,
  &(vtc__ZN3ccc8CC3x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y5  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC3x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y53abcEv
  ~CC3x14y5(); // tgen
  CC3x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y5E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y53pqrEv");}
void  ccc::CC3x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y53efgEv");}
void  ccc::CC3x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y53abcEv");}
ccc::CC3x14y5 ::~CC3x14y5(){ note_dtor("_ZN3ccc8CC3x14y5E", this);} // tgen
ccc::CC3x14y5 ::CC3x14y5(){ note_ctor("_ZN3ccc8CC3x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y5E, buf);
    ::ccc::CC3x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y5E);
    dp->::ccc::CC3x14y5::~CC3x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y5E(Test__ZN3ccc8CC3x14y5E, "_ZN3ccc8CC3x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y5C1Ev();
extern void _ZN3ccc8CC3x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y5E[] = {
  NSPAIR(_ZN3ccc8CC3x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y5E[];
extern void _ZN3ccc8CC3x14y53efgEv();
extern void _ZN3ccc8CC3x14y53pqrEv();
extern void _ZN3ccc8CC3x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y53pqrEv,_ZThn4_N3ccc8CC3x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y53pqrEv,_ZThn4_N3ccc8CC3x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y5E[];
Class_Descriptor cd__ZN3ccc8CC3x14y5E = {  "_ZN3ccc8CC3x14y5E", // class name
  bases__ZN3ccc8CC3x14y5E, 2,
  &(vtc__ZN3ccc8CC3x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y6  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x14y63efgEv
  ~CC3x14y6(); // tgen
  CC3x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y6E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y63abcEv");}
void  ccc::CC3x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y63efgEv");}
ccc::CC3x14y6 ::~CC3x14y6(){ note_dtor("_ZN3ccc8CC3x14y6E", this);} // tgen
ccc::CC3x14y6 ::CC3x14y6(){ note_ctor("_ZN3ccc8CC3x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y6E, buf);
    ::ccc::CC3x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y6E);
    dp->::ccc::CC3x14y6::~CC3x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y6E(Test__ZN3ccc8CC3x14y6E, "_ZN3ccc8CC3x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y6C1Ev();
extern void _ZN3ccc8CC3x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y6E[] = {
  NSPAIR(_ZN3ccc8CC3x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y6E[];
extern void _ZN3ccc8CC3x14y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y6E[];
Class_Descriptor cd__ZN3ccc8CC3x14y6E = {  "_ZN3ccc8CC3x14y6E", // class name
  bases__ZN3ccc8CC3x14y6E, 2,
  &(vtc__ZN3ccc8CC3x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y7  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC3x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y73pqrEv
  ~CC3x14y7(); // tgen
  CC3x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y7E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y73abcEv");}
void  ccc::CC3x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y73pqrEv");}
ccc::CC3x14y7 ::~CC3x14y7(){ note_dtor("_ZN3ccc8CC3x14y7E", this);} // tgen
ccc::CC3x14y7 ::CC3x14y7(){ note_ctor("_ZN3ccc8CC3x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y7E, buf);
    ::ccc::CC3x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y7E);
    dp->::ccc::CC3x14y7::~CC3x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y7E(Test__ZN3ccc8CC3x14y7E, "_ZN3ccc8CC3x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y7C1Ev();
extern void _ZN3ccc8CC3x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y7E[] = {
  NSPAIR(_ZN3ccc8CC3x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x14y73pqrEv();
extern void _ZN3ccc8CC3x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y73pqrEv,_ZThn4_N3ccc8CC3x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y73pqrEv,_ZThn4_N3ccc8CC3x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y7E[];
Class_Descriptor cd__ZN3ccc8CC3x14y7E = {  "_ZN3ccc8CC3x14y7E", // class name
  bases__ZN3ccc8CC3x14y7E, 2,
  &(vtc__ZN3ccc8CC3x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y8  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x14y83abcEv
  ~CC3x14y8(); // tgen
  CC3x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y8E) C1{ BC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y83efgEv");}
void  ccc::CC3x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x14y83abcEv");}
ccc::CC3x14y8 ::~CC3x14y8(){ note_dtor("_ZN3ccc8CC3x14y8E", this);} // tgen
ccc::CC3x14y8 ::CC3x14y8(){ note_ctor("_ZN3ccc8CC3x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y8E, buf);
    ::ccc::CC3x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y8E);
    dp->::ccc::CC3x14y8::~CC3x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y8E(Test__ZN3ccc8CC3x14y8E, "_ZN3ccc8CC3x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y8C1Ev();
extern void _ZN3ccc8CC3x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y8E[] = {
  NSPAIR(_ZN3ccc8CC3x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y8E[];
extern void _ZN3ccc8CC3x14y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y8E[];
Class_Descriptor cd__ZN3ccc8CC3x14y8E = {  "_ZN3ccc8CC3x14y8E", // class name
  bases__ZN3ccc8CC3x14y8E, 2,
  &(vtc__ZN3ccc8CC3x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y9  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC3x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x14y93pqrEv
  ~CC3x14y9(); // tgen
  CC3x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x14y9E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x14y93efgEv");}
void  ccc::CC3x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x14y93pqrEv");}
ccc::CC3x14y9 ::~CC3x14y9(){ note_dtor("_ZN3ccc8CC3x14y9E", this);} // tgen
ccc::CC3x14y9 ::CC3x14y9(){ note_ctor("_ZN3ccc8CC3x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC3x14y9E, buf);
    ::ccc::CC3x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC3x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x14y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC3x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x14y9E);
    dp->::ccc::CC3x14y9::~CC3x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x14y9E(Test__ZN3ccc8CC3x14y9E, "_ZN3ccc8CC3x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC3x14y9C1Ev();
extern void _ZN3ccc8CC3x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x14y9E[] = {
  NSPAIR(_ZN3ccc8CC3x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC3x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y9E[];
extern void _ZN3ccc8CC3x14y93efgEv();
extern void _ZN3ccc8CC3x14y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC3x14y93pqrEv,_ZThn4_N3ccc8CC3x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC3x14y93pqrEv,_ZThn4_N3ccc8CC3x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x14y9E[];
Class_Descriptor cd__ZN3ccc8CC3x14y9E = {  "_ZN3ccc8CC3x14y9E", // class name
  bases__ZN3ccc8CC3x14y9E, 2,
  &(vtc__ZN3ccc8CC3x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC3x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y10  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x14y103abcEv
  ~CC3x14y10(); // tgen
  CC3x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y10E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y103pqrEv");}
void  ccc::CC3x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x14y103abcEv");}
ccc::CC3x14y10 ::~CC3x14y10(){ note_dtor("_ZN3ccc9CC3x14y10E", this);} // tgen
ccc::CC3x14y10 ::CC3x14y10(){ note_ctor("_ZN3ccc9CC3x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y10E, buf);
    ::ccc::CC3x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y10E);
    dp->::ccc::CC3x14y10::~CC3x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y10E(Test__ZN3ccc9CC3x14y10E, "_ZN3ccc9CC3x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y10C1Ev();
extern void _ZN3ccc9CC3x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y10E[] = {
  NSPAIR(_ZN3ccc9CC3x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x14y103pqrEv();
extern void _ZN3ccc9CC3x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y103pqrEv,_ZThn4_N3ccc9CC3x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x14y103pqrEv,_ZThn4_N3ccc9CC3x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y10E[];
Class_Descriptor cd__ZN3ccc9CC3x14y10E = {  "_ZN3ccc9CC3x14y10E", // class name
  bases__ZN3ccc9CC3x14y10E, 2,
  &(vtc__ZN3ccc9CC3x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y11  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x14y113efgEv
  ~CC3x14y11(); // tgen
  CC3x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y11E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC3x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y113pqrEv");}
void  ccc::CC3x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x14y113efgEv");}
ccc::CC3x14y11 ::~CC3x14y11(){ note_dtor("_ZN3ccc9CC3x14y11E", this);} // tgen
ccc::CC3x14y11 ::CC3x14y11(){ note_ctor("_ZN3ccc9CC3x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y11E, buf);
    ::ccc::CC3x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y11E);
    dp->::ccc::CC3x14y11::~CC3x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y11E(Test__ZN3ccc9CC3x14y11E, "_ZN3ccc9CC3x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y11C1Ev();
extern void _ZN3ccc9CC3x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y11E[] = {
  NSPAIR(_ZN3ccc9CC3x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y11E[];
extern void _ZN3ccc9CC3x14y113efgEv();
extern void _ZN3ccc9CC3x14y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y113pqrEv,_ZThn4_N3ccc9CC3x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x14y113pqrEv,_ZThn4_N3ccc9CC3x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y11E[];
Class_Descriptor cd__ZN3ccc9CC3x14y11E = {  "_ZN3ccc9CC3x14y11E", // class name
  bases__ZN3ccc9CC3x14y11E, 2,
  &(vtc__ZN3ccc9CC3x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y12  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC3x14y123abcEv
  ~CC3x14y12(); // tgen
  CC3x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y12E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x14y123abcEv");}
ccc::CC3x14y12 ::~CC3x14y12(){ note_dtor("_ZN3ccc9CC3x14y12E", this);} // tgen
ccc::CC3x14y12 ::CC3x14y12(){ note_ctor("_ZN3ccc9CC3x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y12E, buf);
    ::ccc::CC3x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y12E);
    dp->::ccc::CC3x14y12::~CC3x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y12E(Test__ZN3ccc9CC3x14y12E, "_ZN3ccc9CC3x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y12C1Ev();
extern void _ZN3ccc9CC3x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y12E[] = {
  NSPAIR(_ZN3ccc9CC3x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y12E[];
Class_Descriptor cd__ZN3ccc9CC3x14y12E = {  "_ZN3ccc9CC3x14y12E", // class name
  bases__ZN3ccc9CC3x14y12E, 2,
  &(vtc__ZN3ccc9CC3x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y13  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC3x14y133efgEv
  ~CC3x14y13(); // tgen
  CC3x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y13E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC3x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x14y133efgEv");}
ccc::CC3x14y13 ::~CC3x14y13(){ note_dtor("_ZN3ccc9CC3x14y13E", this);} // tgen
ccc::CC3x14y13 ::CC3x14y13(){ note_ctor("_ZN3ccc9CC3x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y13E, buf);
    ::ccc::CC3x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y13E);
    dp->::ccc::CC3x14y13::~CC3x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y13E(Test__ZN3ccc9CC3x14y13E, "_ZN3ccc9CC3x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y13C1Ev();
extern void _ZN3ccc9CC3x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y13E[] = {
  NSPAIR(_ZN3ccc9CC3x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y13E[];
extern void _ZN3ccc9CC3x14y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y13E[];
Class_Descriptor cd__ZN3ccc9CC3x14y13E = {  "_ZN3ccc9CC3x14y13E", // class name
  bases__ZN3ccc9CC3x14y13E, 2,
  &(vtc__ZN3ccc9CC3x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y14  : ::ccc::AA3 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC3x14y143pqrEv
  ~CC3x14y14(); // tgen
  CC3x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y14E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC3x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x14y143pqrEv");}
ccc::CC3x14y14 ::~CC3x14y14(){ note_dtor("_ZN3ccc9CC3x14y14E", this);} // tgen
ccc::CC3x14y14 ::CC3x14y14(){ note_ctor("_ZN3ccc9CC3x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y14E, buf);
    ::ccc::CC3x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y14E);
    dp->::ccc::CC3x14y14::~CC3x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y14E(Test__ZN3ccc9CC3x14y14E, "_ZN3ccc9CC3x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y14C1Ev();
extern void _ZN3ccc9CC3x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y14E[] = {
  NSPAIR(_ZN3ccc9CC3x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x14y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC3x14y143pqrEv,_ZThn4_N3ccc9CC3x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC3x14y143pqrEv,_ZThn4_N3ccc9CC3x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y14E[];
Class_Descriptor cd__ZN3ccc9CC3x14y14E = {  "_ZN3ccc9CC3x14y14E", // class name
  bases__ZN3ccc9CC3x14y14E, 2,
  &(vtc__ZN3ccc9CC3x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x14y15  : ::ccc::AA3 , ::ccc::BB14 {
  ~CC3x14y15(); // tgen
  CC3x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x14y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC3x14y15 ::~CC3x14y15(){ note_dtor("_ZN3ccc9CC3x14y15E", this);} // tgen
ccc::CC3x14y15 ::CC3x14y15(){ note_ctor("_ZN3ccc9CC3x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC3x14y15E, buf);
    ::ccc::CC3x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC3x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x14y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC3x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x14y15E);
    dp->::ccc::CC3x14y15::~CC3x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x14y15E(Test__ZN3ccc9CC3x14y15E, "_ZN3ccc9CC3x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC3x14y15C1Ev();
extern void _ZN3ccc9CC3x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x14y15E[] = {
  NSPAIR(_ZN3ccc9CC3x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC3x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x14y15E[];
Class_Descriptor cd__ZN3ccc9CC3x14y15E = {  "_ZN3ccc9CC3x14y15E", // class name
  bases__ZN3ccc9CC3x14y15E, 2,
  &(vtc__ZN3ccc9CC3x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC3x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y0  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y03pqrEv
  ~CC3x15y0(); // tgen
  CC3x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y0E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y03abcEv");}
void  ccc::CC3x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y03efgEv");}
void  ccc::CC3x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y03pqrEv");}
ccc::CC3x15y0 ::~CC3x15y0(){ note_dtor("_ZN3ccc8CC3x15y0E", this);} // tgen
ccc::CC3x15y0 ::CC3x15y0(){ note_ctor("_ZN3ccc8CC3x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y0E, buf);
    ::ccc::CC3x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y0E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y0E);
    dp->::ccc::CC3x15y0::~CC3x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y0E(Test__ZN3ccc8CC3x15y0E, "_ZN3ccc8CC3x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y0C1Ev();
extern void _ZN3ccc8CC3x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y0E[] = {
  NSPAIR(_ZN3ccc8CC3x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y0E[];
extern void _ZN3ccc8CC3x15y03efgEv();
extern void _ZN3ccc8CC3x15y03pqrEv();
extern void _ZN3ccc8CC3x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y0E[];
Class_Descriptor cd__ZN3ccc8CC3x15y0E = {  "_ZN3ccc8CC3x15y0E", // class name
  bases__ZN3ccc8CC3x15y0E, 2,
  &(vtc__ZN3ccc8CC3x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y1  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x15y13efgEv
  ~CC3x15y1(); // tgen
  CC3x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y1E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y13abcEv");}
void  ccc::CC3x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y13pqrEv");}
void  ccc::CC3x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y13efgEv");}
ccc::CC3x15y1 ::~CC3x15y1(){ note_dtor("_ZN3ccc8CC3x15y1E", this);} // tgen
ccc::CC3x15y1 ::CC3x15y1(){ note_ctor("_ZN3ccc8CC3x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y1E, buf);
    ::ccc::CC3x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y1E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y1E);
    dp->::ccc::CC3x15y1::~CC3x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y1E(Test__ZN3ccc8CC3x15y1E, "_ZN3ccc8CC3x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y1C1Ev();
extern void _ZN3ccc8CC3x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y1E[] = {
  NSPAIR(_ZN3ccc8CC3x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y1E[];
extern void _ZN3ccc8CC3x15y13efgEv();
extern void _ZN3ccc8CC3x15y13pqrEv();
extern void _ZN3ccc8CC3x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y1E[];
Class_Descriptor cd__ZN3ccc8CC3x15y1E = {  "_ZN3ccc8CC3x15y1E", // class name
  bases__ZN3ccc8CC3x15y1E, 2,
  &(vtc__ZN3ccc8CC3x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y2  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y23pqrEv
  ~CC3x15y2(); // tgen
  CC3x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y2E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y23efgEv");}
void  ccc::CC3x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y23abcEv");}
void  ccc::CC3x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y23pqrEv");}
ccc::CC3x15y2 ::~CC3x15y2(){ note_dtor("_ZN3ccc8CC3x15y2E", this);} // tgen
ccc::CC3x15y2 ::CC3x15y2(){ note_ctor("_ZN3ccc8CC3x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y2E, buf);
    ::ccc::CC3x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y2E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y2E);
    dp->::ccc::CC3x15y2::~CC3x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y2E(Test__ZN3ccc8CC3x15y2E, "_ZN3ccc8CC3x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y2C1Ev();
extern void _ZN3ccc8CC3x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y2E[] = {
  NSPAIR(_ZN3ccc8CC3x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y2E[];
extern void _ZN3ccc8CC3x15y23efgEv();
extern void _ZN3ccc8CC3x15y23pqrEv();
extern void _ZN3ccc8CC3x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y2E[];
Class_Descriptor cd__ZN3ccc8CC3x15y2E = {  "_ZN3ccc8CC3x15y2E", // class name
  bases__ZN3ccc8CC3x15y2E, 2,
  &(vtc__ZN3ccc8CC3x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y3  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x15y33abcEv
  ~CC3x15y3(); // tgen
  CC3x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y3E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y33efgEv");}
void  ccc::CC3x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y33pqrEv");}
void  ccc::CC3x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y33abcEv");}
ccc::CC3x15y3 ::~CC3x15y3(){ note_dtor("_ZN3ccc8CC3x15y3E", this);} // tgen
ccc::CC3x15y3 ::CC3x15y3(){ note_ctor("_ZN3ccc8CC3x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y3E, buf);
    ::ccc::CC3x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y3E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y3E);
    dp->::ccc::CC3x15y3::~CC3x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y3E(Test__ZN3ccc8CC3x15y3E, "_ZN3ccc8CC3x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y3C1Ev();
extern void _ZN3ccc8CC3x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y3E[] = {
  NSPAIR(_ZN3ccc8CC3x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y3E[];
extern void _ZN3ccc8CC3x15y33efgEv();
extern void _ZN3ccc8CC3x15y33pqrEv();
extern void _ZN3ccc8CC3x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y3E[];
Class_Descriptor cd__ZN3ccc8CC3x15y3E = {  "_ZN3ccc8CC3x15y3E", // class name
  bases__ZN3ccc8CC3x15y3E, 2,
  &(vtc__ZN3ccc8CC3x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y4  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC3x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC3x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y43efgEv
  ~CC3x15y4(); // tgen
  CC3x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y4E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y43pqrEv");}
void  ccc::CC3x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y43abcEv");}
void  ccc::CC3x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y43efgEv");}
ccc::CC3x15y4 ::~CC3x15y4(){ note_dtor("_ZN3ccc8CC3x15y4E", this);} // tgen
ccc::CC3x15y4 ::CC3x15y4(){ note_ctor("_ZN3ccc8CC3x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y4E, buf);
    ::ccc::CC3x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y4E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y4E);
    dp->::ccc::CC3x15y4::~CC3x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y4E(Test__ZN3ccc8CC3x15y4E, "_ZN3ccc8CC3x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y4C1Ev();
extern void _ZN3ccc8CC3x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y4E[] = {
  NSPAIR(_ZN3ccc8CC3x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y4E[];
extern void _ZN3ccc8CC3x15y43efgEv();
extern void _ZN3ccc8CC3x15y43pqrEv();
extern void _ZN3ccc8CC3x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y4E[];
Class_Descriptor cd__ZN3ccc8CC3x15y4E = {  "_ZN3ccc8CC3x15y4E", // class name
  bases__ZN3ccc8CC3x15y4E, 2,
  &(vtc__ZN3ccc8CC3x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y5  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC3x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC3x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y53abcEv
  ~CC3x15y5(); // tgen
  CC3x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y5E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC3x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y53pqrEv");}
void  ccc::CC3x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y53efgEv");}
void  ccc::CC3x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y53abcEv");}
ccc::CC3x15y5 ::~CC3x15y5(){ note_dtor("_ZN3ccc8CC3x15y5E", this);} // tgen
ccc::CC3x15y5 ::CC3x15y5(){ note_ctor("_ZN3ccc8CC3x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y5E, buf);
    ::ccc::CC3x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y5E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y5E);
    dp->::ccc::CC3x15y5::~CC3x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y5E(Test__ZN3ccc8CC3x15y5E, "_ZN3ccc8CC3x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y5C1Ev();
extern void _ZN3ccc8CC3x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y5E[] = {
  NSPAIR(_ZN3ccc8CC3x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y5E[];
extern void _ZN3ccc8CC3x15y53efgEv();
extern void _ZN3ccc8CC3x15y53pqrEv();
extern void _ZN3ccc8CC3x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y5E[];
Class_Descriptor cd__ZN3ccc8CC3x15y5E = {  "_ZN3ccc8CC3x15y5E", // class name
  bases__ZN3ccc8CC3x15y5E, 2,
  &(vtc__ZN3ccc8CC3x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y6  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC3x15y63efgEv
  ~CC3x15y6(); // tgen
  CC3x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y6E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y63abcEv");}
void  ccc::CC3x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y63efgEv");}
ccc::CC3x15y6 ::~CC3x15y6(){ note_dtor("_ZN3ccc8CC3x15y6E", this);} // tgen
ccc::CC3x15y6 ::CC3x15y6(){ note_ctor("_ZN3ccc8CC3x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y6E, buf);
    ::ccc::CC3x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y6E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y6E);
    dp->::ccc::CC3x15y6::~CC3x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y6E(Test__ZN3ccc8CC3x15y6E, "_ZN3ccc8CC3x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y6C1Ev();
extern void _ZN3ccc8CC3x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y6E[] = {
  NSPAIR(_ZN3ccc8CC3x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y6E[];
extern void _ZN3ccc8CC3x15y63efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y6E[];
Class_Descriptor cd__ZN3ccc8CC3x15y6E = {  "_ZN3ccc8CC3x15y6E", // class name
  bases__ZN3ccc8CC3x15y6E, 2,
  &(vtc__ZN3ccc8CC3x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y7  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC3x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y73pqrEv
  ~CC3x15y7(); // tgen
  CC3x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y7E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y73abcEv");}
void  ccc::CC3x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y73pqrEv");}
ccc::CC3x15y7 ::~CC3x15y7(){ note_dtor("_ZN3ccc8CC3x15y7E", this);} // tgen
ccc::CC3x15y7 ::CC3x15y7(){ note_ctor("_ZN3ccc8CC3x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y7E, buf);
    ::ccc::CC3x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y7E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y7E);
    dp->::ccc::CC3x15y7::~CC3x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y7E(Test__ZN3ccc8CC3x15y7E, "_ZN3ccc8CC3x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y7C1Ev();
extern void _ZN3ccc8CC3x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y7E[] = {
  NSPAIR(_ZN3ccc8CC3x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y7E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc8CC3x15y73pqrEv();
extern void _ZN3ccc8CC3x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y7E[];
Class_Descriptor cd__ZN3ccc8CC3x15y7E = {  "_ZN3ccc8CC3x15y7E", // class name
  bases__ZN3ccc8CC3x15y7E, 2,
  &(vtc__ZN3ccc8CC3x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y8  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC3x15y83abcEv
  ~CC3x15y8(); // tgen
  CC3x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y8E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y83efgEv");}
void  ccc::CC3x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC3x15y83abcEv");}
ccc::CC3x15y8 ::~CC3x15y8(){ note_dtor("_ZN3ccc8CC3x15y8E", this);} // tgen
ccc::CC3x15y8 ::CC3x15y8(){ note_ctor("_ZN3ccc8CC3x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y8E, buf);
    ::ccc::CC3x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y8E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y8E);
    dp->::ccc::CC3x15y8::~CC3x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y8E(Test__ZN3ccc8CC3x15y8E, "_ZN3ccc8CC3x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y8C1Ev();
extern void _ZN3ccc8CC3x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y8E[] = {
  NSPAIR(_ZN3ccc8CC3x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y8E[];
extern void _ZN3ccc8CC3x15y83efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc8CC3x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y8E[];
Class_Descriptor cd__ZN3ccc8CC3x15y8E = {  "_ZN3ccc8CC3x15y8E", // class name
  bases__ZN3ccc8CC3x15y8E, 2,
  &(vtc__ZN3ccc8CC3x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y9  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC3x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC3x15y93pqrEv
  ~CC3x15y9(); // tgen
  CC3x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC3x15y9E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC3x15y93efgEv");}
void  ccc::CC3x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC3x15y93pqrEv");}
ccc::CC3x15y9 ::~CC3x15y9(){ note_dtor("_ZN3ccc8CC3x15y9E", this);} // tgen
ccc::CC3x15y9 ::CC3x15y9(){ note_ctor("_ZN3ccc8CC3x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC3x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC3x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC3x15y9E, buf);
    ::ccc::CC3x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC3x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC3x15y9E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc8CC3x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC3x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC3x15y9E);
    dp->::ccc::CC3x15y9::~CC3x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC3x15y9E(Test__ZN3ccc8CC3x15y9E, "_ZN3ccc8CC3x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC3x15y9C1Ev();
extern void _ZN3ccc8CC3x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC3x15y9E[] = {
  NSPAIR(_ZN3ccc8CC3x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC3x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC3x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y9E[];
extern void _ZN3ccc8CC3x15y93efgEv();
extern void _ZN3ccc8CC3x15y93pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC3x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC3x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC3x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC3x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC3x15y9E[];
Class_Descriptor cd__ZN3ccc8CC3x15y9E = {  "_ZN3ccc8CC3x15y9E", // class name
  bases__ZN3ccc8CC3x15y9E, 2,
  &(vtc__ZN3ccc8CC3x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC3x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC3x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y10  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC3x15y103abcEv
  ~CC3x15y10(); // tgen
  CC3x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y10E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y103pqrEv");}
void  ccc::CC3x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x15y103abcEv");}
ccc::CC3x15y10 ::~CC3x15y10(){ note_dtor("_ZN3ccc9CC3x15y10E", this);} // tgen
ccc::CC3x15y10 ::CC3x15y10(){ note_ctor("_ZN3ccc9CC3x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y10E, buf);
    ::ccc::CC3x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y10E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y10E);
    dp->::ccc::CC3x15y10::~CC3x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y10E(Test__ZN3ccc9CC3x15y10E, "_ZN3ccc9CC3x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y10C1Ev();
extern void _ZN3ccc9CC3x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y10E[] = {
  NSPAIR(_ZN3ccc9CC3x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y10E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x15y103pqrEv();
extern void _ZN3ccc9CC3x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y10E[];
Class_Descriptor cd__ZN3ccc9CC3x15y10E = {  "_ZN3ccc9CC3x15y10E", // class name
  bases__ZN3ccc9CC3x15y10E, 2,
  &(vtc__ZN3ccc9CC3x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y11  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC3x15y113efgEv
  ~CC3x15y11(); // tgen
  CC3x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y11E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC3x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y113pqrEv");}
void  ccc::CC3x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x15y113efgEv");}
ccc::CC3x15y11 ::~CC3x15y11(){ note_dtor("_ZN3ccc9CC3x15y11E", this);} // tgen
ccc::CC3x15y11 ::CC3x15y11(){ note_ctor("_ZN3ccc9CC3x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y11E, buf);
    ::ccc::CC3x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y11E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y11E);
    dp->::ccc::CC3x15y11::~CC3x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y11E(Test__ZN3ccc9CC3x15y11E, "_ZN3ccc9CC3x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y11C1Ev();
extern void _ZN3ccc9CC3x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y11E[] = {
  NSPAIR(_ZN3ccc9CC3x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y11E[];
extern void _ZN3ccc9CC3x15y113efgEv();
extern void _ZN3ccc9CC3x15y113pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y11E[];
Class_Descriptor cd__ZN3ccc9CC3x15y11E = {  "_ZN3ccc9CC3x15y11E", // class name
  bases__ZN3ccc9CC3x15y11E, 2,
  &(vtc__ZN3ccc9CC3x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y12  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC3x15y123abcEv
  ~CC3x15y12(); // tgen
  CC3x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y12E) C1{ BC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC3x15y123abcEv");}
ccc::CC3x15y12 ::~CC3x15y12(){ note_dtor("_ZN3ccc9CC3x15y12E", this);} // tgen
ccc::CC3x15y12 ::CC3x15y12(){ note_ctor("_ZN3ccc9CC3x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y12E, buf);
    ::ccc::CC3x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y12E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y12E);
    dp->::ccc::CC3x15y12::~CC3x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y12E(Test__ZN3ccc9CC3x15y12E, "_ZN3ccc9CC3x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y12C1Ev();
extern void _ZN3ccc9CC3x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y12E[] = {
  NSPAIR(_ZN3ccc9CC3x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y12E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc9CC3x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y12E[];
Class_Descriptor cd__ZN3ccc9CC3x15y12E = {  "_ZN3ccc9CC3x15y12E", // class name
  bases__ZN3ccc9CC3x15y12E, 2,
  &(vtc__ZN3ccc9CC3x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y13  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC3x15y133efgEv
  ~CC3x15y13(); // tgen
  CC3x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y13E) C1{ BC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC3x15y133efgEv");}
ccc::CC3x15y13 ::~CC3x15y13(){ note_dtor("_ZN3ccc9CC3x15y13E", this);} // tgen
ccc::CC3x15y13 ::CC3x15y13(){ note_ctor("_ZN3ccc9CC3x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y13E, buf);
    ::ccc::CC3x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y13E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y13E);
    dp->::ccc::CC3x15y13::~CC3x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y13E(Test__ZN3ccc9CC3x15y13E, "_ZN3ccc9CC3x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y13C1Ev();
extern void _ZN3ccc9CC3x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y13E[] = {
  NSPAIR(_ZN3ccc9CC3x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y13E[];
extern void _ZN3ccc9CC3x15y133efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y13E[];
Class_Descriptor cd__ZN3ccc9CC3x15y13E = {  "_ZN3ccc9CC3x15y13E", // class name
  bases__ZN3ccc9CC3x15y13E, 2,
  &(vtc__ZN3ccc9CC3x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y14  : ::ccc::AA3 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC3x15y143pqrEv
  ~CC3x15y14(); // tgen
  CC3x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y14E) C1{ BC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC3x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC3x15y143pqrEv");}
ccc::CC3x15y14 ::~CC3x15y14(){ note_dtor("_ZN3ccc9CC3x15y14E", this);} // tgen
ccc::CC3x15y14 ::CC3x15y14(){ note_ctor("_ZN3ccc9CC3x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y14E, buf);
    ::ccc::CC3x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y14E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y14E);
    dp->::ccc::CC3x15y14::~CC3x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y14E(Test__ZN3ccc9CC3x15y14E, "_ZN3ccc9CC3x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y14C1Ev();
extern void _ZN3ccc9CC3x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y14E[] = {
  NSPAIR(_ZN3ccc9CC3x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y14E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc9CC3x15y143pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC3x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y14E[];
Class_Descriptor cd__ZN3ccc9CC3x15y14E = {  "_ZN3ccc9CC3x15y14E", // class name
  bases__ZN3ccc9CC3x15y14E, 2,
  &(vtc__ZN3ccc9CC3x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC3x15y15  : ::ccc::AA3 , ::ccc::BB15 {
  ~CC3x15y15(); // tgen
  CC3x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC3x15y15E) C1{ BC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC3x15y15 ::~CC3x15y15(){ note_dtor("_ZN3ccc9CC3x15y15E", this);} // tgen
ccc::CC3x15y15 ::CC3x15y15(){ note_ctor("_ZN3ccc9CC3x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC3x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC3x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC3x15y15E, buf);
    ::ccc::CC3x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC3x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC3x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC3x15y15E)");
    check_base_class_offset(lv, (::ccc::AA3*), 0, "_ZN3ccc9CC3x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC3x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC3x15y15E);
    dp->::ccc::CC3x15y15::~CC3x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC3x15y15E(Test__ZN3ccc9CC3x15y15E, "_ZN3ccc9CC3x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC3x15y15C1Ev();
extern void _ZN3ccc9CC3x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC3x15y15E[] = {
  NSPAIR(_ZN3ccc9CC3x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC3x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA3E;
extern VTBL_ENTRY _ZTIN3ccc3AA3E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA3E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC3x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y15E[];
extern void _ZN3ccc3AA33efgEv();
extern void _ZN3ccc3AA33pqrEv();
extern void _ZN3ccc3AA33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC3x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC3x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC3x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC3x15y15E[];
Class_Descriptor cd__ZN3ccc9CC3x15y15E = {  "_ZN3ccc9CC3x15y15E", // class name
  bases__ZN3ccc9CC3x15y15E, 2,
  &(vtc__ZN3ccc9CC3x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC3x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC3x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y0  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y03pqrEv
  ~CC4x0y0(); // tgen
  CC4x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y0E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y03abcEv");}
void  ccc::CC4x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y03efgEv");}
void  ccc::CC4x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y03pqrEv");}
ccc::CC4x0y0 ::~CC4x0y0(){ note_dtor("_ZN3ccc7CC4x0y0E", this);} // tgen
ccc::CC4x0y0 ::CC4x0y0(){ note_ctor("_ZN3ccc7CC4x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y0E, buf);
    ::ccc::CC4x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y0E);
    dp->::ccc::CC4x0y0::~CC4x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y0E(Test__ZN3ccc7CC4x0y0E, "_ZN3ccc7CC4x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y0C1Ev();
extern void _ZN3ccc7CC4x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y0E[] = {
  NSPAIR(_ZN3ccc7CC4x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y0E[];
extern void _ZN3ccc7CC4x0y03pqrEv();
extern void _ZN3ccc7CC4x0y03abcEv();
extern void _ZN3ccc7CC4x0y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03abcEv,_ZThn4_N3ccc7CC4x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03efgEv,_ZThn4_N3ccc7CC4x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y03pqrEv,_ZThn4_N3ccc7CC4x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y03abcEv,_ZThn4_N3ccc7CC4x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y03efgEv,_ZThn4_N3ccc7CC4x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y03pqrEv,_ZThn4_N3ccc7CC4x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y0E[];
Class_Descriptor cd__ZN3ccc7CC4x0y0E = {  "_ZN3ccc7CC4x0y0E", // class name
  bases__ZN3ccc7CC4x0y0E, 2,
  &(vtc__ZN3ccc7CC4x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y1  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x0y13efgEv
  ~CC4x0y1(); // tgen
  CC4x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y1E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y13abcEv");}
void  ccc::CC4x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y13pqrEv");}
void  ccc::CC4x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y13efgEv");}
ccc::CC4x0y1 ::~CC4x0y1(){ note_dtor("_ZN3ccc7CC4x0y1E", this);} // tgen
ccc::CC4x0y1 ::CC4x0y1(){ note_ctor("_ZN3ccc7CC4x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y1E, buf);
    ::ccc::CC4x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y1E);
    dp->::ccc::CC4x0y1::~CC4x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y1E(Test__ZN3ccc7CC4x0y1E, "_ZN3ccc7CC4x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y1C1Ev();
extern void _ZN3ccc7CC4x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y1E[] = {
  NSPAIR(_ZN3ccc7CC4x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y1E[];
extern void _ZN3ccc7CC4x0y13pqrEv();
extern void _ZN3ccc7CC4x0y13abcEv();
extern void _ZN3ccc7CC4x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13abcEv,_ZThn4_N3ccc7CC4x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13efgEv,_ZThn4_N3ccc7CC4x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y13pqrEv,_ZThn4_N3ccc7CC4x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y13abcEv,_ZThn4_N3ccc7CC4x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y13efgEv,_ZThn4_N3ccc7CC4x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y13pqrEv,_ZThn4_N3ccc7CC4x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y1E[];
Class_Descriptor cd__ZN3ccc7CC4x0y1E = {  "_ZN3ccc7CC4x0y1E", // class name
  bases__ZN3ccc7CC4x0y1E, 2,
  &(vtc__ZN3ccc7CC4x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y2  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y23pqrEv
  ~CC4x0y2(); // tgen
  CC4x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y2E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y23efgEv");}
void  ccc::CC4x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y23abcEv");}
void  ccc::CC4x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y23pqrEv");}
ccc::CC4x0y2 ::~CC4x0y2(){ note_dtor("_ZN3ccc7CC4x0y2E", this);} // tgen
ccc::CC4x0y2 ::CC4x0y2(){ note_ctor("_ZN3ccc7CC4x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y2E, buf);
    ::ccc::CC4x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y2E);
    dp->::ccc::CC4x0y2::~CC4x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y2E(Test__ZN3ccc7CC4x0y2E, "_ZN3ccc7CC4x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y2C1Ev();
extern void _ZN3ccc7CC4x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y2E[] = {
  NSPAIR(_ZN3ccc7CC4x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y2E[];
extern void _ZN3ccc7CC4x0y23pqrEv();
extern void _ZN3ccc7CC4x0y23abcEv();
extern void _ZN3ccc7CC4x0y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23abcEv,_ZThn4_N3ccc7CC4x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23efgEv,_ZThn4_N3ccc7CC4x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y23pqrEv,_ZThn4_N3ccc7CC4x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y23abcEv,_ZThn4_N3ccc7CC4x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y23efgEv,_ZThn4_N3ccc7CC4x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y23pqrEv,_ZThn4_N3ccc7CC4x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y2E[];
Class_Descriptor cd__ZN3ccc7CC4x0y2E = {  "_ZN3ccc7CC4x0y2E", // class name
  bases__ZN3ccc7CC4x0y2E, 2,
  &(vtc__ZN3ccc7CC4x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y3  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x0y33abcEv
  ~CC4x0y3(); // tgen
  CC4x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y3E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y33efgEv");}
void  ccc::CC4x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y33pqrEv");}
void  ccc::CC4x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y33abcEv");}
ccc::CC4x0y3 ::~CC4x0y3(){ note_dtor("_ZN3ccc7CC4x0y3E", this);} // tgen
ccc::CC4x0y3 ::CC4x0y3(){ note_ctor("_ZN3ccc7CC4x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y3E, buf);
    ::ccc::CC4x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y3E);
    dp->::ccc::CC4x0y3::~CC4x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y3E(Test__ZN3ccc7CC4x0y3E, "_ZN3ccc7CC4x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y3C1Ev();
extern void _ZN3ccc7CC4x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y3E[] = {
  NSPAIR(_ZN3ccc7CC4x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y3E[];
extern void _ZN3ccc7CC4x0y33pqrEv();
extern void _ZN3ccc7CC4x0y33abcEv();
extern void _ZN3ccc7CC4x0y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33abcEv,_ZThn4_N3ccc7CC4x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33efgEv,_ZThn4_N3ccc7CC4x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y33pqrEv,_ZThn4_N3ccc7CC4x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y33abcEv,_ZThn4_N3ccc7CC4x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y33efgEv,_ZThn4_N3ccc7CC4x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y33pqrEv,_ZThn4_N3ccc7CC4x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y3E[];
Class_Descriptor cd__ZN3ccc7CC4x0y3E = {  "_ZN3ccc7CC4x0y3E", // class name
  bases__ZN3ccc7CC4x0y3E, 2,
  &(vtc__ZN3ccc7CC4x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y4  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC4x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y43efgEv
  ~CC4x0y4(); // tgen
  CC4x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y4E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y43pqrEv");}
void  ccc::CC4x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y43abcEv");}
void  ccc::CC4x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y43efgEv");}
ccc::CC4x0y4 ::~CC4x0y4(){ note_dtor("_ZN3ccc7CC4x0y4E", this);} // tgen
ccc::CC4x0y4 ::CC4x0y4(){ note_ctor("_ZN3ccc7CC4x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y4E, buf);
    ::ccc::CC4x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y4E);
    dp->::ccc::CC4x0y4::~CC4x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y4E(Test__ZN3ccc7CC4x0y4E, "_ZN3ccc7CC4x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y4C1Ev();
extern void _ZN3ccc7CC4x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y4E[] = {
  NSPAIR(_ZN3ccc7CC4x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y4E[];
extern void _ZN3ccc7CC4x0y43pqrEv();
extern void _ZN3ccc7CC4x0y43abcEv();
extern void _ZN3ccc7CC4x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43abcEv,_ZThn4_N3ccc7CC4x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43efgEv,_ZThn4_N3ccc7CC4x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y43pqrEv,_ZThn4_N3ccc7CC4x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y43abcEv,_ZThn4_N3ccc7CC4x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y43efgEv,_ZThn4_N3ccc7CC4x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y43pqrEv,_ZThn4_N3ccc7CC4x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y4E[];
Class_Descriptor cd__ZN3ccc7CC4x0y4E = {  "_ZN3ccc7CC4x0y4E", // class name
  bases__ZN3ccc7CC4x0y4E, 2,
  &(vtc__ZN3ccc7CC4x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y5  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC4x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y53abcEv
  ~CC4x0y5(); // tgen
  CC4x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y5E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y53pqrEv");}
void  ccc::CC4x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y53efgEv");}
void  ccc::CC4x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y53abcEv");}
ccc::CC4x0y5 ::~CC4x0y5(){ note_dtor("_ZN3ccc7CC4x0y5E", this);} // tgen
ccc::CC4x0y5 ::CC4x0y5(){ note_ctor("_ZN3ccc7CC4x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y5E, buf);
    ::ccc::CC4x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y5E);
    dp->::ccc::CC4x0y5::~CC4x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y5E(Test__ZN3ccc7CC4x0y5E, "_ZN3ccc7CC4x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y5C1Ev();
extern void _ZN3ccc7CC4x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y5E[] = {
  NSPAIR(_ZN3ccc7CC4x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y5E[];
extern void _ZN3ccc7CC4x0y53pqrEv();
extern void _ZN3ccc7CC4x0y53abcEv();
extern void _ZN3ccc7CC4x0y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53abcEv,_ZThn4_N3ccc7CC4x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53efgEv,_ZThn4_N3ccc7CC4x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y53pqrEv,_ZThn4_N3ccc7CC4x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y53abcEv,_ZThn4_N3ccc7CC4x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y53efgEv,_ZThn4_N3ccc7CC4x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y53pqrEv,_ZThn4_N3ccc7CC4x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y5E[];
Class_Descriptor cd__ZN3ccc7CC4x0y5E = {  "_ZN3ccc7CC4x0y5E", // class name
  bases__ZN3ccc7CC4x0y5E, 2,
  &(vtc__ZN3ccc7CC4x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y6  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x0y63efgEv
  ~CC4x0y6(); // tgen
  CC4x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y6E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y63abcEv");}
void  ccc::CC4x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y63efgEv");}
ccc::CC4x0y6 ::~CC4x0y6(){ note_dtor("_ZN3ccc7CC4x0y6E", this);} // tgen
ccc::CC4x0y6 ::CC4x0y6(){ note_ctor("_ZN3ccc7CC4x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y6E, buf);
    ::ccc::CC4x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y6E);
    dp->::ccc::CC4x0y6::~CC4x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y6E(Test__ZN3ccc7CC4x0y6E, "_ZN3ccc7CC4x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y6C1Ev();
extern void _ZN3ccc7CC4x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y6E[] = {
  NSPAIR(_ZN3ccc7CC4x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x0y63abcEv();
extern void _ZN3ccc7CC4x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y63abcEv,_ZThn4_N3ccc7CC4x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y63efgEv,_ZThn4_N3ccc7CC4x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y63abcEv,_ZThn4_N3ccc7CC4x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y63efgEv,_ZThn4_N3ccc7CC4x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y6E[];
Class_Descriptor cd__ZN3ccc7CC4x0y6E = {  "_ZN3ccc7CC4x0y6E", // class name
  bases__ZN3ccc7CC4x0y6E, 2,
  &(vtc__ZN3ccc7CC4x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y7  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC4x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y73pqrEv
  ~CC4x0y7(); // tgen
  CC4x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y7E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y73abcEv");}
void  ccc::CC4x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y73pqrEv");}
ccc::CC4x0y7 ::~CC4x0y7(){ note_dtor("_ZN3ccc7CC4x0y7E", this);} // tgen
ccc::CC4x0y7 ::CC4x0y7(){ note_ctor("_ZN3ccc7CC4x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y7E, buf);
    ::ccc::CC4x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y7E);
    dp->::ccc::CC4x0y7::~CC4x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y7E(Test__ZN3ccc7CC4x0y7E, "_ZN3ccc7CC4x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y7C1Ev();
extern void _ZN3ccc7CC4x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y7E[] = {
  NSPAIR(_ZN3ccc7CC4x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y7E[];
extern void _ZN3ccc7CC4x0y73pqrEv();
extern void _ZN3ccc7CC4x0y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y73abcEv,_ZThn4_N3ccc7CC4x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y73pqrEv,_ZThn4_N3ccc7CC4x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y73abcEv,_ZThn4_N3ccc7CC4x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y73pqrEv,_ZThn4_N3ccc7CC4x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y7E[];
Class_Descriptor cd__ZN3ccc7CC4x0y7E = {  "_ZN3ccc7CC4x0y7E", // class name
  bases__ZN3ccc7CC4x0y7E, 2,
  &(vtc__ZN3ccc7CC4x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y8  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x0y83abcEv
  ~CC4x0y8(); // tgen
  CC4x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y8E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y83efgEv");}
void  ccc::CC4x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x0y83abcEv");}
ccc::CC4x0y8 ::~CC4x0y8(){ note_dtor("_ZN3ccc7CC4x0y8E", this);} // tgen
ccc::CC4x0y8 ::CC4x0y8(){ note_ctor("_ZN3ccc7CC4x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y8E, buf);
    ::ccc::CC4x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y8E);
    dp->::ccc::CC4x0y8::~CC4x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y8E(Test__ZN3ccc7CC4x0y8E, "_ZN3ccc7CC4x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y8C1Ev();
extern void _ZN3ccc7CC4x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y8E[] = {
  NSPAIR(_ZN3ccc7CC4x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x0y83abcEv();
extern void _ZN3ccc7CC4x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y83abcEv,_ZThn4_N3ccc7CC4x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y83efgEv,_ZThn4_N3ccc7CC4x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y83abcEv,_ZThn4_N3ccc7CC4x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y83efgEv,_ZThn4_N3ccc7CC4x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y8E[];
Class_Descriptor cd__ZN3ccc7CC4x0y8E = {  "_ZN3ccc7CC4x0y8E", // class name
  bases__ZN3ccc7CC4x0y8E, 2,
  &(vtc__ZN3ccc7CC4x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y9  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC4x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x0y93pqrEv
  ~CC4x0y9(); // tgen
  CC4x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x0y9E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x0y93efgEv");}
void  ccc::CC4x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x0y93pqrEv");}
ccc::CC4x0y9 ::~CC4x0y9(){ note_dtor("_ZN3ccc7CC4x0y9E", this);} // tgen
ccc::CC4x0y9 ::CC4x0y9(){ note_ctor("_ZN3ccc7CC4x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x0y9E, buf);
    ::ccc::CC4x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x0y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC4x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x0y9E);
    dp->::ccc::CC4x0y9::~CC4x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x0y9E(Test__ZN3ccc7CC4x0y9E, "_ZN3ccc7CC4x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x0y9C1Ev();
extern void _ZN3ccc7CC4x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x0y9E[] = {
  NSPAIR(_ZN3ccc7CC4x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC4x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y9E[];
extern void _ZN3ccc7CC4x0y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y93efgEv,_ZThn4_N3ccc7CC4x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x0y93pqrEv,_ZThn4_N3ccc7CC4x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y93efgEv,_ZThn4_N3ccc7CC4x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x0y93pqrEv,_ZThn4_N3ccc7CC4x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x0y9E[];
Class_Descriptor cd__ZN3ccc7CC4x0y9E = {  "_ZN3ccc7CC4x0y9E", // class name
  bases__ZN3ccc7CC4x0y9E, 2,
  &(vtc__ZN3ccc7CC4x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y10  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x0y103abcEv
  ~CC4x0y10(); // tgen
  CC4x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y10E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y103pqrEv");}
void  ccc::CC4x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x0y103abcEv");}
ccc::CC4x0y10 ::~CC4x0y10(){ note_dtor("_ZN3ccc8CC4x0y10E", this);} // tgen
ccc::CC4x0y10 ::CC4x0y10(){ note_ctor("_ZN3ccc8CC4x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y10E, buf);
    ::ccc::CC4x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y10E);
    dp->::ccc::CC4x0y10::~CC4x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y10E(Test__ZN3ccc8CC4x0y10E, "_ZN3ccc8CC4x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y10C1Ev();
extern void _ZN3ccc8CC4x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y10E[] = {
  NSPAIR(_ZN3ccc8CC4x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y10E[];
extern void _ZN3ccc8CC4x0y103pqrEv();
extern void _ZN3ccc8CC4x0y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y103abcEv,_ZThn4_N3ccc8CC4x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y103pqrEv,_ZThn4_N3ccc8CC4x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y103abcEv,_ZThn4_N3ccc8CC4x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y103pqrEv,_ZThn4_N3ccc8CC4x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y10E[];
Class_Descriptor cd__ZN3ccc8CC4x0y10E = {  "_ZN3ccc8CC4x0y10E", // class name
  bases__ZN3ccc8CC4x0y10E, 2,
  &(vtc__ZN3ccc8CC4x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y11  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x0y113efgEv
  ~CC4x0y11(); // tgen
  CC4x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y11E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y113pqrEv");}
void  ccc::CC4x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x0y113efgEv");}
ccc::CC4x0y11 ::~CC4x0y11(){ note_dtor("_ZN3ccc8CC4x0y11E", this);} // tgen
ccc::CC4x0y11 ::CC4x0y11(){ note_ctor("_ZN3ccc8CC4x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y11E, buf);
    ::ccc::CC4x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y11E);
    dp->::ccc::CC4x0y11::~CC4x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y11E(Test__ZN3ccc8CC4x0y11E, "_ZN3ccc8CC4x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y11C1Ev();
extern void _ZN3ccc8CC4x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y11E[] = {
  NSPAIR(_ZN3ccc8CC4x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y11E[];
extern void _ZN3ccc8CC4x0y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y113efgEv,_ZThn4_N3ccc8CC4x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y113pqrEv,_ZThn4_N3ccc8CC4x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y113efgEv,_ZThn4_N3ccc8CC4x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y113pqrEv,_ZThn4_N3ccc8CC4x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y11E[];
Class_Descriptor cd__ZN3ccc8CC4x0y11E = {  "_ZN3ccc8CC4x0y11E", // class name
  bases__ZN3ccc8CC4x0y11E, 2,
  &(vtc__ZN3ccc8CC4x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y12  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC4x0y123abcEv
  ~CC4x0y12(); // tgen
  CC4x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x0y123abcEv");}
ccc::CC4x0y12 ::~CC4x0y12(){ note_dtor("_ZN3ccc8CC4x0y12E", this);} // tgen
ccc::CC4x0y12 ::CC4x0y12(){ note_ctor("_ZN3ccc8CC4x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y12E, buf);
    ::ccc::CC4x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y12E);
    dp->::ccc::CC4x0y12::~CC4x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y12E(Test__ZN3ccc8CC4x0y12E, "_ZN3ccc8CC4x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y12C1Ev();
extern void _ZN3ccc8CC4x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y12E[] = {
  NSPAIR(_ZN3ccc8CC4x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x0y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y123abcEv,_ZThn4_N3ccc8CC4x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y123abcEv,_ZThn4_N3ccc8CC4x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y12E[];
Class_Descriptor cd__ZN3ccc8CC4x0y12E = {  "_ZN3ccc8CC4x0y12E", // class name
  bases__ZN3ccc8CC4x0y12E, 2,
  &(vtc__ZN3ccc8CC4x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y13  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC4x0y133efgEv
  ~CC4x0y13(); // tgen
  CC4x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x0y133efgEv");}
ccc::CC4x0y13 ::~CC4x0y13(){ note_dtor("_ZN3ccc8CC4x0y13E", this);} // tgen
ccc::CC4x0y13 ::CC4x0y13(){ note_ctor("_ZN3ccc8CC4x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y13E, buf);
    ::ccc::CC4x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y13E);
    dp->::ccc::CC4x0y13::~CC4x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y13E(Test__ZN3ccc8CC4x0y13E, "_ZN3ccc8CC4x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y13C1Ev();
extern void _ZN3ccc8CC4x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y13E[] = {
  NSPAIR(_ZN3ccc8CC4x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y133efgEv,_ZThn4_N3ccc8CC4x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y133efgEv,_ZThn4_N3ccc8CC4x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y13E[];
Class_Descriptor cd__ZN3ccc8CC4x0y13E = {  "_ZN3ccc8CC4x0y13E", // class name
  bases__ZN3ccc8CC4x0y13E, 2,
  &(vtc__ZN3ccc8CC4x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y14  : ::ccc::AA4 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC4x0y143pqrEv
  ~CC4x0y14(); // tgen
  CC4x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x0y143pqrEv");}
ccc::CC4x0y14 ::~CC4x0y14(){ note_dtor("_ZN3ccc8CC4x0y14E", this);} // tgen
ccc::CC4x0y14 ::CC4x0y14(){ note_ctor("_ZN3ccc8CC4x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y14E, buf);
    ::ccc::CC4x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y14E);
    dp->::ccc::CC4x0y14::~CC4x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y14E(Test__ZN3ccc8CC4x0y14E, "_ZN3ccc8CC4x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y14C1Ev();
extern void _ZN3ccc8CC4x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y14E[] = {
  NSPAIR(_ZN3ccc8CC4x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y14E[];
extern void _ZN3ccc8CC4x0y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x0y143pqrEv,_ZThn4_N3ccc8CC4x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x0y143pqrEv,_ZThn4_N3ccc8CC4x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y14E[];
Class_Descriptor cd__ZN3ccc8CC4x0y14E = {  "_ZN3ccc8CC4x0y14E", // class name
  bases__ZN3ccc8CC4x0y14E, 2,
  &(vtc__ZN3ccc8CC4x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x0y15  : ::ccc::AA4 , ::ccc::BB0 {
  ~CC4x0y15(); // tgen
  CC4x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x0y15 ::~CC4x0y15(){ note_dtor("_ZN3ccc8CC4x0y15E", this);} // tgen
ccc::CC4x0y15 ::CC4x0y15(){ note_ctor("_ZN3ccc8CC4x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x0y15E, buf);
    ::ccc::CC4x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x0y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC4x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x0y15E);
    dp->::ccc::CC4x0y15::~CC4x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x0y15E(Test__ZN3ccc8CC4x0y15E, "_ZN3ccc8CC4x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x0y15C1Ev();
extern void _ZN3ccc8CC4x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x0y15E[] = {
  NSPAIR(_ZN3ccc8CC4x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC4x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x0y15E[];
Class_Descriptor cd__ZN3ccc8CC4x0y15E = {  "_ZN3ccc8CC4x0y15E", // class name
  bases__ZN3ccc8CC4x0y15E, 2,
  &(vtc__ZN3ccc8CC4x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y0  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y03pqrEv
  ~CC4x1y0(); // tgen
  CC4x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y0E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y03abcEv");}
void  ccc::CC4x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y03efgEv");}
void  ccc::CC4x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y03pqrEv");}
ccc::CC4x1y0 ::~CC4x1y0(){ note_dtor("_ZN3ccc7CC4x1y0E", this);} // tgen
ccc::CC4x1y0 ::CC4x1y0(){ note_ctor("_ZN3ccc7CC4x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y0E, buf);
    ::ccc::CC4x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y0E);
    dp->::ccc::CC4x1y0::~CC4x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y0E(Test__ZN3ccc7CC4x1y0E, "_ZN3ccc7CC4x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y0C1Ev();
extern void _ZN3ccc7CC4x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y0E[] = {
  NSPAIR(_ZN3ccc7CC4x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y0E[];
extern void _ZN3ccc7CC4x1y03pqrEv();
extern void _ZN3ccc7CC4x1y03abcEv();
extern void _ZN3ccc7CC4x1y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03abcEv,_ZThn4_N3ccc7CC4x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03pqrEv,_ZThn4_N3ccc7CC4x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y03efgEv,_ZThn4_N3ccc7CC4x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y03abcEv,_ZThn4_N3ccc7CC4x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y03pqrEv,_ZThn4_N3ccc7CC4x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y03efgEv,_ZThn4_N3ccc7CC4x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y0E[];
Class_Descriptor cd__ZN3ccc7CC4x1y0E = {  "_ZN3ccc7CC4x1y0E", // class name
  bases__ZN3ccc7CC4x1y0E, 2,
  &(vtc__ZN3ccc7CC4x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y1  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x1y13efgEv
  ~CC4x1y1(); // tgen
  CC4x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y1E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y13abcEv");}
void  ccc::CC4x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y13pqrEv");}
void  ccc::CC4x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y13efgEv");}
ccc::CC4x1y1 ::~CC4x1y1(){ note_dtor("_ZN3ccc7CC4x1y1E", this);} // tgen
ccc::CC4x1y1 ::CC4x1y1(){ note_ctor("_ZN3ccc7CC4x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y1E, buf);
    ::ccc::CC4x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y1E);
    dp->::ccc::CC4x1y1::~CC4x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y1E(Test__ZN3ccc7CC4x1y1E, "_ZN3ccc7CC4x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y1C1Ev();
extern void _ZN3ccc7CC4x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y1E[] = {
  NSPAIR(_ZN3ccc7CC4x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y1E[];
extern void _ZN3ccc7CC4x1y13pqrEv();
extern void _ZN3ccc7CC4x1y13abcEv();
extern void _ZN3ccc7CC4x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13abcEv,_ZThn4_N3ccc7CC4x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13pqrEv,_ZThn4_N3ccc7CC4x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y13efgEv,_ZThn4_N3ccc7CC4x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y13abcEv,_ZThn4_N3ccc7CC4x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y13pqrEv,_ZThn4_N3ccc7CC4x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y13efgEv,_ZThn4_N3ccc7CC4x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y1E[];
Class_Descriptor cd__ZN3ccc7CC4x1y1E = {  "_ZN3ccc7CC4x1y1E", // class name
  bases__ZN3ccc7CC4x1y1E, 2,
  &(vtc__ZN3ccc7CC4x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y2  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y23pqrEv
  ~CC4x1y2(); // tgen
  CC4x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y2E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y23efgEv");}
void  ccc::CC4x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y23abcEv");}
void  ccc::CC4x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y23pqrEv");}
ccc::CC4x1y2 ::~CC4x1y2(){ note_dtor("_ZN3ccc7CC4x1y2E", this);} // tgen
ccc::CC4x1y2 ::CC4x1y2(){ note_ctor("_ZN3ccc7CC4x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y2E, buf);
    ::ccc::CC4x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y2E);
    dp->::ccc::CC4x1y2::~CC4x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y2E(Test__ZN3ccc7CC4x1y2E, "_ZN3ccc7CC4x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y2C1Ev();
extern void _ZN3ccc7CC4x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y2E[] = {
  NSPAIR(_ZN3ccc7CC4x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y2E[];
extern void _ZN3ccc7CC4x1y23pqrEv();
extern void _ZN3ccc7CC4x1y23abcEv();
extern void _ZN3ccc7CC4x1y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23abcEv,_ZThn4_N3ccc7CC4x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23pqrEv,_ZThn4_N3ccc7CC4x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y23efgEv,_ZThn4_N3ccc7CC4x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y23abcEv,_ZThn4_N3ccc7CC4x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y23pqrEv,_ZThn4_N3ccc7CC4x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y23efgEv,_ZThn4_N3ccc7CC4x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y2E[];
Class_Descriptor cd__ZN3ccc7CC4x1y2E = {  "_ZN3ccc7CC4x1y2E", // class name
  bases__ZN3ccc7CC4x1y2E, 2,
  &(vtc__ZN3ccc7CC4x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y3  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x1y33abcEv
  ~CC4x1y3(); // tgen
  CC4x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y3E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y33efgEv");}
void  ccc::CC4x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y33pqrEv");}
void  ccc::CC4x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y33abcEv");}
ccc::CC4x1y3 ::~CC4x1y3(){ note_dtor("_ZN3ccc7CC4x1y3E", this);} // tgen
ccc::CC4x1y3 ::CC4x1y3(){ note_ctor("_ZN3ccc7CC4x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y3E, buf);
    ::ccc::CC4x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y3E);
    dp->::ccc::CC4x1y3::~CC4x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y3E(Test__ZN3ccc7CC4x1y3E, "_ZN3ccc7CC4x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y3C1Ev();
extern void _ZN3ccc7CC4x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y3E[] = {
  NSPAIR(_ZN3ccc7CC4x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y3E[];
extern void _ZN3ccc7CC4x1y33pqrEv();
extern void _ZN3ccc7CC4x1y33abcEv();
extern void _ZN3ccc7CC4x1y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33abcEv,_ZThn4_N3ccc7CC4x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33pqrEv,_ZThn4_N3ccc7CC4x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y33efgEv,_ZThn4_N3ccc7CC4x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y33abcEv,_ZThn4_N3ccc7CC4x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y33pqrEv,_ZThn4_N3ccc7CC4x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y33efgEv,_ZThn4_N3ccc7CC4x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y3E[];
Class_Descriptor cd__ZN3ccc7CC4x1y3E = {  "_ZN3ccc7CC4x1y3E", // class name
  bases__ZN3ccc7CC4x1y3E, 2,
  &(vtc__ZN3ccc7CC4x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y4  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC4x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y43efgEv
  ~CC4x1y4(); // tgen
  CC4x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y4E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y43pqrEv");}
void  ccc::CC4x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y43abcEv");}
void  ccc::CC4x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y43efgEv");}
ccc::CC4x1y4 ::~CC4x1y4(){ note_dtor("_ZN3ccc7CC4x1y4E", this);} // tgen
ccc::CC4x1y4 ::CC4x1y4(){ note_ctor("_ZN3ccc7CC4x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y4E, buf);
    ::ccc::CC4x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y4E);
    dp->::ccc::CC4x1y4::~CC4x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y4E(Test__ZN3ccc7CC4x1y4E, "_ZN3ccc7CC4x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y4C1Ev();
extern void _ZN3ccc7CC4x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y4E[] = {
  NSPAIR(_ZN3ccc7CC4x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y4E[];
extern void _ZN3ccc7CC4x1y43pqrEv();
extern void _ZN3ccc7CC4x1y43abcEv();
extern void _ZN3ccc7CC4x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43abcEv,_ZThn4_N3ccc7CC4x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43pqrEv,_ZThn4_N3ccc7CC4x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y43efgEv,_ZThn4_N3ccc7CC4x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y43abcEv,_ZThn4_N3ccc7CC4x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y43pqrEv,_ZThn4_N3ccc7CC4x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y43efgEv,_ZThn4_N3ccc7CC4x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y4E[];
Class_Descriptor cd__ZN3ccc7CC4x1y4E = {  "_ZN3ccc7CC4x1y4E", // class name
  bases__ZN3ccc7CC4x1y4E, 2,
  &(vtc__ZN3ccc7CC4x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y5  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC4x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y53abcEv
  ~CC4x1y5(); // tgen
  CC4x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y5E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y53pqrEv");}
void  ccc::CC4x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y53efgEv");}
void  ccc::CC4x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y53abcEv");}
ccc::CC4x1y5 ::~CC4x1y5(){ note_dtor("_ZN3ccc7CC4x1y5E", this);} // tgen
ccc::CC4x1y5 ::CC4x1y5(){ note_ctor("_ZN3ccc7CC4x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y5E, buf);
    ::ccc::CC4x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y5E);
    dp->::ccc::CC4x1y5::~CC4x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y5E(Test__ZN3ccc7CC4x1y5E, "_ZN3ccc7CC4x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y5C1Ev();
extern void _ZN3ccc7CC4x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y5E[] = {
  NSPAIR(_ZN3ccc7CC4x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y5E[];
extern void _ZN3ccc7CC4x1y53pqrEv();
extern void _ZN3ccc7CC4x1y53abcEv();
extern void _ZN3ccc7CC4x1y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53abcEv,_ZThn4_N3ccc7CC4x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53pqrEv,_ZThn4_N3ccc7CC4x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y53efgEv,_ZThn4_N3ccc7CC4x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y53abcEv,_ZThn4_N3ccc7CC4x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y53pqrEv,_ZThn4_N3ccc7CC4x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y53efgEv,_ZThn4_N3ccc7CC4x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y5E[];
Class_Descriptor cd__ZN3ccc7CC4x1y5E = {  "_ZN3ccc7CC4x1y5E", // class name
  bases__ZN3ccc7CC4x1y5E, 2,
  &(vtc__ZN3ccc7CC4x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y6  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x1y63efgEv
  ~CC4x1y6(); // tgen
  CC4x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y6E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y63abcEv");}
void  ccc::CC4x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y63efgEv");}
ccc::CC4x1y6 ::~CC4x1y6(){ note_dtor("_ZN3ccc7CC4x1y6E", this);} // tgen
ccc::CC4x1y6 ::CC4x1y6(){ note_ctor("_ZN3ccc7CC4x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y6E, buf);
    ::ccc::CC4x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y6E);
    dp->::ccc::CC4x1y6::~CC4x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y6E(Test__ZN3ccc7CC4x1y6E, "_ZN3ccc7CC4x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y6C1Ev();
extern void _ZN3ccc7CC4x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y6E[] = {
  NSPAIR(_ZN3ccc7CC4x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x1y63abcEv();
extern void _ZN3ccc7CC4x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y63abcEv,_ZThn4_N3ccc7CC4x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y63efgEv,_ZThn4_N3ccc7CC4x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y63abcEv,_ZThn4_N3ccc7CC4x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y63efgEv,_ZThn4_N3ccc7CC4x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y6E[];
Class_Descriptor cd__ZN3ccc7CC4x1y6E = {  "_ZN3ccc7CC4x1y6E", // class name
  bases__ZN3ccc7CC4x1y6E, 2,
  &(vtc__ZN3ccc7CC4x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y7  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC4x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y73pqrEv
  ~CC4x1y7(); // tgen
  CC4x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y7E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y73abcEv");}
void  ccc::CC4x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y73pqrEv");}
ccc::CC4x1y7 ::~CC4x1y7(){ note_dtor("_ZN3ccc7CC4x1y7E", this);} // tgen
ccc::CC4x1y7 ::CC4x1y7(){ note_ctor("_ZN3ccc7CC4x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y7E, buf);
    ::ccc::CC4x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y7E);
    dp->::ccc::CC4x1y7::~CC4x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y7E(Test__ZN3ccc7CC4x1y7E, "_ZN3ccc7CC4x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y7C1Ev();
extern void _ZN3ccc7CC4x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y7E[] = {
  NSPAIR(_ZN3ccc7CC4x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y7E[];
extern void _ZN3ccc7CC4x1y73pqrEv();
extern void _ZN3ccc7CC4x1y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y73abcEv,_ZThn4_N3ccc7CC4x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y73pqrEv,_ZThn4_N3ccc7CC4x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y73abcEv,_ZThn4_N3ccc7CC4x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y73pqrEv,_ZThn4_N3ccc7CC4x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y7E[];
Class_Descriptor cd__ZN3ccc7CC4x1y7E = {  "_ZN3ccc7CC4x1y7E", // class name
  bases__ZN3ccc7CC4x1y7E, 2,
  &(vtc__ZN3ccc7CC4x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y8  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x1y83abcEv
  ~CC4x1y8(); // tgen
  CC4x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y8E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y83efgEv");}
void  ccc::CC4x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x1y83abcEv");}
ccc::CC4x1y8 ::~CC4x1y8(){ note_dtor("_ZN3ccc7CC4x1y8E", this);} // tgen
ccc::CC4x1y8 ::CC4x1y8(){ note_ctor("_ZN3ccc7CC4x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y8E, buf);
    ::ccc::CC4x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y8E);
    dp->::ccc::CC4x1y8::~CC4x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y8E(Test__ZN3ccc7CC4x1y8E, "_ZN3ccc7CC4x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y8C1Ev();
extern void _ZN3ccc7CC4x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y8E[] = {
  NSPAIR(_ZN3ccc7CC4x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x1y83abcEv();
extern void _ZN3ccc7CC4x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y83abcEv,_ZThn4_N3ccc7CC4x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y83efgEv,_ZThn4_N3ccc7CC4x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y83abcEv,_ZThn4_N3ccc7CC4x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y83efgEv,_ZThn4_N3ccc7CC4x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y8E[];
Class_Descriptor cd__ZN3ccc7CC4x1y8E = {  "_ZN3ccc7CC4x1y8E", // class name
  bases__ZN3ccc7CC4x1y8E, 2,
  &(vtc__ZN3ccc7CC4x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y9  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC4x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x1y93pqrEv
  ~CC4x1y9(); // tgen
  CC4x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x1y9E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x1y93efgEv");}
void  ccc::CC4x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x1y93pqrEv");}
ccc::CC4x1y9 ::~CC4x1y9(){ note_dtor("_ZN3ccc7CC4x1y9E", this);} // tgen
ccc::CC4x1y9 ::CC4x1y9(){ note_ctor("_ZN3ccc7CC4x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x1y9E, buf);
    ::ccc::CC4x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x1y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC4x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x1y9E);
    dp->::ccc::CC4x1y9::~CC4x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x1y9E(Test__ZN3ccc7CC4x1y9E, "_ZN3ccc7CC4x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x1y9C1Ev();
extern void _ZN3ccc7CC4x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x1y9E[] = {
  NSPAIR(_ZN3ccc7CC4x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC4x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y9E[];
extern void _ZN3ccc7CC4x1y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y93pqrEv,_ZThn4_N3ccc7CC4x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x1y93efgEv,_ZThn4_N3ccc7CC4x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y93pqrEv,_ZThn4_N3ccc7CC4x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x1y93efgEv,_ZThn4_N3ccc7CC4x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x1y9E[];
Class_Descriptor cd__ZN3ccc7CC4x1y9E = {  "_ZN3ccc7CC4x1y9E", // class name
  bases__ZN3ccc7CC4x1y9E, 2,
  &(vtc__ZN3ccc7CC4x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y10  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x1y103abcEv
  ~CC4x1y10(); // tgen
  CC4x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y10E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y103pqrEv");}
void  ccc::CC4x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x1y103abcEv");}
ccc::CC4x1y10 ::~CC4x1y10(){ note_dtor("_ZN3ccc8CC4x1y10E", this);} // tgen
ccc::CC4x1y10 ::CC4x1y10(){ note_ctor("_ZN3ccc8CC4x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y10E, buf);
    ::ccc::CC4x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y10E);
    dp->::ccc::CC4x1y10::~CC4x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y10E(Test__ZN3ccc8CC4x1y10E, "_ZN3ccc8CC4x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y10C1Ev();
extern void _ZN3ccc8CC4x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y10E[] = {
  NSPAIR(_ZN3ccc8CC4x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y10E[];
extern void _ZN3ccc8CC4x1y103pqrEv();
extern void _ZN3ccc8CC4x1y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y103abcEv,_ZThn4_N3ccc8CC4x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y103pqrEv,_ZThn4_N3ccc8CC4x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y103abcEv,_ZThn4_N3ccc8CC4x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y103pqrEv,_ZThn4_N3ccc8CC4x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y10E[];
Class_Descriptor cd__ZN3ccc8CC4x1y10E = {  "_ZN3ccc8CC4x1y10E", // class name
  bases__ZN3ccc8CC4x1y10E, 2,
  &(vtc__ZN3ccc8CC4x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y11  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x1y113efgEv
  ~CC4x1y11(); // tgen
  CC4x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y11E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y113pqrEv");}
void  ccc::CC4x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x1y113efgEv");}
ccc::CC4x1y11 ::~CC4x1y11(){ note_dtor("_ZN3ccc8CC4x1y11E", this);} // tgen
ccc::CC4x1y11 ::CC4x1y11(){ note_ctor("_ZN3ccc8CC4x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y11E, buf);
    ::ccc::CC4x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y11E);
    dp->::ccc::CC4x1y11::~CC4x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y11E(Test__ZN3ccc8CC4x1y11E, "_ZN3ccc8CC4x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y11C1Ev();
extern void _ZN3ccc8CC4x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y11E[] = {
  NSPAIR(_ZN3ccc8CC4x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y11E[];
extern void _ZN3ccc8CC4x1y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y113pqrEv,_ZThn4_N3ccc8CC4x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y113efgEv,_ZThn4_N3ccc8CC4x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y113pqrEv,_ZThn4_N3ccc8CC4x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y113efgEv,_ZThn4_N3ccc8CC4x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y11E[];
Class_Descriptor cd__ZN3ccc8CC4x1y11E = {  "_ZN3ccc8CC4x1y11E", // class name
  bases__ZN3ccc8CC4x1y11E, 2,
  &(vtc__ZN3ccc8CC4x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y12  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC4x1y123abcEv
  ~CC4x1y12(); // tgen
  CC4x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x1y123abcEv");}
ccc::CC4x1y12 ::~CC4x1y12(){ note_dtor("_ZN3ccc8CC4x1y12E", this);} // tgen
ccc::CC4x1y12 ::CC4x1y12(){ note_ctor("_ZN3ccc8CC4x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y12E, buf);
    ::ccc::CC4x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y12E);
    dp->::ccc::CC4x1y12::~CC4x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y12E(Test__ZN3ccc8CC4x1y12E, "_ZN3ccc8CC4x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y12C1Ev();
extern void _ZN3ccc8CC4x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y12E[] = {
  NSPAIR(_ZN3ccc8CC4x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x1y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y123abcEv,_ZThn4_N3ccc8CC4x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y123abcEv,_ZThn4_N3ccc8CC4x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y12E[];
Class_Descriptor cd__ZN3ccc8CC4x1y12E = {  "_ZN3ccc8CC4x1y12E", // class name
  bases__ZN3ccc8CC4x1y12E, 2,
  &(vtc__ZN3ccc8CC4x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y13  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC4x1y133efgEv
  ~CC4x1y13(); // tgen
  CC4x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x1y133efgEv");}
ccc::CC4x1y13 ::~CC4x1y13(){ note_dtor("_ZN3ccc8CC4x1y13E", this);} // tgen
ccc::CC4x1y13 ::CC4x1y13(){ note_ctor("_ZN3ccc8CC4x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y13E, buf);
    ::ccc::CC4x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y13E);
    dp->::ccc::CC4x1y13::~CC4x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y13E(Test__ZN3ccc8CC4x1y13E, "_ZN3ccc8CC4x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y13C1Ev();
extern void _ZN3ccc8CC4x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y13E[] = {
  NSPAIR(_ZN3ccc8CC4x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y133efgEv,_ZThn4_N3ccc8CC4x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y133efgEv,_ZThn4_N3ccc8CC4x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y13E[];
Class_Descriptor cd__ZN3ccc8CC4x1y13E = {  "_ZN3ccc8CC4x1y13E", // class name
  bases__ZN3ccc8CC4x1y13E, 2,
  &(vtc__ZN3ccc8CC4x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y14  : ::ccc::AA4 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC4x1y143pqrEv
  ~CC4x1y14(); // tgen
  CC4x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x1y143pqrEv");}
ccc::CC4x1y14 ::~CC4x1y14(){ note_dtor("_ZN3ccc8CC4x1y14E", this);} // tgen
ccc::CC4x1y14 ::CC4x1y14(){ note_ctor("_ZN3ccc8CC4x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y14E, buf);
    ::ccc::CC4x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y14E);
    dp->::ccc::CC4x1y14::~CC4x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y14E(Test__ZN3ccc8CC4x1y14E, "_ZN3ccc8CC4x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y14C1Ev();
extern void _ZN3ccc8CC4x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y14E[] = {
  NSPAIR(_ZN3ccc8CC4x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y14E[];
extern void _ZN3ccc8CC4x1y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x1y143pqrEv,_ZThn4_N3ccc8CC4x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x1y143pqrEv,_ZThn4_N3ccc8CC4x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y14E[];
Class_Descriptor cd__ZN3ccc8CC4x1y14E = {  "_ZN3ccc8CC4x1y14E", // class name
  bases__ZN3ccc8CC4x1y14E, 2,
  &(vtc__ZN3ccc8CC4x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x1y15  : ::ccc::AA4 , ::ccc::BB1 {
  ~CC4x1y15(); // tgen
  CC4x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x1y15 ::~CC4x1y15(){ note_dtor("_ZN3ccc8CC4x1y15E", this);} // tgen
ccc::CC4x1y15 ::CC4x1y15(){ note_ctor("_ZN3ccc8CC4x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x1y15E, buf);
    ::ccc::CC4x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x1y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC4x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x1y15E);
    dp->::ccc::CC4x1y15::~CC4x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x1y15E(Test__ZN3ccc8CC4x1y15E, "_ZN3ccc8CC4x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x1y15C1Ev();
extern void _ZN3ccc8CC4x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x1y15E[] = {
  NSPAIR(_ZN3ccc8CC4x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC4x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x1y15E[];
Class_Descriptor cd__ZN3ccc8CC4x1y15E = {  "_ZN3ccc8CC4x1y15E", // class name
  bases__ZN3ccc8CC4x1y15E, 2,
  &(vtc__ZN3ccc8CC4x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y0  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y03pqrEv
  ~CC4x2y0(); // tgen
  CC4x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y0E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y03abcEv");}
void  ccc::CC4x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y03efgEv");}
void  ccc::CC4x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y03pqrEv");}
ccc::CC4x2y0 ::~CC4x2y0(){ note_dtor("_ZN3ccc7CC4x2y0E", this);} // tgen
ccc::CC4x2y0 ::CC4x2y0(){ note_ctor("_ZN3ccc7CC4x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y0E, buf);
    ::ccc::CC4x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y0E);
    dp->::ccc::CC4x2y0::~CC4x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y0E(Test__ZN3ccc7CC4x2y0E, "_ZN3ccc7CC4x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y0C1Ev();
extern void _ZN3ccc7CC4x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y0E[] = {
  NSPAIR(_ZN3ccc7CC4x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y0E[];
extern void _ZN3ccc7CC4x2y03pqrEv();
extern void _ZN3ccc7CC4x2y03abcEv();
extern void _ZN3ccc7CC4x2y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03efgEv,_ZThn4_N3ccc7CC4x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03abcEv,_ZThn4_N3ccc7CC4x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y03pqrEv,_ZThn4_N3ccc7CC4x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y03efgEv,_ZThn4_N3ccc7CC4x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y03abcEv,_ZThn4_N3ccc7CC4x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y03pqrEv,_ZThn4_N3ccc7CC4x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y0E[];
Class_Descriptor cd__ZN3ccc7CC4x2y0E = {  "_ZN3ccc7CC4x2y0E", // class name
  bases__ZN3ccc7CC4x2y0E, 2,
  &(vtc__ZN3ccc7CC4x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y1  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x2y13efgEv
  ~CC4x2y1(); // tgen
  CC4x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y1E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y13abcEv");}
void  ccc::CC4x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y13pqrEv");}
void  ccc::CC4x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y13efgEv");}
ccc::CC4x2y1 ::~CC4x2y1(){ note_dtor("_ZN3ccc7CC4x2y1E", this);} // tgen
ccc::CC4x2y1 ::CC4x2y1(){ note_ctor("_ZN3ccc7CC4x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y1E, buf);
    ::ccc::CC4x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y1E);
    dp->::ccc::CC4x2y1::~CC4x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y1E(Test__ZN3ccc7CC4x2y1E, "_ZN3ccc7CC4x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y1C1Ev();
extern void _ZN3ccc7CC4x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y1E[] = {
  NSPAIR(_ZN3ccc7CC4x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y1E[];
extern void _ZN3ccc7CC4x2y13pqrEv();
extern void _ZN3ccc7CC4x2y13abcEv();
extern void _ZN3ccc7CC4x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13efgEv,_ZThn4_N3ccc7CC4x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13abcEv,_ZThn4_N3ccc7CC4x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y13pqrEv,_ZThn4_N3ccc7CC4x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y13efgEv,_ZThn4_N3ccc7CC4x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y13abcEv,_ZThn4_N3ccc7CC4x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y13pqrEv,_ZThn4_N3ccc7CC4x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y1E[];
Class_Descriptor cd__ZN3ccc7CC4x2y1E = {  "_ZN3ccc7CC4x2y1E", // class name
  bases__ZN3ccc7CC4x2y1E, 2,
  &(vtc__ZN3ccc7CC4x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y2  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y23pqrEv
  ~CC4x2y2(); // tgen
  CC4x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y2E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y23efgEv");}
void  ccc::CC4x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y23abcEv");}
void  ccc::CC4x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y23pqrEv");}
ccc::CC4x2y2 ::~CC4x2y2(){ note_dtor("_ZN3ccc7CC4x2y2E", this);} // tgen
ccc::CC4x2y2 ::CC4x2y2(){ note_ctor("_ZN3ccc7CC4x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y2E, buf);
    ::ccc::CC4x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y2E);
    dp->::ccc::CC4x2y2::~CC4x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y2E(Test__ZN3ccc7CC4x2y2E, "_ZN3ccc7CC4x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y2C1Ev();
extern void _ZN3ccc7CC4x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y2E[] = {
  NSPAIR(_ZN3ccc7CC4x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y2E[];
extern void _ZN3ccc7CC4x2y23pqrEv();
extern void _ZN3ccc7CC4x2y23abcEv();
extern void _ZN3ccc7CC4x2y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23efgEv,_ZThn4_N3ccc7CC4x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23abcEv,_ZThn4_N3ccc7CC4x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y23pqrEv,_ZThn4_N3ccc7CC4x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y23efgEv,_ZThn4_N3ccc7CC4x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y23abcEv,_ZThn4_N3ccc7CC4x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y23pqrEv,_ZThn4_N3ccc7CC4x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y2E[];
Class_Descriptor cd__ZN3ccc7CC4x2y2E = {  "_ZN3ccc7CC4x2y2E", // class name
  bases__ZN3ccc7CC4x2y2E, 2,
  &(vtc__ZN3ccc7CC4x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y3  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x2y33abcEv
  ~CC4x2y3(); // tgen
  CC4x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y3E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y33efgEv");}
void  ccc::CC4x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y33pqrEv");}
void  ccc::CC4x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y33abcEv");}
ccc::CC4x2y3 ::~CC4x2y3(){ note_dtor("_ZN3ccc7CC4x2y3E", this);} // tgen
ccc::CC4x2y3 ::CC4x2y3(){ note_ctor("_ZN3ccc7CC4x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y3E, buf);
    ::ccc::CC4x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y3E);
    dp->::ccc::CC4x2y3::~CC4x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y3E(Test__ZN3ccc7CC4x2y3E, "_ZN3ccc7CC4x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y3C1Ev();
extern void _ZN3ccc7CC4x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y3E[] = {
  NSPAIR(_ZN3ccc7CC4x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y3E[];
extern void _ZN3ccc7CC4x2y33pqrEv();
extern void _ZN3ccc7CC4x2y33abcEv();
extern void _ZN3ccc7CC4x2y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33efgEv,_ZThn4_N3ccc7CC4x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33abcEv,_ZThn4_N3ccc7CC4x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y33pqrEv,_ZThn4_N3ccc7CC4x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y33efgEv,_ZThn4_N3ccc7CC4x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y33abcEv,_ZThn4_N3ccc7CC4x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y33pqrEv,_ZThn4_N3ccc7CC4x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y3E[];
Class_Descriptor cd__ZN3ccc7CC4x2y3E = {  "_ZN3ccc7CC4x2y3E", // class name
  bases__ZN3ccc7CC4x2y3E, 2,
  &(vtc__ZN3ccc7CC4x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y4  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC4x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y43efgEv
  ~CC4x2y4(); // tgen
  CC4x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y4E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y43pqrEv");}
void  ccc::CC4x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y43abcEv");}
void  ccc::CC4x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y43efgEv");}
ccc::CC4x2y4 ::~CC4x2y4(){ note_dtor("_ZN3ccc7CC4x2y4E", this);} // tgen
ccc::CC4x2y4 ::CC4x2y4(){ note_ctor("_ZN3ccc7CC4x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y4E, buf);
    ::ccc::CC4x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y4E);
    dp->::ccc::CC4x2y4::~CC4x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y4E(Test__ZN3ccc7CC4x2y4E, "_ZN3ccc7CC4x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y4C1Ev();
extern void _ZN3ccc7CC4x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y4E[] = {
  NSPAIR(_ZN3ccc7CC4x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y4E[];
extern void _ZN3ccc7CC4x2y43pqrEv();
extern void _ZN3ccc7CC4x2y43abcEv();
extern void _ZN3ccc7CC4x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43efgEv,_ZThn4_N3ccc7CC4x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43abcEv,_ZThn4_N3ccc7CC4x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y43pqrEv,_ZThn4_N3ccc7CC4x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y43efgEv,_ZThn4_N3ccc7CC4x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y43abcEv,_ZThn4_N3ccc7CC4x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y43pqrEv,_ZThn4_N3ccc7CC4x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y4E[];
Class_Descriptor cd__ZN3ccc7CC4x2y4E = {  "_ZN3ccc7CC4x2y4E", // class name
  bases__ZN3ccc7CC4x2y4E, 2,
  &(vtc__ZN3ccc7CC4x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y5  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC4x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y53abcEv
  ~CC4x2y5(); // tgen
  CC4x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y5E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y53pqrEv");}
void  ccc::CC4x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y53efgEv");}
void  ccc::CC4x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y53abcEv");}
ccc::CC4x2y5 ::~CC4x2y5(){ note_dtor("_ZN3ccc7CC4x2y5E", this);} // tgen
ccc::CC4x2y5 ::CC4x2y5(){ note_ctor("_ZN3ccc7CC4x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y5E, buf);
    ::ccc::CC4x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y5E);
    dp->::ccc::CC4x2y5::~CC4x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y5E(Test__ZN3ccc7CC4x2y5E, "_ZN3ccc7CC4x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y5C1Ev();
extern void _ZN3ccc7CC4x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y5E[] = {
  NSPAIR(_ZN3ccc7CC4x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y5E[];
extern void _ZN3ccc7CC4x2y53pqrEv();
extern void _ZN3ccc7CC4x2y53abcEv();
extern void _ZN3ccc7CC4x2y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53efgEv,_ZThn4_N3ccc7CC4x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53abcEv,_ZThn4_N3ccc7CC4x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y53pqrEv,_ZThn4_N3ccc7CC4x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y53efgEv,_ZThn4_N3ccc7CC4x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y53abcEv,_ZThn4_N3ccc7CC4x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y53pqrEv,_ZThn4_N3ccc7CC4x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y5E[];
Class_Descriptor cd__ZN3ccc7CC4x2y5E = {  "_ZN3ccc7CC4x2y5E", // class name
  bases__ZN3ccc7CC4x2y5E, 2,
  &(vtc__ZN3ccc7CC4x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y6  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x2y63efgEv
  ~CC4x2y6(); // tgen
  CC4x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y6E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y63abcEv");}
void  ccc::CC4x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y63efgEv");}
ccc::CC4x2y6 ::~CC4x2y6(){ note_dtor("_ZN3ccc7CC4x2y6E", this);} // tgen
ccc::CC4x2y6 ::CC4x2y6(){ note_ctor("_ZN3ccc7CC4x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y6E, buf);
    ::ccc::CC4x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y6E);
    dp->::ccc::CC4x2y6::~CC4x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y6E(Test__ZN3ccc7CC4x2y6E, "_ZN3ccc7CC4x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y6C1Ev();
extern void _ZN3ccc7CC4x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y6E[] = {
  NSPAIR(_ZN3ccc7CC4x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x2y63abcEv();
extern void _ZN3ccc7CC4x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y63efgEv,_ZThn4_N3ccc7CC4x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y63abcEv,_ZThn4_N3ccc7CC4x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y63efgEv,_ZThn4_N3ccc7CC4x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y63abcEv,_ZThn4_N3ccc7CC4x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y6E[];
Class_Descriptor cd__ZN3ccc7CC4x2y6E = {  "_ZN3ccc7CC4x2y6E", // class name
  bases__ZN3ccc7CC4x2y6E, 2,
  &(vtc__ZN3ccc7CC4x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y7  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC4x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y73pqrEv
  ~CC4x2y7(); // tgen
  CC4x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y7E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y73abcEv");}
void  ccc::CC4x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y73pqrEv");}
ccc::CC4x2y7 ::~CC4x2y7(){ note_dtor("_ZN3ccc7CC4x2y7E", this);} // tgen
ccc::CC4x2y7 ::CC4x2y7(){ note_ctor("_ZN3ccc7CC4x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y7E, buf);
    ::ccc::CC4x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y7E);
    dp->::ccc::CC4x2y7::~CC4x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y7E(Test__ZN3ccc7CC4x2y7E, "_ZN3ccc7CC4x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y7C1Ev();
extern void _ZN3ccc7CC4x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y7E[] = {
  NSPAIR(_ZN3ccc7CC4x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y7E[];
extern void _ZN3ccc7CC4x2y73pqrEv();
extern void _ZN3ccc7CC4x2y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y73abcEv,_ZThn4_N3ccc7CC4x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y73pqrEv,_ZThn4_N3ccc7CC4x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y73abcEv,_ZThn4_N3ccc7CC4x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y73pqrEv,_ZThn4_N3ccc7CC4x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y7E[];
Class_Descriptor cd__ZN3ccc7CC4x2y7E = {  "_ZN3ccc7CC4x2y7E", // class name
  bases__ZN3ccc7CC4x2y7E, 2,
  &(vtc__ZN3ccc7CC4x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y8  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x2y83abcEv
  ~CC4x2y8(); // tgen
  CC4x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y8E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y83efgEv");}
void  ccc::CC4x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x2y83abcEv");}
ccc::CC4x2y8 ::~CC4x2y8(){ note_dtor("_ZN3ccc7CC4x2y8E", this);} // tgen
ccc::CC4x2y8 ::CC4x2y8(){ note_ctor("_ZN3ccc7CC4x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y8E, buf);
    ::ccc::CC4x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y8E);
    dp->::ccc::CC4x2y8::~CC4x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y8E(Test__ZN3ccc7CC4x2y8E, "_ZN3ccc7CC4x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y8C1Ev();
extern void _ZN3ccc7CC4x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y8E[] = {
  NSPAIR(_ZN3ccc7CC4x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x2y83abcEv();
extern void _ZN3ccc7CC4x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y83efgEv,_ZThn4_N3ccc7CC4x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y83abcEv,_ZThn4_N3ccc7CC4x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y83efgEv,_ZThn4_N3ccc7CC4x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y83abcEv,_ZThn4_N3ccc7CC4x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y8E[];
Class_Descriptor cd__ZN3ccc7CC4x2y8E = {  "_ZN3ccc7CC4x2y8E", // class name
  bases__ZN3ccc7CC4x2y8E, 2,
  &(vtc__ZN3ccc7CC4x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y9  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC4x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x2y93pqrEv
  ~CC4x2y9(); // tgen
  CC4x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x2y9E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x2y93efgEv");}
void  ccc::CC4x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x2y93pqrEv");}
ccc::CC4x2y9 ::~CC4x2y9(){ note_dtor("_ZN3ccc7CC4x2y9E", this);} // tgen
ccc::CC4x2y9 ::CC4x2y9(){ note_ctor("_ZN3ccc7CC4x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x2y9E, buf);
    ::ccc::CC4x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x2y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC4x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x2y9E);
    dp->::ccc::CC4x2y9::~CC4x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x2y9E(Test__ZN3ccc7CC4x2y9E, "_ZN3ccc7CC4x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x2y9C1Ev();
extern void _ZN3ccc7CC4x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x2y9E[] = {
  NSPAIR(_ZN3ccc7CC4x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC4x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y9E[];
extern void _ZN3ccc7CC4x2y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y93efgEv,_ZThn4_N3ccc7CC4x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x2y93pqrEv,_ZThn4_N3ccc7CC4x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y93efgEv,_ZThn4_N3ccc7CC4x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x2y93pqrEv,_ZThn4_N3ccc7CC4x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x2y9E[];
Class_Descriptor cd__ZN3ccc7CC4x2y9E = {  "_ZN3ccc7CC4x2y9E", // class name
  bases__ZN3ccc7CC4x2y9E, 2,
  &(vtc__ZN3ccc7CC4x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y10  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x2y103abcEv
  ~CC4x2y10(); // tgen
  CC4x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y10E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y103pqrEv");}
void  ccc::CC4x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x2y103abcEv");}
ccc::CC4x2y10 ::~CC4x2y10(){ note_dtor("_ZN3ccc8CC4x2y10E", this);} // tgen
ccc::CC4x2y10 ::CC4x2y10(){ note_ctor("_ZN3ccc8CC4x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y10E, buf);
    ::ccc::CC4x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y10E);
    dp->::ccc::CC4x2y10::~CC4x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y10E(Test__ZN3ccc8CC4x2y10E, "_ZN3ccc8CC4x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y10C1Ev();
extern void _ZN3ccc8CC4x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y10E[] = {
  NSPAIR(_ZN3ccc8CC4x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y10E[];
extern void _ZN3ccc8CC4x2y103pqrEv();
extern void _ZN3ccc8CC4x2y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y103abcEv,_ZThn4_N3ccc8CC4x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y103pqrEv,_ZThn4_N3ccc8CC4x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y103abcEv,_ZThn4_N3ccc8CC4x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y103pqrEv,_ZThn4_N3ccc8CC4x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y10E[];
Class_Descriptor cd__ZN3ccc8CC4x2y10E = {  "_ZN3ccc8CC4x2y10E", // class name
  bases__ZN3ccc8CC4x2y10E, 2,
  &(vtc__ZN3ccc8CC4x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y11  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x2y113efgEv
  ~CC4x2y11(); // tgen
  CC4x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y11E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y113pqrEv");}
void  ccc::CC4x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x2y113efgEv");}
ccc::CC4x2y11 ::~CC4x2y11(){ note_dtor("_ZN3ccc8CC4x2y11E", this);} // tgen
ccc::CC4x2y11 ::CC4x2y11(){ note_ctor("_ZN3ccc8CC4x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y11E, buf);
    ::ccc::CC4x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y11E);
    dp->::ccc::CC4x2y11::~CC4x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y11E(Test__ZN3ccc8CC4x2y11E, "_ZN3ccc8CC4x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y11C1Ev();
extern void _ZN3ccc8CC4x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y11E[] = {
  NSPAIR(_ZN3ccc8CC4x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y11E[];
extern void _ZN3ccc8CC4x2y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y113efgEv,_ZThn4_N3ccc8CC4x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y113pqrEv,_ZThn4_N3ccc8CC4x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y113efgEv,_ZThn4_N3ccc8CC4x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y113pqrEv,_ZThn4_N3ccc8CC4x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y11E[];
Class_Descriptor cd__ZN3ccc8CC4x2y11E = {  "_ZN3ccc8CC4x2y11E", // class name
  bases__ZN3ccc8CC4x2y11E, 2,
  &(vtc__ZN3ccc8CC4x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y12  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC4x2y123abcEv
  ~CC4x2y12(); // tgen
  CC4x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x2y123abcEv");}
ccc::CC4x2y12 ::~CC4x2y12(){ note_dtor("_ZN3ccc8CC4x2y12E", this);} // tgen
ccc::CC4x2y12 ::CC4x2y12(){ note_ctor("_ZN3ccc8CC4x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y12E, buf);
    ::ccc::CC4x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y12E);
    dp->::ccc::CC4x2y12::~CC4x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y12E(Test__ZN3ccc8CC4x2y12E, "_ZN3ccc8CC4x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y12C1Ev();
extern void _ZN3ccc8CC4x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y12E[] = {
  NSPAIR(_ZN3ccc8CC4x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x2y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y123abcEv,_ZThn4_N3ccc8CC4x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y123abcEv,_ZThn4_N3ccc8CC4x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y12E[];
Class_Descriptor cd__ZN3ccc8CC4x2y12E = {  "_ZN3ccc8CC4x2y12E", // class name
  bases__ZN3ccc8CC4x2y12E, 2,
  &(vtc__ZN3ccc8CC4x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y13  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC4x2y133efgEv
  ~CC4x2y13(); // tgen
  CC4x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x2y133efgEv");}
ccc::CC4x2y13 ::~CC4x2y13(){ note_dtor("_ZN3ccc8CC4x2y13E", this);} // tgen
ccc::CC4x2y13 ::CC4x2y13(){ note_ctor("_ZN3ccc8CC4x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y13E, buf);
    ::ccc::CC4x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y13E);
    dp->::ccc::CC4x2y13::~CC4x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y13E(Test__ZN3ccc8CC4x2y13E, "_ZN3ccc8CC4x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y13C1Ev();
extern void _ZN3ccc8CC4x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y13E[] = {
  NSPAIR(_ZN3ccc8CC4x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y133efgEv,_ZThn4_N3ccc8CC4x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y133efgEv,_ZThn4_N3ccc8CC4x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y13E[];
Class_Descriptor cd__ZN3ccc8CC4x2y13E = {  "_ZN3ccc8CC4x2y13E", // class name
  bases__ZN3ccc8CC4x2y13E, 2,
  &(vtc__ZN3ccc8CC4x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y14  : ::ccc::AA4 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC4x2y143pqrEv
  ~CC4x2y14(); // tgen
  CC4x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x2y143pqrEv");}
ccc::CC4x2y14 ::~CC4x2y14(){ note_dtor("_ZN3ccc8CC4x2y14E", this);} // tgen
ccc::CC4x2y14 ::CC4x2y14(){ note_ctor("_ZN3ccc8CC4x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y14E, buf);
    ::ccc::CC4x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y14E);
    dp->::ccc::CC4x2y14::~CC4x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y14E(Test__ZN3ccc8CC4x2y14E, "_ZN3ccc8CC4x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y14C1Ev();
extern void _ZN3ccc8CC4x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y14E[] = {
  NSPAIR(_ZN3ccc8CC4x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y14E[];
extern void _ZN3ccc8CC4x2y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x2y143pqrEv,_ZThn4_N3ccc8CC4x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x2y143pqrEv,_ZThn4_N3ccc8CC4x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y14E[];
Class_Descriptor cd__ZN3ccc8CC4x2y14E = {  "_ZN3ccc8CC4x2y14E", // class name
  bases__ZN3ccc8CC4x2y14E, 2,
  &(vtc__ZN3ccc8CC4x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x2y15  : ::ccc::AA4 , ::ccc::BB2 {
  ~CC4x2y15(); // tgen
  CC4x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x2y15 ::~CC4x2y15(){ note_dtor("_ZN3ccc8CC4x2y15E", this);} // tgen
ccc::CC4x2y15 ::CC4x2y15(){ note_ctor("_ZN3ccc8CC4x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x2y15E, buf);
    ::ccc::CC4x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x2y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC4x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x2y15E);
    dp->::ccc::CC4x2y15::~CC4x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x2y15E(Test__ZN3ccc8CC4x2y15E, "_ZN3ccc8CC4x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x2y15C1Ev();
extern void _ZN3ccc8CC4x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x2y15E[] = {
  NSPAIR(_ZN3ccc8CC4x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC4x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x2y15E[];
Class_Descriptor cd__ZN3ccc8CC4x2y15E = {  "_ZN3ccc8CC4x2y15E", // class name
  bases__ZN3ccc8CC4x2y15E, 2,
  &(vtc__ZN3ccc8CC4x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y0  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y03pqrEv
  ~CC4x3y0(); // tgen
  CC4x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y0E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y03abcEv");}
void  ccc::CC4x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y03efgEv");}
void  ccc::CC4x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y03pqrEv");}
ccc::CC4x3y0 ::~CC4x3y0(){ note_dtor("_ZN3ccc7CC4x3y0E", this);} // tgen
ccc::CC4x3y0 ::CC4x3y0(){ note_ctor("_ZN3ccc7CC4x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y0E, buf);
    ::ccc::CC4x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y0E);
    dp->::ccc::CC4x3y0::~CC4x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y0E(Test__ZN3ccc7CC4x3y0E, "_ZN3ccc7CC4x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y0C1Ev();
extern void _ZN3ccc7CC4x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y0E[] = {
  NSPAIR(_ZN3ccc7CC4x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y0E[];
extern void _ZN3ccc7CC4x3y03pqrEv();
extern void _ZN3ccc7CC4x3y03abcEv();
extern void _ZN3ccc7CC4x3y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03efgEv,_ZThn4_N3ccc7CC4x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03pqrEv,_ZThn4_N3ccc7CC4x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y03abcEv,_ZThn4_N3ccc7CC4x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y03efgEv,_ZThn4_N3ccc7CC4x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y03pqrEv,_ZThn4_N3ccc7CC4x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y03abcEv,_ZThn4_N3ccc7CC4x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y0E[];
Class_Descriptor cd__ZN3ccc7CC4x3y0E = {  "_ZN3ccc7CC4x3y0E", // class name
  bases__ZN3ccc7CC4x3y0E, 2,
  &(vtc__ZN3ccc7CC4x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y1  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x3y13efgEv
  ~CC4x3y1(); // tgen
  CC4x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y1E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y13abcEv");}
void  ccc::CC4x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y13pqrEv");}
void  ccc::CC4x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y13efgEv");}
ccc::CC4x3y1 ::~CC4x3y1(){ note_dtor("_ZN3ccc7CC4x3y1E", this);} // tgen
ccc::CC4x3y1 ::CC4x3y1(){ note_ctor("_ZN3ccc7CC4x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y1E, buf);
    ::ccc::CC4x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y1E);
    dp->::ccc::CC4x3y1::~CC4x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y1E(Test__ZN3ccc7CC4x3y1E, "_ZN3ccc7CC4x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y1C1Ev();
extern void _ZN3ccc7CC4x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y1E[] = {
  NSPAIR(_ZN3ccc7CC4x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y1E[];
extern void _ZN3ccc7CC4x3y13pqrEv();
extern void _ZN3ccc7CC4x3y13abcEv();
extern void _ZN3ccc7CC4x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13efgEv,_ZThn4_N3ccc7CC4x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13pqrEv,_ZThn4_N3ccc7CC4x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y13abcEv,_ZThn4_N3ccc7CC4x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y13efgEv,_ZThn4_N3ccc7CC4x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y13pqrEv,_ZThn4_N3ccc7CC4x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y13abcEv,_ZThn4_N3ccc7CC4x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y1E[];
Class_Descriptor cd__ZN3ccc7CC4x3y1E = {  "_ZN3ccc7CC4x3y1E", // class name
  bases__ZN3ccc7CC4x3y1E, 2,
  &(vtc__ZN3ccc7CC4x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y2  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y23pqrEv
  ~CC4x3y2(); // tgen
  CC4x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y2E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y23efgEv");}
void  ccc::CC4x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y23abcEv");}
void  ccc::CC4x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y23pqrEv");}
ccc::CC4x3y2 ::~CC4x3y2(){ note_dtor("_ZN3ccc7CC4x3y2E", this);} // tgen
ccc::CC4x3y2 ::CC4x3y2(){ note_ctor("_ZN3ccc7CC4x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y2E, buf);
    ::ccc::CC4x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y2E);
    dp->::ccc::CC4x3y2::~CC4x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y2E(Test__ZN3ccc7CC4x3y2E, "_ZN3ccc7CC4x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y2C1Ev();
extern void _ZN3ccc7CC4x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y2E[] = {
  NSPAIR(_ZN3ccc7CC4x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y2E[];
extern void _ZN3ccc7CC4x3y23pqrEv();
extern void _ZN3ccc7CC4x3y23abcEv();
extern void _ZN3ccc7CC4x3y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23efgEv,_ZThn4_N3ccc7CC4x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23pqrEv,_ZThn4_N3ccc7CC4x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y23abcEv,_ZThn4_N3ccc7CC4x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y23efgEv,_ZThn4_N3ccc7CC4x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y23pqrEv,_ZThn4_N3ccc7CC4x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y23abcEv,_ZThn4_N3ccc7CC4x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y2E[];
Class_Descriptor cd__ZN3ccc7CC4x3y2E = {  "_ZN3ccc7CC4x3y2E", // class name
  bases__ZN3ccc7CC4x3y2E, 2,
  &(vtc__ZN3ccc7CC4x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y3  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x3y33abcEv
  ~CC4x3y3(); // tgen
  CC4x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y3E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y33efgEv");}
void  ccc::CC4x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y33pqrEv");}
void  ccc::CC4x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y33abcEv");}
ccc::CC4x3y3 ::~CC4x3y3(){ note_dtor("_ZN3ccc7CC4x3y3E", this);} // tgen
ccc::CC4x3y3 ::CC4x3y3(){ note_ctor("_ZN3ccc7CC4x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y3E, buf);
    ::ccc::CC4x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y3E);
    dp->::ccc::CC4x3y3::~CC4x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y3E(Test__ZN3ccc7CC4x3y3E, "_ZN3ccc7CC4x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y3C1Ev();
extern void _ZN3ccc7CC4x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y3E[] = {
  NSPAIR(_ZN3ccc7CC4x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y3E[];
extern void _ZN3ccc7CC4x3y33pqrEv();
extern void _ZN3ccc7CC4x3y33abcEv();
extern void _ZN3ccc7CC4x3y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33efgEv,_ZThn4_N3ccc7CC4x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33pqrEv,_ZThn4_N3ccc7CC4x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y33abcEv,_ZThn4_N3ccc7CC4x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y33efgEv,_ZThn4_N3ccc7CC4x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y33pqrEv,_ZThn4_N3ccc7CC4x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y33abcEv,_ZThn4_N3ccc7CC4x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y3E[];
Class_Descriptor cd__ZN3ccc7CC4x3y3E = {  "_ZN3ccc7CC4x3y3E", // class name
  bases__ZN3ccc7CC4x3y3E, 2,
  &(vtc__ZN3ccc7CC4x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y4  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC4x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y43efgEv
  ~CC4x3y4(); // tgen
  CC4x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y4E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y43pqrEv");}
void  ccc::CC4x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y43abcEv");}
void  ccc::CC4x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y43efgEv");}
ccc::CC4x3y4 ::~CC4x3y4(){ note_dtor("_ZN3ccc7CC4x3y4E", this);} // tgen
ccc::CC4x3y4 ::CC4x3y4(){ note_ctor("_ZN3ccc7CC4x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y4E, buf);
    ::ccc::CC4x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y4E);
    dp->::ccc::CC4x3y4::~CC4x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y4E(Test__ZN3ccc7CC4x3y4E, "_ZN3ccc7CC4x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y4C1Ev();
extern void _ZN3ccc7CC4x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y4E[] = {
  NSPAIR(_ZN3ccc7CC4x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y4E[];
extern void _ZN3ccc7CC4x3y43pqrEv();
extern void _ZN3ccc7CC4x3y43abcEv();
extern void _ZN3ccc7CC4x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43efgEv,_ZThn4_N3ccc7CC4x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43pqrEv,_ZThn4_N3ccc7CC4x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y43abcEv,_ZThn4_N3ccc7CC4x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y43efgEv,_ZThn4_N3ccc7CC4x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y43pqrEv,_ZThn4_N3ccc7CC4x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y43abcEv,_ZThn4_N3ccc7CC4x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y4E[];
Class_Descriptor cd__ZN3ccc7CC4x3y4E = {  "_ZN3ccc7CC4x3y4E", // class name
  bases__ZN3ccc7CC4x3y4E, 2,
  &(vtc__ZN3ccc7CC4x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y5  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC4x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y53abcEv
  ~CC4x3y5(); // tgen
  CC4x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y5E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y53pqrEv");}
void  ccc::CC4x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y53efgEv");}
void  ccc::CC4x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y53abcEv");}
ccc::CC4x3y5 ::~CC4x3y5(){ note_dtor("_ZN3ccc7CC4x3y5E", this);} // tgen
ccc::CC4x3y5 ::CC4x3y5(){ note_ctor("_ZN3ccc7CC4x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y5E, buf);
    ::ccc::CC4x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y5E);
    dp->::ccc::CC4x3y5::~CC4x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y5E(Test__ZN3ccc7CC4x3y5E, "_ZN3ccc7CC4x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y5C1Ev();
extern void _ZN3ccc7CC4x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y5E[] = {
  NSPAIR(_ZN3ccc7CC4x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y5E[];
extern void _ZN3ccc7CC4x3y53pqrEv();
extern void _ZN3ccc7CC4x3y53abcEv();
extern void _ZN3ccc7CC4x3y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53efgEv,_ZThn4_N3ccc7CC4x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53pqrEv,_ZThn4_N3ccc7CC4x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y53abcEv,_ZThn4_N3ccc7CC4x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y53efgEv,_ZThn4_N3ccc7CC4x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y53pqrEv,_ZThn4_N3ccc7CC4x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y53abcEv,_ZThn4_N3ccc7CC4x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y5E[];
Class_Descriptor cd__ZN3ccc7CC4x3y5E = {  "_ZN3ccc7CC4x3y5E", // class name
  bases__ZN3ccc7CC4x3y5E, 2,
  &(vtc__ZN3ccc7CC4x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y6  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x3y63efgEv
  ~CC4x3y6(); // tgen
  CC4x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y6E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y63abcEv");}
void  ccc::CC4x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y63efgEv");}
ccc::CC4x3y6 ::~CC4x3y6(){ note_dtor("_ZN3ccc7CC4x3y6E", this);} // tgen
ccc::CC4x3y6 ::CC4x3y6(){ note_ctor("_ZN3ccc7CC4x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y6E, buf);
    ::ccc::CC4x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y6E);
    dp->::ccc::CC4x3y6::~CC4x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y6E(Test__ZN3ccc7CC4x3y6E, "_ZN3ccc7CC4x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y6C1Ev();
extern void _ZN3ccc7CC4x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y6E[] = {
  NSPAIR(_ZN3ccc7CC4x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x3y63abcEv();
extern void _ZN3ccc7CC4x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y63efgEv,_ZThn4_N3ccc7CC4x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y63abcEv,_ZThn4_N3ccc7CC4x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y63efgEv,_ZThn4_N3ccc7CC4x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y63abcEv,_ZThn4_N3ccc7CC4x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y6E[];
Class_Descriptor cd__ZN3ccc7CC4x3y6E = {  "_ZN3ccc7CC4x3y6E", // class name
  bases__ZN3ccc7CC4x3y6E, 2,
  &(vtc__ZN3ccc7CC4x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y7  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC4x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y73pqrEv
  ~CC4x3y7(); // tgen
  CC4x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y7E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y73abcEv");}
void  ccc::CC4x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y73pqrEv");}
ccc::CC4x3y7 ::~CC4x3y7(){ note_dtor("_ZN3ccc7CC4x3y7E", this);} // tgen
ccc::CC4x3y7 ::CC4x3y7(){ note_ctor("_ZN3ccc7CC4x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y7E, buf);
    ::ccc::CC4x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y7E);
    dp->::ccc::CC4x3y7::~CC4x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y7E(Test__ZN3ccc7CC4x3y7E, "_ZN3ccc7CC4x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y7C1Ev();
extern void _ZN3ccc7CC4x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y7E[] = {
  NSPAIR(_ZN3ccc7CC4x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y7E[];
extern void _ZN3ccc7CC4x3y73pqrEv();
extern void _ZN3ccc7CC4x3y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y73pqrEv,_ZThn4_N3ccc7CC4x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y73abcEv,_ZThn4_N3ccc7CC4x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y73pqrEv,_ZThn4_N3ccc7CC4x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y73abcEv,_ZThn4_N3ccc7CC4x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y7E[];
Class_Descriptor cd__ZN3ccc7CC4x3y7E = {  "_ZN3ccc7CC4x3y7E", // class name
  bases__ZN3ccc7CC4x3y7E, 2,
  &(vtc__ZN3ccc7CC4x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y8  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x3y83abcEv
  ~CC4x3y8(); // tgen
  CC4x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y8E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y83efgEv");}
void  ccc::CC4x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x3y83abcEv");}
ccc::CC4x3y8 ::~CC4x3y8(){ note_dtor("_ZN3ccc7CC4x3y8E", this);} // tgen
ccc::CC4x3y8 ::CC4x3y8(){ note_ctor("_ZN3ccc7CC4x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y8E, buf);
    ::ccc::CC4x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y8E);
    dp->::ccc::CC4x3y8::~CC4x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y8E(Test__ZN3ccc7CC4x3y8E, "_ZN3ccc7CC4x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y8C1Ev();
extern void _ZN3ccc7CC4x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y8E[] = {
  NSPAIR(_ZN3ccc7CC4x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x3y83abcEv();
extern void _ZN3ccc7CC4x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y83efgEv,_ZThn4_N3ccc7CC4x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y83abcEv,_ZThn4_N3ccc7CC4x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y83efgEv,_ZThn4_N3ccc7CC4x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y83abcEv,_ZThn4_N3ccc7CC4x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y8E[];
Class_Descriptor cd__ZN3ccc7CC4x3y8E = {  "_ZN3ccc7CC4x3y8E", // class name
  bases__ZN3ccc7CC4x3y8E, 2,
  &(vtc__ZN3ccc7CC4x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y9  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC4x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x3y93pqrEv
  ~CC4x3y9(); // tgen
  CC4x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x3y9E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x3y93efgEv");}
void  ccc::CC4x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x3y93pqrEv");}
ccc::CC4x3y9 ::~CC4x3y9(){ note_dtor("_ZN3ccc7CC4x3y9E", this);} // tgen
ccc::CC4x3y9 ::CC4x3y9(){ note_ctor("_ZN3ccc7CC4x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x3y9E, buf);
    ::ccc::CC4x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x3y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC4x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x3y9E);
    dp->::ccc::CC4x3y9::~CC4x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x3y9E(Test__ZN3ccc7CC4x3y9E, "_ZN3ccc7CC4x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x3y9C1Ev();
extern void _ZN3ccc7CC4x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x3y9E[] = {
  NSPAIR(_ZN3ccc7CC4x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC4x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y9E[];
extern void _ZN3ccc7CC4x3y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y93efgEv,_ZThn4_N3ccc7CC4x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x3y93pqrEv,_ZThn4_N3ccc7CC4x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y93efgEv,_ZThn4_N3ccc7CC4x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x3y93pqrEv,_ZThn4_N3ccc7CC4x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x3y9E[];
Class_Descriptor cd__ZN3ccc7CC4x3y9E = {  "_ZN3ccc7CC4x3y9E", // class name
  bases__ZN3ccc7CC4x3y9E, 2,
  &(vtc__ZN3ccc7CC4x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y10  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x3y103abcEv
  ~CC4x3y10(); // tgen
  CC4x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y10E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y103pqrEv");}
void  ccc::CC4x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x3y103abcEv");}
ccc::CC4x3y10 ::~CC4x3y10(){ note_dtor("_ZN3ccc8CC4x3y10E", this);} // tgen
ccc::CC4x3y10 ::CC4x3y10(){ note_ctor("_ZN3ccc8CC4x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y10E, buf);
    ::ccc::CC4x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y10E);
    dp->::ccc::CC4x3y10::~CC4x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y10E(Test__ZN3ccc8CC4x3y10E, "_ZN3ccc8CC4x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y10C1Ev();
extern void _ZN3ccc8CC4x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y10E[] = {
  NSPAIR(_ZN3ccc8CC4x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y10E[];
extern void _ZN3ccc8CC4x3y103pqrEv();
extern void _ZN3ccc8CC4x3y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y103pqrEv,_ZThn4_N3ccc8CC4x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y103abcEv,_ZThn4_N3ccc8CC4x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y103pqrEv,_ZThn4_N3ccc8CC4x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y103abcEv,_ZThn4_N3ccc8CC4x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y10E[];
Class_Descriptor cd__ZN3ccc8CC4x3y10E = {  "_ZN3ccc8CC4x3y10E", // class name
  bases__ZN3ccc8CC4x3y10E, 2,
  &(vtc__ZN3ccc8CC4x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y11  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x3y113efgEv
  ~CC4x3y11(); // tgen
  CC4x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y11E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y113pqrEv");}
void  ccc::CC4x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x3y113efgEv");}
ccc::CC4x3y11 ::~CC4x3y11(){ note_dtor("_ZN3ccc8CC4x3y11E", this);} // tgen
ccc::CC4x3y11 ::CC4x3y11(){ note_ctor("_ZN3ccc8CC4x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y11E, buf);
    ::ccc::CC4x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y11E);
    dp->::ccc::CC4x3y11::~CC4x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y11E(Test__ZN3ccc8CC4x3y11E, "_ZN3ccc8CC4x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y11C1Ev();
extern void _ZN3ccc8CC4x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y11E[] = {
  NSPAIR(_ZN3ccc8CC4x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y11E[];
extern void _ZN3ccc8CC4x3y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y113efgEv,_ZThn4_N3ccc8CC4x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y113pqrEv,_ZThn4_N3ccc8CC4x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y113efgEv,_ZThn4_N3ccc8CC4x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y113pqrEv,_ZThn4_N3ccc8CC4x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y11E[];
Class_Descriptor cd__ZN3ccc8CC4x3y11E = {  "_ZN3ccc8CC4x3y11E", // class name
  bases__ZN3ccc8CC4x3y11E, 2,
  &(vtc__ZN3ccc8CC4x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y12  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC4x3y123abcEv
  ~CC4x3y12(); // tgen
  CC4x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x3y123abcEv");}
ccc::CC4x3y12 ::~CC4x3y12(){ note_dtor("_ZN3ccc8CC4x3y12E", this);} // tgen
ccc::CC4x3y12 ::CC4x3y12(){ note_ctor("_ZN3ccc8CC4x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y12E, buf);
    ::ccc::CC4x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y12E);
    dp->::ccc::CC4x3y12::~CC4x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y12E(Test__ZN3ccc8CC4x3y12E, "_ZN3ccc8CC4x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y12C1Ev();
extern void _ZN3ccc8CC4x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y12E[] = {
  NSPAIR(_ZN3ccc8CC4x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x3y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y123abcEv,_ZThn4_N3ccc8CC4x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y123abcEv,_ZThn4_N3ccc8CC4x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y12E[];
Class_Descriptor cd__ZN3ccc8CC4x3y12E = {  "_ZN3ccc8CC4x3y12E", // class name
  bases__ZN3ccc8CC4x3y12E, 2,
  &(vtc__ZN3ccc8CC4x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y13  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC4x3y133efgEv
  ~CC4x3y13(); // tgen
  CC4x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x3y133efgEv");}
ccc::CC4x3y13 ::~CC4x3y13(){ note_dtor("_ZN3ccc8CC4x3y13E", this);} // tgen
ccc::CC4x3y13 ::CC4x3y13(){ note_ctor("_ZN3ccc8CC4x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y13E, buf);
    ::ccc::CC4x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y13E);
    dp->::ccc::CC4x3y13::~CC4x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y13E(Test__ZN3ccc8CC4x3y13E, "_ZN3ccc8CC4x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y13C1Ev();
extern void _ZN3ccc8CC4x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y13E[] = {
  NSPAIR(_ZN3ccc8CC4x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y133efgEv,_ZThn4_N3ccc8CC4x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y133efgEv,_ZThn4_N3ccc8CC4x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y13E[];
Class_Descriptor cd__ZN3ccc8CC4x3y13E = {  "_ZN3ccc8CC4x3y13E", // class name
  bases__ZN3ccc8CC4x3y13E, 2,
  &(vtc__ZN3ccc8CC4x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y14  : ::ccc::AA4 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC4x3y143pqrEv
  ~CC4x3y14(); // tgen
  CC4x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x3y143pqrEv");}
ccc::CC4x3y14 ::~CC4x3y14(){ note_dtor("_ZN3ccc8CC4x3y14E", this);} // tgen
ccc::CC4x3y14 ::CC4x3y14(){ note_ctor("_ZN3ccc8CC4x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y14E, buf);
    ::ccc::CC4x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y14E);
    dp->::ccc::CC4x3y14::~CC4x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y14E(Test__ZN3ccc8CC4x3y14E, "_ZN3ccc8CC4x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y14C1Ev();
extern void _ZN3ccc8CC4x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y14E[] = {
  NSPAIR(_ZN3ccc8CC4x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y14E[];
extern void _ZN3ccc8CC4x3y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x3y143pqrEv,_ZThn4_N3ccc8CC4x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x3y143pqrEv,_ZThn4_N3ccc8CC4x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y14E[];
Class_Descriptor cd__ZN3ccc8CC4x3y14E = {  "_ZN3ccc8CC4x3y14E", // class name
  bases__ZN3ccc8CC4x3y14E, 2,
  &(vtc__ZN3ccc8CC4x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x3y15  : ::ccc::AA4 , ::ccc::BB3 {
  ~CC4x3y15(); // tgen
  CC4x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x3y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x3y15 ::~CC4x3y15(){ note_dtor("_ZN3ccc8CC4x3y15E", this);} // tgen
ccc::CC4x3y15 ::CC4x3y15(){ note_ctor("_ZN3ccc8CC4x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x3y15E, buf);
    ::ccc::CC4x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x3y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC4x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x3y15E);
    dp->::ccc::CC4x3y15::~CC4x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x3y15E(Test__ZN3ccc8CC4x3y15E, "_ZN3ccc8CC4x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x3y15C1Ev();
extern void _ZN3ccc8CC4x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x3y15E[] = {
  NSPAIR(_ZN3ccc8CC4x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC4x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x3y15E[];
Class_Descriptor cd__ZN3ccc8CC4x3y15E = {  "_ZN3ccc8CC4x3y15E", // class name
  bases__ZN3ccc8CC4x3y15E, 2,
  &(vtc__ZN3ccc8CC4x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y0  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y03pqrEv
  ~CC4x4y0(); // tgen
  CC4x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y0E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y03abcEv");}
void  ccc::CC4x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y03efgEv");}
void  ccc::CC4x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y03pqrEv");}
ccc::CC4x4y0 ::~CC4x4y0(){ note_dtor("_ZN3ccc7CC4x4y0E", this);} // tgen
ccc::CC4x4y0 ::CC4x4y0(){ note_ctor("_ZN3ccc7CC4x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y0E, buf);
    ::ccc::CC4x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y0E);
    dp->::ccc::CC4x4y0::~CC4x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y0E(Test__ZN3ccc7CC4x4y0E, "_ZN3ccc7CC4x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y0C1Ev();
extern void _ZN3ccc7CC4x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y0E[] = {
  NSPAIR(_ZN3ccc7CC4x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y0E[];
extern void _ZN3ccc7CC4x4y03pqrEv();
extern void _ZN3ccc7CC4x4y03abcEv();
extern void _ZN3ccc7CC4x4y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03pqrEv,_ZThn4_N3ccc7CC4x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03abcEv,_ZThn4_N3ccc7CC4x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y03efgEv,_ZThn4_N3ccc7CC4x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y03pqrEv,_ZThn4_N3ccc7CC4x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y03abcEv,_ZThn4_N3ccc7CC4x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y03efgEv,_ZThn4_N3ccc7CC4x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y0E[];
Class_Descriptor cd__ZN3ccc7CC4x4y0E = {  "_ZN3ccc7CC4x4y0E", // class name
  bases__ZN3ccc7CC4x4y0E, 2,
  &(vtc__ZN3ccc7CC4x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y1  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x4y13efgEv
  ~CC4x4y1(); // tgen
  CC4x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y1E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y13abcEv");}
void  ccc::CC4x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y13pqrEv");}
void  ccc::CC4x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y13efgEv");}
ccc::CC4x4y1 ::~CC4x4y1(){ note_dtor("_ZN3ccc7CC4x4y1E", this);} // tgen
ccc::CC4x4y1 ::CC4x4y1(){ note_ctor("_ZN3ccc7CC4x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y1E, buf);
    ::ccc::CC4x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y1E);
    dp->::ccc::CC4x4y1::~CC4x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y1E(Test__ZN3ccc7CC4x4y1E, "_ZN3ccc7CC4x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y1C1Ev();
extern void _ZN3ccc7CC4x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y1E[] = {
  NSPAIR(_ZN3ccc7CC4x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y1E[];
extern void _ZN3ccc7CC4x4y13pqrEv();
extern void _ZN3ccc7CC4x4y13abcEv();
extern void _ZN3ccc7CC4x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13pqrEv,_ZThn4_N3ccc7CC4x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13abcEv,_ZThn4_N3ccc7CC4x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y13efgEv,_ZThn4_N3ccc7CC4x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y13pqrEv,_ZThn4_N3ccc7CC4x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y13abcEv,_ZThn4_N3ccc7CC4x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y13efgEv,_ZThn4_N3ccc7CC4x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y1E[];
Class_Descriptor cd__ZN3ccc7CC4x4y1E = {  "_ZN3ccc7CC4x4y1E", // class name
  bases__ZN3ccc7CC4x4y1E, 2,
  &(vtc__ZN3ccc7CC4x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y2  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y23pqrEv
  ~CC4x4y2(); // tgen
  CC4x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y2E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y23efgEv");}
void  ccc::CC4x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y23abcEv");}
void  ccc::CC4x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y23pqrEv");}
ccc::CC4x4y2 ::~CC4x4y2(){ note_dtor("_ZN3ccc7CC4x4y2E", this);} // tgen
ccc::CC4x4y2 ::CC4x4y2(){ note_ctor("_ZN3ccc7CC4x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y2E, buf);
    ::ccc::CC4x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y2E);
    dp->::ccc::CC4x4y2::~CC4x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y2E(Test__ZN3ccc7CC4x4y2E, "_ZN3ccc7CC4x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y2C1Ev();
extern void _ZN3ccc7CC4x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y2E[] = {
  NSPAIR(_ZN3ccc7CC4x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y2E[];
extern void _ZN3ccc7CC4x4y23pqrEv();
extern void _ZN3ccc7CC4x4y23abcEv();
extern void _ZN3ccc7CC4x4y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23pqrEv,_ZThn4_N3ccc7CC4x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23abcEv,_ZThn4_N3ccc7CC4x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y23efgEv,_ZThn4_N3ccc7CC4x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y23pqrEv,_ZThn4_N3ccc7CC4x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y23abcEv,_ZThn4_N3ccc7CC4x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y23efgEv,_ZThn4_N3ccc7CC4x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y2E[];
Class_Descriptor cd__ZN3ccc7CC4x4y2E = {  "_ZN3ccc7CC4x4y2E", // class name
  bases__ZN3ccc7CC4x4y2E, 2,
  &(vtc__ZN3ccc7CC4x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y3  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x4y33abcEv
  ~CC4x4y3(); // tgen
  CC4x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y3E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y33efgEv");}
void  ccc::CC4x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y33pqrEv");}
void  ccc::CC4x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y33abcEv");}
ccc::CC4x4y3 ::~CC4x4y3(){ note_dtor("_ZN3ccc7CC4x4y3E", this);} // tgen
ccc::CC4x4y3 ::CC4x4y3(){ note_ctor("_ZN3ccc7CC4x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y3E, buf);
    ::ccc::CC4x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y3E);
    dp->::ccc::CC4x4y3::~CC4x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y3E(Test__ZN3ccc7CC4x4y3E, "_ZN3ccc7CC4x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y3C1Ev();
extern void _ZN3ccc7CC4x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y3E[] = {
  NSPAIR(_ZN3ccc7CC4x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y3E[];
extern void _ZN3ccc7CC4x4y33pqrEv();
extern void _ZN3ccc7CC4x4y33abcEv();
extern void _ZN3ccc7CC4x4y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33pqrEv,_ZThn4_N3ccc7CC4x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33abcEv,_ZThn4_N3ccc7CC4x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y33efgEv,_ZThn4_N3ccc7CC4x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y33pqrEv,_ZThn4_N3ccc7CC4x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y33abcEv,_ZThn4_N3ccc7CC4x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y33efgEv,_ZThn4_N3ccc7CC4x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y3E[];
Class_Descriptor cd__ZN3ccc7CC4x4y3E = {  "_ZN3ccc7CC4x4y3E", // class name
  bases__ZN3ccc7CC4x4y3E, 2,
  &(vtc__ZN3ccc7CC4x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y4  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC4x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y43efgEv
  ~CC4x4y4(); // tgen
  CC4x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y4E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y43pqrEv");}
void  ccc::CC4x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y43abcEv");}
void  ccc::CC4x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y43efgEv");}
ccc::CC4x4y4 ::~CC4x4y4(){ note_dtor("_ZN3ccc7CC4x4y4E", this);} // tgen
ccc::CC4x4y4 ::CC4x4y4(){ note_ctor("_ZN3ccc7CC4x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y4E, buf);
    ::ccc::CC4x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y4E);
    dp->::ccc::CC4x4y4::~CC4x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y4E(Test__ZN3ccc7CC4x4y4E, "_ZN3ccc7CC4x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y4C1Ev();
extern void _ZN3ccc7CC4x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y4E[] = {
  NSPAIR(_ZN3ccc7CC4x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y4E[];
extern void _ZN3ccc7CC4x4y43pqrEv();
extern void _ZN3ccc7CC4x4y43abcEv();
extern void _ZN3ccc7CC4x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43pqrEv,_ZThn4_N3ccc7CC4x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43abcEv,_ZThn4_N3ccc7CC4x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y43efgEv,_ZThn4_N3ccc7CC4x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y43pqrEv,_ZThn4_N3ccc7CC4x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y43abcEv,_ZThn4_N3ccc7CC4x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y43efgEv,_ZThn4_N3ccc7CC4x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y4E[];
Class_Descriptor cd__ZN3ccc7CC4x4y4E = {  "_ZN3ccc7CC4x4y4E", // class name
  bases__ZN3ccc7CC4x4y4E, 2,
  &(vtc__ZN3ccc7CC4x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y5  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC4x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y53abcEv
  ~CC4x4y5(); // tgen
  CC4x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y5E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y53pqrEv");}
void  ccc::CC4x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y53efgEv");}
void  ccc::CC4x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y53abcEv");}
ccc::CC4x4y5 ::~CC4x4y5(){ note_dtor("_ZN3ccc7CC4x4y5E", this);} // tgen
ccc::CC4x4y5 ::CC4x4y5(){ note_ctor("_ZN3ccc7CC4x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y5E, buf);
    ::ccc::CC4x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y5E);
    dp->::ccc::CC4x4y5::~CC4x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y5E(Test__ZN3ccc7CC4x4y5E, "_ZN3ccc7CC4x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y5C1Ev();
extern void _ZN3ccc7CC4x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y5E[] = {
  NSPAIR(_ZN3ccc7CC4x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y5E[];
extern void _ZN3ccc7CC4x4y53pqrEv();
extern void _ZN3ccc7CC4x4y53abcEv();
extern void _ZN3ccc7CC4x4y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53pqrEv,_ZThn4_N3ccc7CC4x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53abcEv,_ZThn4_N3ccc7CC4x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y53efgEv,_ZThn4_N3ccc7CC4x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y53pqrEv,_ZThn4_N3ccc7CC4x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y53abcEv,_ZThn4_N3ccc7CC4x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y53efgEv,_ZThn4_N3ccc7CC4x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y5E[];
Class_Descriptor cd__ZN3ccc7CC4x4y5E = {  "_ZN3ccc7CC4x4y5E", // class name
  bases__ZN3ccc7CC4x4y5E, 2,
  &(vtc__ZN3ccc7CC4x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y6  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x4y63efgEv
  ~CC4x4y6(); // tgen
  CC4x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y6E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y63abcEv");}
void  ccc::CC4x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y63efgEv");}
ccc::CC4x4y6 ::~CC4x4y6(){ note_dtor("_ZN3ccc7CC4x4y6E", this);} // tgen
ccc::CC4x4y6 ::CC4x4y6(){ note_ctor("_ZN3ccc7CC4x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y6E, buf);
    ::ccc::CC4x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y6E);
    dp->::ccc::CC4x4y6::~CC4x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y6E(Test__ZN3ccc7CC4x4y6E, "_ZN3ccc7CC4x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y6C1Ev();
extern void _ZN3ccc7CC4x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y6E[] = {
  NSPAIR(_ZN3ccc7CC4x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x4y63abcEv();
extern void _ZN3ccc7CC4x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y63abcEv,_ZThn4_N3ccc7CC4x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y63efgEv,_ZThn4_N3ccc7CC4x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y63abcEv,_ZThn4_N3ccc7CC4x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y63efgEv,_ZThn4_N3ccc7CC4x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y6E[];
Class_Descriptor cd__ZN3ccc7CC4x4y6E = {  "_ZN3ccc7CC4x4y6E", // class name
  bases__ZN3ccc7CC4x4y6E, 2,
  &(vtc__ZN3ccc7CC4x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y7  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC4x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y73pqrEv
  ~CC4x4y7(); // tgen
  CC4x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y7E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y73abcEv");}
void  ccc::CC4x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y73pqrEv");}
ccc::CC4x4y7 ::~CC4x4y7(){ note_dtor("_ZN3ccc7CC4x4y7E", this);} // tgen
ccc::CC4x4y7 ::CC4x4y7(){ note_ctor("_ZN3ccc7CC4x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y7E, buf);
    ::ccc::CC4x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y7E);
    dp->::ccc::CC4x4y7::~CC4x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y7E(Test__ZN3ccc7CC4x4y7E, "_ZN3ccc7CC4x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y7C1Ev();
extern void _ZN3ccc7CC4x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y7E[] = {
  NSPAIR(_ZN3ccc7CC4x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y7E[];
extern void _ZN3ccc7CC4x4y73pqrEv();
extern void _ZN3ccc7CC4x4y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y73pqrEv,_ZThn4_N3ccc7CC4x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y73abcEv,_ZThn4_N3ccc7CC4x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y73pqrEv,_ZThn4_N3ccc7CC4x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y73abcEv,_ZThn4_N3ccc7CC4x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y7E[];
Class_Descriptor cd__ZN3ccc7CC4x4y7E = {  "_ZN3ccc7CC4x4y7E", // class name
  bases__ZN3ccc7CC4x4y7E, 2,
  &(vtc__ZN3ccc7CC4x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y8  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x4y83abcEv
  ~CC4x4y8(); // tgen
  CC4x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y8E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y83efgEv");}
void  ccc::CC4x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x4y83abcEv");}
ccc::CC4x4y8 ::~CC4x4y8(){ note_dtor("_ZN3ccc7CC4x4y8E", this);} // tgen
ccc::CC4x4y8 ::CC4x4y8(){ note_ctor("_ZN3ccc7CC4x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y8E, buf);
    ::ccc::CC4x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y8E);
    dp->::ccc::CC4x4y8::~CC4x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y8E(Test__ZN3ccc7CC4x4y8E, "_ZN3ccc7CC4x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y8C1Ev();
extern void _ZN3ccc7CC4x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y8E[] = {
  NSPAIR(_ZN3ccc7CC4x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x4y83abcEv();
extern void _ZN3ccc7CC4x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y83abcEv,_ZThn4_N3ccc7CC4x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y83efgEv,_ZThn4_N3ccc7CC4x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y83abcEv,_ZThn4_N3ccc7CC4x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y83efgEv,_ZThn4_N3ccc7CC4x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y8E[];
Class_Descriptor cd__ZN3ccc7CC4x4y8E = {  "_ZN3ccc7CC4x4y8E", // class name
  bases__ZN3ccc7CC4x4y8E, 2,
  &(vtc__ZN3ccc7CC4x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y9  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC4x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x4y93pqrEv
  ~CC4x4y9(); // tgen
  CC4x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x4y9E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x4y93efgEv");}
void  ccc::CC4x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x4y93pqrEv");}
ccc::CC4x4y9 ::~CC4x4y9(){ note_dtor("_ZN3ccc7CC4x4y9E", this);} // tgen
ccc::CC4x4y9 ::CC4x4y9(){ note_ctor("_ZN3ccc7CC4x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x4y9E, buf);
    ::ccc::CC4x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x4y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7CC4x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x4y9E);
    dp->::ccc::CC4x4y9::~CC4x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x4y9E(Test__ZN3ccc7CC4x4y9E, "_ZN3ccc7CC4x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x4y9C1Ev();
extern void _ZN3ccc7CC4x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x4y9E[] = {
  NSPAIR(_ZN3ccc7CC4x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC4x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y9E[];
extern void _ZN3ccc7CC4x4y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y93pqrEv,_ZThn4_N3ccc7CC4x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x4y93efgEv,_ZThn4_N3ccc7CC4x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y93pqrEv,_ZThn4_N3ccc7CC4x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x4y93efgEv,_ZThn4_N3ccc7CC4x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x4y9E[];
Class_Descriptor cd__ZN3ccc7CC4x4y9E = {  "_ZN3ccc7CC4x4y9E", // class name
  bases__ZN3ccc7CC4x4y9E, 2,
  &(vtc__ZN3ccc7CC4x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y10  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x4y103abcEv
  ~CC4x4y10(); // tgen
  CC4x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y10E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y103pqrEv");}
void  ccc::CC4x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x4y103abcEv");}
ccc::CC4x4y10 ::~CC4x4y10(){ note_dtor("_ZN3ccc8CC4x4y10E", this);} // tgen
ccc::CC4x4y10 ::CC4x4y10(){ note_ctor("_ZN3ccc8CC4x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y10E, buf);
    ::ccc::CC4x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y10E);
    dp->::ccc::CC4x4y10::~CC4x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y10E(Test__ZN3ccc8CC4x4y10E, "_ZN3ccc8CC4x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y10C1Ev();
extern void _ZN3ccc8CC4x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y10E[] = {
  NSPAIR(_ZN3ccc8CC4x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y10E[];
extern void _ZN3ccc8CC4x4y103pqrEv();
extern void _ZN3ccc8CC4x4y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y103pqrEv,_ZThn4_N3ccc8CC4x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y103abcEv,_ZThn4_N3ccc8CC4x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y103pqrEv,_ZThn4_N3ccc8CC4x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y103abcEv,_ZThn4_N3ccc8CC4x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y10E[];
Class_Descriptor cd__ZN3ccc8CC4x4y10E = {  "_ZN3ccc8CC4x4y10E", // class name
  bases__ZN3ccc8CC4x4y10E, 2,
  &(vtc__ZN3ccc8CC4x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y11  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x4y113efgEv
  ~CC4x4y11(); // tgen
  CC4x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y11E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y113pqrEv");}
void  ccc::CC4x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x4y113efgEv");}
ccc::CC4x4y11 ::~CC4x4y11(){ note_dtor("_ZN3ccc8CC4x4y11E", this);} // tgen
ccc::CC4x4y11 ::CC4x4y11(){ note_ctor("_ZN3ccc8CC4x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y11E, buf);
    ::ccc::CC4x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y11E);
    dp->::ccc::CC4x4y11::~CC4x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y11E(Test__ZN3ccc8CC4x4y11E, "_ZN3ccc8CC4x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y11C1Ev();
extern void _ZN3ccc8CC4x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y11E[] = {
  NSPAIR(_ZN3ccc8CC4x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y11E[];
extern void _ZN3ccc8CC4x4y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y113pqrEv,_ZThn4_N3ccc8CC4x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y113efgEv,_ZThn4_N3ccc8CC4x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y113pqrEv,_ZThn4_N3ccc8CC4x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y113efgEv,_ZThn4_N3ccc8CC4x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y11E[];
Class_Descriptor cd__ZN3ccc8CC4x4y11E = {  "_ZN3ccc8CC4x4y11E", // class name
  bases__ZN3ccc8CC4x4y11E, 2,
  &(vtc__ZN3ccc8CC4x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y12  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC4x4y123abcEv
  ~CC4x4y12(); // tgen
  CC4x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x4y123abcEv");}
ccc::CC4x4y12 ::~CC4x4y12(){ note_dtor("_ZN3ccc8CC4x4y12E", this);} // tgen
ccc::CC4x4y12 ::CC4x4y12(){ note_ctor("_ZN3ccc8CC4x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y12E, buf);
    ::ccc::CC4x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y12E);
    dp->::ccc::CC4x4y12::~CC4x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y12E(Test__ZN3ccc8CC4x4y12E, "_ZN3ccc8CC4x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y12C1Ev();
extern void _ZN3ccc8CC4x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y12E[] = {
  NSPAIR(_ZN3ccc8CC4x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x4y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y123abcEv,_ZThn4_N3ccc8CC4x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y123abcEv,_ZThn4_N3ccc8CC4x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y12E[];
Class_Descriptor cd__ZN3ccc8CC4x4y12E = {  "_ZN3ccc8CC4x4y12E", // class name
  bases__ZN3ccc8CC4x4y12E, 2,
  &(vtc__ZN3ccc8CC4x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y13  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC4x4y133efgEv
  ~CC4x4y13(); // tgen
  CC4x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x4y133efgEv");}
ccc::CC4x4y13 ::~CC4x4y13(){ note_dtor("_ZN3ccc8CC4x4y13E", this);} // tgen
ccc::CC4x4y13 ::CC4x4y13(){ note_ctor("_ZN3ccc8CC4x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y13E, buf);
    ::ccc::CC4x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y13E);
    dp->::ccc::CC4x4y13::~CC4x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y13E(Test__ZN3ccc8CC4x4y13E, "_ZN3ccc8CC4x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y13C1Ev();
extern void _ZN3ccc8CC4x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y13E[] = {
  NSPAIR(_ZN3ccc8CC4x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y133efgEv,_ZThn4_N3ccc8CC4x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y133efgEv,_ZThn4_N3ccc8CC4x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y13E[];
Class_Descriptor cd__ZN3ccc8CC4x4y13E = {  "_ZN3ccc8CC4x4y13E", // class name
  bases__ZN3ccc8CC4x4y13E, 2,
  &(vtc__ZN3ccc8CC4x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y14  : ::ccc::AA4 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC4x4y143pqrEv
  ~CC4x4y14(); // tgen
  CC4x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y14E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x4y143pqrEv");}
ccc::CC4x4y14 ::~CC4x4y14(){ note_dtor("_ZN3ccc8CC4x4y14E", this);} // tgen
ccc::CC4x4y14 ::CC4x4y14(){ note_ctor("_ZN3ccc8CC4x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y14E, buf);
    ::ccc::CC4x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y14E);
    dp->::ccc::CC4x4y14::~CC4x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y14E(Test__ZN3ccc8CC4x4y14E, "_ZN3ccc8CC4x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y14C1Ev();
extern void _ZN3ccc8CC4x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y14E[] = {
  NSPAIR(_ZN3ccc8CC4x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y14E[];
extern void _ZN3ccc8CC4x4y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x4y143pqrEv,_ZThn4_N3ccc8CC4x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x4y143pqrEv,_ZThn4_N3ccc8CC4x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y14E[];
Class_Descriptor cd__ZN3ccc8CC4x4y14E = {  "_ZN3ccc8CC4x4y14E", // class name
  bases__ZN3ccc8CC4x4y14E, 2,
  &(vtc__ZN3ccc8CC4x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x4y15  : ::ccc::AA4 , ::ccc::BB4 {
  ~CC4x4y15(); // tgen
  CC4x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x4y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x4y15 ::~CC4x4y15(){ note_dtor("_ZN3ccc8CC4x4y15E", this);} // tgen
ccc::CC4x4y15 ::CC4x4y15(){ note_ctor("_ZN3ccc8CC4x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x4y15E, buf);
    ::ccc::CC4x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x4y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC4x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x4y15E);
    dp->::ccc::CC4x4y15::~CC4x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x4y15E(Test__ZN3ccc8CC4x4y15E, "_ZN3ccc8CC4x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x4y15C1Ev();
extern void _ZN3ccc8CC4x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x4y15E[] = {
  NSPAIR(_ZN3ccc8CC4x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC4x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x4y15E[];
Class_Descriptor cd__ZN3ccc8CC4x4y15E = {  "_ZN3ccc8CC4x4y15E", // class name
  bases__ZN3ccc8CC4x4y15E, 2,
  &(vtc__ZN3ccc8CC4x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y0  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y03pqrEv
  ~CC4x5y0(); // tgen
  CC4x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y0E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y03abcEv");}
void  ccc::CC4x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y03efgEv");}
void  ccc::CC4x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y03pqrEv");}
ccc::CC4x5y0 ::~CC4x5y0(){ note_dtor("_ZN3ccc7CC4x5y0E", this);} // tgen
ccc::CC4x5y0 ::CC4x5y0(){ note_ctor("_ZN3ccc7CC4x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y0E, buf);
    ::ccc::CC4x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y0E);
    dp->::ccc::CC4x5y0::~CC4x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y0E(Test__ZN3ccc7CC4x5y0E, "_ZN3ccc7CC4x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y0C1Ev();
extern void _ZN3ccc7CC4x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y0E[] = {
  NSPAIR(_ZN3ccc7CC4x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y0E[];
extern void _ZN3ccc7CC4x5y03pqrEv();
extern void _ZN3ccc7CC4x5y03abcEv();
extern void _ZN3ccc7CC4x5y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03pqrEv,_ZThn4_N3ccc7CC4x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03efgEv,_ZThn4_N3ccc7CC4x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y03abcEv,_ZThn4_N3ccc7CC4x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y03pqrEv,_ZThn4_N3ccc7CC4x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y03efgEv,_ZThn4_N3ccc7CC4x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y03abcEv,_ZThn4_N3ccc7CC4x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y0E[];
Class_Descriptor cd__ZN3ccc7CC4x5y0E = {  "_ZN3ccc7CC4x5y0E", // class name
  bases__ZN3ccc7CC4x5y0E, 2,
  &(vtc__ZN3ccc7CC4x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y1  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x5y13efgEv
  ~CC4x5y1(); // tgen
  CC4x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y1E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y13abcEv");}
void  ccc::CC4x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y13pqrEv");}
void  ccc::CC4x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y13efgEv");}
ccc::CC4x5y1 ::~CC4x5y1(){ note_dtor("_ZN3ccc7CC4x5y1E", this);} // tgen
ccc::CC4x5y1 ::CC4x5y1(){ note_ctor("_ZN3ccc7CC4x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y1E, buf);
    ::ccc::CC4x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y1E);
    dp->::ccc::CC4x5y1::~CC4x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y1E(Test__ZN3ccc7CC4x5y1E, "_ZN3ccc7CC4x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y1C1Ev();
extern void _ZN3ccc7CC4x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y1E[] = {
  NSPAIR(_ZN3ccc7CC4x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y1E[];
extern void _ZN3ccc7CC4x5y13pqrEv();
extern void _ZN3ccc7CC4x5y13abcEv();
extern void _ZN3ccc7CC4x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13pqrEv,_ZThn4_N3ccc7CC4x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13efgEv,_ZThn4_N3ccc7CC4x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y13abcEv,_ZThn4_N3ccc7CC4x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y13pqrEv,_ZThn4_N3ccc7CC4x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y13efgEv,_ZThn4_N3ccc7CC4x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y13abcEv,_ZThn4_N3ccc7CC4x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y1E[];
Class_Descriptor cd__ZN3ccc7CC4x5y1E = {  "_ZN3ccc7CC4x5y1E", // class name
  bases__ZN3ccc7CC4x5y1E, 2,
  &(vtc__ZN3ccc7CC4x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y2  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y23pqrEv
  ~CC4x5y2(); // tgen
  CC4x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y2E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y23efgEv");}
void  ccc::CC4x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y23abcEv");}
void  ccc::CC4x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y23pqrEv");}
ccc::CC4x5y2 ::~CC4x5y2(){ note_dtor("_ZN3ccc7CC4x5y2E", this);} // tgen
ccc::CC4x5y2 ::CC4x5y2(){ note_ctor("_ZN3ccc7CC4x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y2E, buf);
    ::ccc::CC4x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y2E);
    dp->::ccc::CC4x5y2::~CC4x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y2E(Test__ZN3ccc7CC4x5y2E, "_ZN3ccc7CC4x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y2C1Ev();
extern void _ZN3ccc7CC4x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y2E[] = {
  NSPAIR(_ZN3ccc7CC4x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y2E[];
extern void _ZN3ccc7CC4x5y23pqrEv();
extern void _ZN3ccc7CC4x5y23abcEv();
extern void _ZN3ccc7CC4x5y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23pqrEv,_ZThn4_N3ccc7CC4x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23efgEv,_ZThn4_N3ccc7CC4x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y23abcEv,_ZThn4_N3ccc7CC4x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y23pqrEv,_ZThn4_N3ccc7CC4x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y23efgEv,_ZThn4_N3ccc7CC4x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y23abcEv,_ZThn4_N3ccc7CC4x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y2E[];
Class_Descriptor cd__ZN3ccc7CC4x5y2E = {  "_ZN3ccc7CC4x5y2E", // class name
  bases__ZN3ccc7CC4x5y2E, 2,
  &(vtc__ZN3ccc7CC4x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y3  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x5y33abcEv
  ~CC4x5y3(); // tgen
  CC4x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y3E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y33efgEv");}
void  ccc::CC4x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y33pqrEv");}
void  ccc::CC4x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y33abcEv");}
ccc::CC4x5y3 ::~CC4x5y3(){ note_dtor("_ZN3ccc7CC4x5y3E", this);} // tgen
ccc::CC4x5y3 ::CC4x5y3(){ note_ctor("_ZN3ccc7CC4x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y3E, buf);
    ::ccc::CC4x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y3E);
    dp->::ccc::CC4x5y3::~CC4x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y3E(Test__ZN3ccc7CC4x5y3E, "_ZN3ccc7CC4x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y3C1Ev();
extern void _ZN3ccc7CC4x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y3E[] = {
  NSPAIR(_ZN3ccc7CC4x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y3E[];
extern void _ZN3ccc7CC4x5y33pqrEv();
extern void _ZN3ccc7CC4x5y33abcEv();
extern void _ZN3ccc7CC4x5y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33pqrEv,_ZThn4_N3ccc7CC4x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33efgEv,_ZThn4_N3ccc7CC4x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y33abcEv,_ZThn4_N3ccc7CC4x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y33pqrEv,_ZThn4_N3ccc7CC4x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y33efgEv,_ZThn4_N3ccc7CC4x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y33abcEv,_ZThn4_N3ccc7CC4x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y3E[];
Class_Descriptor cd__ZN3ccc7CC4x5y3E = {  "_ZN3ccc7CC4x5y3E", // class name
  bases__ZN3ccc7CC4x5y3E, 2,
  &(vtc__ZN3ccc7CC4x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y4  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC4x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y43efgEv
  ~CC4x5y4(); // tgen
  CC4x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y4E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y43pqrEv");}
void  ccc::CC4x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y43abcEv");}
void  ccc::CC4x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y43efgEv");}
ccc::CC4x5y4 ::~CC4x5y4(){ note_dtor("_ZN3ccc7CC4x5y4E", this);} // tgen
ccc::CC4x5y4 ::CC4x5y4(){ note_ctor("_ZN3ccc7CC4x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y4E, buf);
    ::ccc::CC4x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y4E);
    dp->::ccc::CC4x5y4::~CC4x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y4E(Test__ZN3ccc7CC4x5y4E, "_ZN3ccc7CC4x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y4C1Ev();
extern void _ZN3ccc7CC4x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y4E[] = {
  NSPAIR(_ZN3ccc7CC4x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y4E[];
extern void _ZN3ccc7CC4x5y43pqrEv();
extern void _ZN3ccc7CC4x5y43abcEv();
extern void _ZN3ccc7CC4x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43pqrEv,_ZThn4_N3ccc7CC4x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43efgEv,_ZThn4_N3ccc7CC4x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y43abcEv,_ZThn4_N3ccc7CC4x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y43pqrEv,_ZThn4_N3ccc7CC4x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y43efgEv,_ZThn4_N3ccc7CC4x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y43abcEv,_ZThn4_N3ccc7CC4x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y4E[];
Class_Descriptor cd__ZN3ccc7CC4x5y4E = {  "_ZN3ccc7CC4x5y4E", // class name
  bases__ZN3ccc7CC4x5y4E, 2,
  &(vtc__ZN3ccc7CC4x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y5  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC4x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y53abcEv
  ~CC4x5y5(); // tgen
  CC4x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y5E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y53pqrEv");}
void  ccc::CC4x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y53efgEv");}
void  ccc::CC4x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y53abcEv");}
ccc::CC4x5y5 ::~CC4x5y5(){ note_dtor("_ZN3ccc7CC4x5y5E", this);} // tgen
ccc::CC4x5y5 ::CC4x5y5(){ note_ctor("_ZN3ccc7CC4x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y5E, buf);
    ::ccc::CC4x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y5E);
    dp->::ccc::CC4x5y5::~CC4x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y5E(Test__ZN3ccc7CC4x5y5E, "_ZN3ccc7CC4x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y5C1Ev();
extern void _ZN3ccc7CC4x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y5E[] = {
  NSPAIR(_ZN3ccc7CC4x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y5E[];
extern void _ZN3ccc7CC4x5y53pqrEv();
extern void _ZN3ccc7CC4x5y53abcEv();
extern void _ZN3ccc7CC4x5y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53pqrEv,_ZThn4_N3ccc7CC4x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53efgEv,_ZThn4_N3ccc7CC4x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y53abcEv,_ZThn4_N3ccc7CC4x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y53pqrEv,_ZThn4_N3ccc7CC4x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y53efgEv,_ZThn4_N3ccc7CC4x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y53abcEv,_ZThn4_N3ccc7CC4x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y5E[];
Class_Descriptor cd__ZN3ccc7CC4x5y5E = {  "_ZN3ccc7CC4x5y5E", // class name
  bases__ZN3ccc7CC4x5y5E, 2,
  &(vtc__ZN3ccc7CC4x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y6  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x5y63efgEv
  ~CC4x5y6(); // tgen
  CC4x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y6E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y63abcEv");}
void  ccc::CC4x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y63efgEv");}
ccc::CC4x5y6 ::~CC4x5y6(){ note_dtor("_ZN3ccc7CC4x5y6E", this);} // tgen
ccc::CC4x5y6 ::CC4x5y6(){ note_ctor("_ZN3ccc7CC4x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y6E, buf);
    ::ccc::CC4x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y6E);
    dp->::ccc::CC4x5y6::~CC4x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y6E(Test__ZN3ccc7CC4x5y6E, "_ZN3ccc7CC4x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y6C1Ev();
extern void _ZN3ccc7CC4x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y6E[] = {
  NSPAIR(_ZN3ccc7CC4x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x5y63abcEv();
extern void _ZN3ccc7CC4x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y63efgEv,_ZThn4_N3ccc7CC4x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y63abcEv,_ZThn4_N3ccc7CC4x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y63efgEv,_ZThn4_N3ccc7CC4x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y63abcEv,_ZThn4_N3ccc7CC4x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y6E[];
Class_Descriptor cd__ZN3ccc7CC4x5y6E = {  "_ZN3ccc7CC4x5y6E", // class name
  bases__ZN3ccc7CC4x5y6E, 2,
  &(vtc__ZN3ccc7CC4x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y7  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC4x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y73pqrEv
  ~CC4x5y7(); // tgen
  CC4x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y7E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y73abcEv");}
void  ccc::CC4x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y73pqrEv");}
ccc::CC4x5y7 ::~CC4x5y7(){ note_dtor("_ZN3ccc7CC4x5y7E", this);} // tgen
ccc::CC4x5y7 ::CC4x5y7(){ note_ctor("_ZN3ccc7CC4x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y7E, buf);
    ::ccc::CC4x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y7E);
    dp->::ccc::CC4x5y7::~CC4x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y7E(Test__ZN3ccc7CC4x5y7E, "_ZN3ccc7CC4x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y7C1Ev();
extern void _ZN3ccc7CC4x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y7E[] = {
  NSPAIR(_ZN3ccc7CC4x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y7E[];
extern void _ZN3ccc7CC4x5y73pqrEv();
extern void _ZN3ccc7CC4x5y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y73pqrEv,_ZThn4_N3ccc7CC4x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y73abcEv,_ZThn4_N3ccc7CC4x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y73pqrEv,_ZThn4_N3ccc7CC4x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y73abcEv,_ZThn4_N3ccc7CC4x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y7E[];
Class_Descriptor cd__ZN3ccc7CC4x5y7E = {  "_ZN3ccc7CC4x5y7E", // class name
  bases__ZN3ccc7CC4x5y7E, 2,
  &(vtc__ZN3ccc7CC4x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y8  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x5y83abcEv
  ~CC4x5y8(); // tgen
  CC4x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y8E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y83efgEv");}
void  ccc::CC4x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x5y83abcEv");}
ccc::CC4x5y8 ::~CC4x5y8(){ note_dtor("_ZN3ccc7CC4x5y8E", this);} // tgen
ccc::CC4x5y8 ::CC4x5y8(){ note_ctor("_ZN3ccc7CC4x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y8E, buf);
    ::ccc::CC4x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y8E);
    dp->::ccc::CC4x5y8::~CC4x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y8E(Test__ZN3ccc7CC4x5y8E, "_ZN3ccc7CC4x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y8C1Ev();
extern void _ZN3ccc7CC4x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y8E[] = {
  NSPAIR(_ZN3ccc7CC4x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x5y83abcEv();
extern void _ZN3ccc7CC4x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y83efgEv,_ZThn4_N3ccc7CC4x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y83abcEv,_ZThn4_N3ccc7CC4x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y83efgEv,_ZThn4_N3ccc7CC4x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y83abcEv,_ZThn4_N3ccc7CC4x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y8E[];
Class_Descriptor cd__ZN3ccc7CC4x5y8E = {  "_ZN3ccc7CC4x5y8E", // class name
  bases__ZN3ccc7CC4x5y8E, 2,
  &(vtc__ZN3ccc7CC4x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y9  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC4x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x5y93pqrEv
  ~CC4x5y9(); // tgen
  CC4x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x5y9E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x5y93efgEv");}
void  ccc::CC4x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x5y93pqrEv");}
ccc::CC4x5y9 ::~CC4x5y9(){ note_dtor("_ZN3ccc7CC4x5y9E", this);} // tgen
ccc::CC4x5y9 ::CC4x5y9(){ note_ctor("_ZN3ccc7CC4x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x5y9E, buf);
    ::ccc::CC4x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x5y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7CC4x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x5y9E);
    dp->::ccc::CC4x5y9::~CC4x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x5y9E(Test__ZN3ccc7CC4x5y9E, "_ZN3ccc7CC4x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x5y9C1Ev();
extern void _ZN3ccc7CC4x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x5y9E[] = {
  NSPAIR(_ZN3ccc7CC4x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC4x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y9E[];
extern void _ZN3ccc7CC4x5y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y93pqrEv,_ZThn4_N3ccc7CC4x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x5y93efgEv,_ZThn4_N3ccc7CC4x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y93pqrEv,_ZThn4_N3ccc7CC4x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x5y93efgEv,_ZThn4_N3ccc7CC4x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x5y9E[];
Class_Descriptor cd__ZN3ccc7CC4x5y9E = {  "_ZN3ccc7CC4x5y9E", // class name
  bases__ZN3ccc7CC4x5y9E, 2,
  &(vtc__ZN3ccc7CC4x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y10  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x5y103abcEv
  ~CC4x5y10(); // tgen
  CC4x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y10E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y103pqrEv");}
void  ccc::CC4x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x5y103abcEv");}
ccc::CC4x5y10 ::~CC4x5y10(){ note_dtor("_ZN3ccc8CC4x5y10E", this);} // tgen
ccc::CC4x5y10 ::CC4x5y10(){ note_ctor("_ZN3ccc8CC4x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y10E, buf);
    ::ccc::CC4x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y10E);
    dp->::ccc::CC4x5y10::~CC4x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y10E(Test__ZN3ccc8CC4x5y10E, "_ZN3ccc8CC4x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y10C1Ev();
extern void _ZN3ccc8CC4x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y10E[] = {
  NSPAIR(_ZN3ccc8CC4x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y10E[];
extern void _ZN3ccc8CC4x5y103pqrEv();
extern void _ZN3ccc8CC4x5y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y103pqrEv,_ZThn4_N3ccc8CC4x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y103abcEv,_ZThn4_N3ccc8CC4x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y103pqrEv,_ZThn4_N3ccc8CC4x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y103abcEv,_ZThn4_N3ccc8CC4x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y10E[];
Class_Descriptor cd__ZN3ccc8CC4x5y10E = {  "_ZN3ccc8CC4x5y10E", // class name
  bases__ZN3ccc8CC4x5y10E, 2,
  &(vtc__ZN3ccc8CC4x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y11  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x5y113efgEv
  ~CC4x5y11(); // tgen
  CC4x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y11E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y113pqrEv");}
void  ccc::CC4x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x5y113efgEv");}
ccc::CC4x5y11 ::~CC4x5y11(){ note_dtor("_ZN3ccc8CC4x5y11E", this);} // tgen
ccc::CC4x5y11 ::CC4x5y11(){ note_ctor("_ZN3ccc8CC4x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y11E, buf);
    ::ccc::CC4x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y11E);
    dp->::ccc::CC4x5y11::~CC4x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y11E(Test__ZN3ccc8CC4x5y11E, "_ZN3ccc8CC4x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y11C1Ev();
extern void _ZN3ccc8CC4x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y11E[] = {
  NSPAIR(_ZN3ccc8CC4x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y11E[];
extern void _ZN3ccc8CC4x5y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y113pqrEv,_ZThn4_N3ccc8CC4x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y113efgEv,_ZThn4_N3ccc8CC4x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y113pqrEv,_ZThn4_N3ccc8CC4x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y113efgEv,_ZThn4_N3ccc8CC4x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y11E[];
Class_Descriptor cd__ZN3ccc8CC4x5y11E = {  "_ZN3ccc8CC4x5y11E", // class name
  bases__ZN3ccc8CC4x5y11E, 2,
  &(vtc__ZN3ccc8CC4x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y12  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC4x5y123abcEv
  ~CC4x5y12(); // tgen
  CC4x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC4x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x5y123abcEv");}
ccc::CC4x5y12 ::~CC4x5y12(){ note_dtor("_ZN3ccc8CC4x5y12E", this);} // tgen
ccc::CC4x5y12 ::CC4x5y12(){ note_ctor("_ZN3ccc8CC4x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y12E, buf);
    ::ccc::CC4x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y12E);
    dp->::ccc::CC4x5y12::~CC4x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y12E(Test__ZN3ccc8CC4x5y12E, "_ZN3ccc8CC4x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y12C1Ev();
extern void _ZN3ccc8CC4x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y12E[] = {
  NSPAIR(_ZN3ccc8CC4x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x5y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y123abcEv,_ZThn4_N3ccc8CC4x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y123abcEv,_ZThn4_N3ccc8CC4x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y12E[];
Class_Descriptor cd__ZN3ccc8CC4x5y12E = {  "_ZN3ccc8CC4x5y12E", // class name
  bases__ZN3ccc8CC4x5y12E, 2,
  &(vtc__ZN3ccc8CC4x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y13  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC4x5y133efgEv
  ~CC4x5y13(); // tgen
  CC4x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC4x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x5y133efgEv");}
ccc::CC4x5y13 ::~CC4x5y13(){ note_dtor("_ZN3ccc8CC4x5y13E", this);} // tgen
ccc::CC4x5y13 ::CC4x5y13(){ note_ctor("_ZN3ccc8CC4x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y13E, buf);
    ::ccc::CC4x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y13E);
    dp->::ccc::CC4x5y13::~CC4x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y13E(Test__ZN3ccc8CC4x5y13E, "_ZN3ccc8CC4x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y13C1Ev();
extern void _ZN3ccc8CC4x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y13E[] = {
  NSPAIR(_ZN3ccc8CC4x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y133efgEv,_ZThn4_N3ccc8CC4x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y133efgEv,_ZThn4_N3ccc8CC4x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y13E[];
Class_Descriptor cd__ZN3ccc8CC4x5y13E = {  "_ZN3ccc8CC4x5y13E", // class name
  bases__ZN3ccc8CC4x5y13E, 2,
  &(vtc__ZN3ccc8CC4x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y14  : ::ccc::AA4 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC4x5y143pqrEv
  ~CC4x5y14(); // tgen
  CC4x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y14E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x5y143pqrEv");}
ccc::CC4x5y14 ::~CC4x5y14(){ note_dtor("_ZN3ccc8CC4x5y14E", this);} // tgen
ccc::CC4x5y14 ::CC4x5y14(){ note_ctor("_ZN3ccc8CC4x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y14E, buf);
    ::ccc::CC4x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y14E);
    dp->::ccc::CC4x5y14::~CC4x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y14E(Test__ZN3ccc8CC4x5y14E, "_ZN3ccc8CC4x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y14C1Ev();
extern void _ZN3ccc8CC4x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y14E[] = {
  NSPAIR(_ZN3ccc8CC4x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y14E[];
extern void _ZN3ccc8CC4x5y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x5y143pqrEv,_ZThn4_N3ccc8CC4x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x5y143pqrEv,_ZThn4_N3ccc8CC4x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y14E[];
Class_Descriptor cd__ZN3ccc8CC4x5y14E = {  "_ZN3ccc8CC4x5y14E", // class name
  bases__ZN3ccc8CC4x5y14E, 2,
  &(vtc__ZN3ccc8CC4x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x5y15  : ::ccc::AA4 , ::ccc::BB5 {
  ~CC4x5y15(); // tgen
  CC4x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x5y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC4x5y15 ::~CC4x5y15(){ note_dtor("_ZN3ccc8CC4x5y15E", this);} // tgen
ccc::CC4x5y15 ::CC4x5y15(){ note_ctor("_ZN3ccc8CC4x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x5y15E, buf);
    ::ccc::CC4x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x5y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC4x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x5y15E);
    dp->::ccc::CC4x5y15::~CC4x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x5y15E(Test__ZN3ccc8CC4x5y15E, "_ZN3ccc8CC4x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x5y15C1Ev();
extern void _ZN3ccc8CC4x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x5y15E[] = {
  NSPAIR(_ZN3ccc8CC4x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC4x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x5y15E[];
Class_Descriptor cd__ZN3ccc8CC4x5y15E = {  "_ZN3ccc8CC4x5y15E", // class name
  bases__ZN3ccc8CC4x5y15E, 2,
  &(vtc__ZN3ccc8CC4x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y0  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y03pqrEv
  ~CC4x6y0(); // tgen
  CC4x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y0E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y03abcEv");}
void  ccc::CC4x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y03efgEv");}
void  ccc::CC4x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y03pqrEv");}
ccc::CC4x6y0 ::~CC4x6y0(){ note_dtor("_ZN3ccc7CC4x6y0E", this);} // tgen
ccc::CC4x6y0 ::CC4x6y0(){ note_ctor("_ZN3ccc7CC4x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y0E, buf);
    ::ccc::CC4x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y0E);
    dp->::ccc::CC4x6y0::~CC4x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y0E(Test__ZN3ccc7CC4x6y0E, "_ZN3ccc7CC4x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y0C1Ev();
extern void _ZN3ccc7CC4x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y0E[] = {
  NSPAIR(_ZN3ccc7CC4x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y0E[];
extern void _ZN3ccc7CC4x6y03pqrEv();
extern void _ZN3ccc7CC4x6y03abcEv();
extern void _ZN3ccc7CC4x6y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y03abcEv,_ZThn4_N3ccc7CC4x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y03efgEv,_ZThn4_N3ccc7CC4x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y03abcEv,_ZThn4_N3ccc7CC4x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y03efgEv,_ZThn4_N3ccc7CC4x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y0E[];
Class_Descriptor cd__ZN3ccc7CC4x6y0E = {  "_ZN3ccc7CC4x6y0E", // class name
  bases__ZN3ccc7CC4x6y0E, 2,
  &(vtc__ZN3ccc7CC4x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y1  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x6y13efgEv
  ~CC4x6y1(); // tgen
  CC4x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y1E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y13abcEv");}
void  ccc::CC4x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y13pqrEv");}
void  ccc::CC4x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y13efgEv");}
ccc::CC4x6y1 ::~CC4x6y1(){ note_dtor("_ZN3ccc7CC4x6y1E", this);} // tgen
ccc::CC4x6y1 ::CC4x6y1(){ note_ctor("_ZN3ccc7CC4x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y1E, buf);
    ::ccc::CC4x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y1E);
    dp->::ccc::CC4x6y1::~CC4x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y1E(Test__ZN3ccc7CC4x6y1E, "_ZN3ccc7CC4x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y1C1Ev();
extern void _ZN3ccc7CC4x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y1E[] = {
  NSPAIR(_ZN3ccc7CC4x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y1E[];
extern void _ZN3ccc7CC4x6y13pqrEv();
extern void _ZN3ccc7CC4x6y13abcEv();
extern void _ZN3ccc7CC4x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y13abcEv,_ZThn4_N3ccc7CC4x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y13efgEv,_ZThn4_N3ccc7CC4x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y13abcEv,_ZThn4_N3ccc7CC4x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y13efgEv,_ZThn4_N3ccc7CC4x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y1E[];
Class_Descriptor cd__ZN3ccc7CC4x6y1E = {  "_ZN3ccc7CC4x6y1E", // class name
  bases__ZN3ccc7CC4x6y1E, 2,
  &(vtc__ZN3ccc7CC4x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y2  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y23pqrEv
  ~CC4x6y2(); // tgen
  CC4x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y2E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y23efgEv");}
void  ccc::CC4x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y23abcEv");}
void  ccc::CC4x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y23pqrEv");}
ccc::CC4x6y2 ::~CC4x6y2(){ note_dtor("_ZN3ccc7CC4x6y2E", this);} // tgen
ccc::CC4x6y2 ::CC4x6y2(){ note_ctor("_ZN3ccc7CC4x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y2E, buf);
    ::ccc::CC4x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y2E);
    dp->::ccc::CC4x6y2::~CC4x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y2E(Test__ZN3ccc7CC4x6y2E, "_ZN3ccc7CC4x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y2C1Ev();
extern void _ZN3ccc7CC4x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y2E[] = {
  NSPAIR(_ZN3ccc7CC4x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y2E[];
extern void _ZN3ccc7CC4x6y23pqrEv();
extern void _ZN3ccc7CC4x6y23abcEv();
extern void _ZN3ccc7CC4x6y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y23abcEv,_ZThn4_N3ccc7CC4x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y23efgEv,_ZThn4_N3ccc7CC4x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y23abcEv,_ZThn4_N3ccc7CC4x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y23efgEv,_ZThn4_N3ccc7CC4x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y2E[];
Class_Descriptor cd__ZN3ccc7CC4x6y2E = {  "_ZN3ccc7CC4x6y2E", // class name
  bases__ZN3ccc7CC4x6y2E, 2,
  &(vtc__ZN3ccc7CC4x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y3  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x6y33abcEv
  ~CC4x6y3(); // tgen
  CC4x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y3E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y33efgEv");}
void  ccc::CC4x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y33pqrEv");}
void  ccc::CC4x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y33abcEv");}
ccc::CC4x6y3 ::~CC4x6y3(){ note_dtor("_ZN3ccc7CC4x6y3E", this);} // tgen
ccc::CC4x6y3 ::CC4x6y3(){ note_ctor("_ZN3ccc7CC4x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y3E, buf);
    ::ccc::CC4x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y3E);
    dp->::ccc::CC4x6y3::~CC4x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y3E(Test__ZN3ccc7CC4x6y3E, "_ZN3ccc7CC4x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y3C1Ev();
extern void _ZN3ccc7CC4x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y3E[] = {
  NSPAIR(_ZN3ccc7CC4x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y3E[];
extern void _ZN3ccc7CC4x6y33pqrEv();
extern void _ZN3ccc7CC4x6y33abcEv();
extern void _ZN3ccc7CC4x6y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y33abcEv,_ZThn4_N3ccc7CC4x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y33efgEv,_ZThn4_N3ccc7CC4x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y33abcEv,_ZThn4_N3ccc7CC4x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y33efgEv,_ZThn4_N3ccc7CC4x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y3E[];
Class_Descriptor cd__ZN3ccc7CC4x6y3E = {  "_ZN3ccc7CC4x6y3E", // class name
  bases__ZN3ccc7CC4x6y3E, 2,
  &(vtc__ZN3ccc7CC4x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y4  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC4x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y43efgEv
  ~CC4x6y4(); // tgen
  CC4x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y4E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y43pqrEv");}
void  ccc::CC4x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y43abcEv");}
void  ccc::CC4x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y43efgEv");}
ccc::CC4x6y4 ::~CC4x6y4(){ note_dtor("_ZN3ccc7CC4x6y4E", this);} // tgen
ccc::CC4x6y4 ::CC4x6y4(){ note_ctor("_ZN3ccc7CC4x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y4E, buf);
    ::ccc::CC4x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y4E);
    dp->::ccc::CC4x6y4::~CC4x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y4E(Test__ZN3ccc7CC4x6y4E, "_ZN3ccc7CC4x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y4C1Ev();
extern void _ZN3ccc7CC4x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y4E[] = {
  NSPAIR(_ZN3ccc7CC4x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y4E[];
extern void _ZN3ccc7CC4x6y43pqrEv();
extern void _ZN3ccc7CC4x6y43abcEv();
extern void _ZN3ccc7CC4x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y43abcEv,_ZThn4_N3ccc7CC4x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y43efgEv,_ZThn4_N3ccc7CC4x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y43abcEv,_ZThn4_N3ccc7CC4x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y43efgEv,_ZThn4_N3ccc7CC4x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y4E[];
Class_Descriptor cd__ZN3ccc7CC4x6y4E = {  "_ZN3ccc7CC4x6y4E", // class name
  bases__ZN3ccc7CC4x6y4E, 2,
  &(vtc__ZN3ccc7CC4x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y5  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC4x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y53abcEv
  ~CC4x6y5(); // tgen
  CC4x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y5E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y53pqrEv");}
void  ccc::CC4x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y53efgEv");}
void  ccc::CC4x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y53abcEv");}
ccc::CC4x6y5 ::~CC4x6y5(){ note_dtor("_ZN3ccc7CC4x6y5E", this);} // tgen
ccc::CC4x6y5 ::CC4x6y5(){ note_ctor("_ZN3ccc7CC4x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y5E, buf);
    ::ccc::CC4x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y5E);
    dp->::ccc::CC4x6y5::~CC4x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y5E(Test__ZN3ccc7CC4x6y5E, "_ZN3ccc7CC4x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y5C1Ev();
extern void _ZN3ccc7CC4x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y5E[] = {
  NSPAIR(_ZN3ccc7CC4x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y5E[];
extern void _ZN3ccc7CC4x6y53pqrEv();
extern void _ZN3ccc7CC4x6y53abcEv();
extern void _ZN3ccc7CC4x6y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y53abcEv,_ZThn4_N3ccc7CC4x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y53efgEv,_ZThn4_N3ccc7CC4x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y53abcEv,_ZThn4_N3ccc7CC4x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y53efgEv,_ZThn4_N3ccc7CC4x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y5E[];
Class_Descriptor cd__ZN3ccc7CC4x6y5E = {  "_ZN3ccc7CC4x6y5E", // class name
  bases__ZN3ccc7CC4x6y5E, 2,
  &(vtc__ZN3ccc7CC4x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y6  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x6y63efgEv
  ~CC4x6y6(); // tgen
  CC4x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y6E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y63abcEv");}
void  ccc::CC4x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y63efgEv");}
ccc::CC4x6y6 ::~CC4x6y6(){ note_dtor("_ZN3ccc7CC4x6y6E", this);} // tgen
ccc::CC4x6y6 ::CC4x6y6(){ note_ctor("_ZN3ccc7CC4x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y6E, buf);
    ::ccc::CC4x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y6E);
    dp->::ccc::CC4x6y6::~CC4x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y6E(Test__ZN3ccc7CC4x6y6E, "_ZN3ccc7CC4x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y6C1Ev();
extern void _ZN3ccc7CC4x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y6E[] = {
  NSPAIR(_ZN3ccc7CC4x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x6y63abcEv();
extern void _ZN3ccc7CC4x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y63abcEv,_ZThn4_N3ccc7CC4x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y63efgEv,_ZThn4_N3ccc7CC4x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y63abcEv,_ZThn4_N3ccc7CC4x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y63efgEv,_ZThn4_N3ccc7CC4x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y6E[];
Class_Descriptor cd__ZN3ccc7CC4x6y6E = {  "_ZN3ccc7CC4x6y6E", // class name
  bases__ZN3ccc7CC4x6y6E, 2,
  &(vtc__ZN3ccc7CC4x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y7  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC4x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y73pqrEv
  ~CC4x6y7(); // tgen
  CC4x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y7E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y73abcEv");}
void  ccc::CC4x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y73pqrEv");}
ccc::CC4x6y7 ::~CC4x6y7(){ note_dtor("_ZN3ccc7CC4x6y7E", this);} // tgen
ccc::CC4x6y7 ::CC4x6y7(){ note_ctor("_ZN3ccc7CC4x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y7E, buf);
    ::ccc::CC4x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y7E);
    dp->::ccc::CC4x6y7::~CC4x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y7E(Test__ZN3ccc7CC4x6y7E, "_ZN3ccc7CC4x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y7C1Ev();
extern void _ZN3ccc7CC4x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y7E[] = {
  NSPAIR(_ZN3ccc7CC4x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y7E[];
extern void _ZN3ccc7CC4x6y73pqrEv();
extern void _ZN3ccc7CC4x6y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y73abcEv,_ZThn4_N3ccc7CC4x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y73abcEv,_ZThn4_N3ccc7CC4x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y7E[];
Class_Descriptor cd__ZN3ccc7CC4x6y7E = {  "_ZN3ccc7CC4x6y7E", // class name
  bases__ZN3ccc7CC4x6y7E, 2,
  &(vtc__ZN3ccc7CC4x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y8  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x6y83abcEv
  ~CC4x6y8(); // tgen
  CC4x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y8E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y83efgEv");}
void  ccc::CC4x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x6y83abcEv");}
ccc::CC4x6y8 ::~CC4x6y8(){ note_dtor("_ZN3ccc7CC4x6y8E", this);} // tgen
ccc::CC4x6y8 ::CC4x6y8(){ note_ctor("_ZN3ccc7CC4x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y8E, buf);
    ::ccc::CC4x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y8E);
    dp->::ccc::CC4x6y8::~CC4x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y8E(Test__ZN3ccc7CC4x6y8E, "_ZN3ccc7CC4x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y8C1Ev();
extern void _ZN3ccc7CC4x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y8E[] = {
  NSPAIR(_ZN3ccc7CC4x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x6y83abcEv();
extern void _ZN3ccc7CC4x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y83abcEv,_ZThn4_N3ccc7CC4x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y83efgEv,_ZThn4_N3ccc7CC4x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y83abcEv,_ZThn4_N3ccc7CC4x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y83efgEv,_ZThn4_N3ccc7CC4x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y8E[];
Class_Descriptor cd__ZN3ccc7CC4x6y8E = {  "_ZN3ccc7CC4x6y8E", // class name
  bases__ZN3ccc7CC4x6y8E, 2,
  &(vtc__ZN3ccc7CC4x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y9  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC4x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x6y93pqrEv
  ~CC4x6y9(); // tgen
  CC4x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x6y9E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x6y93efgEv");}
void  ccc::CC4x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x6y93pqrEv");}
ccc::CC4x6y9 ::~CC4x6y9(){ note_dtor("_ZN3ccc7CC4x6y9E", this);} // tgen
ccc::CC4x6y9 ::CC4x6y9(){ note_ctor("_ZN3ccc7CC4x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x6y9E, buf);
    ::ccc::CC4x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x6y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7CC4x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x6y9E);
    dp->::ccc::CC4x6y9::~CC4x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x6y9E(Test__ZN3ccc7CC4x6y9E, "_ZN3ccc7CC4x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x6y9C1Ev();
extern void _ZN3ccc7CC4x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x6y9E[] = {
  NSPAIR(_ZN3ccc7CC4x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC4x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y9E[];
extern void _ZN3ccc7CC4x6y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x6y93efgEv,_ZThn4_N3ccc7CC4x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x6y93efgEv,_ZThn4_N3ccc7CC4x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x6y9E[];
Class_Descriptor cd__ZN3ccc7CC4x6y9E = {  "_ZN3ccc7CC4x6y9E", // class name
  bases__ZN3ccc7CC4x6y9E, 2,
  &(vtc__ZN3ccc7CC4x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y10  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x6y103abcEv
  ~CC4x6y10(); // tgen
  CC4x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y10E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y103pqrEv");}
void  ccc::CC4x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x6y103abcEv");}
ccc::CC4x6y10 ::~CC4x6y10(){ note_dtor("_ZN3ccc8CC4x6y10E", this);} // tgen
ccc::CC4x6y10 ::CC4x6y10(){ note_ctor("_ZN3ccc8CC4x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y10E, buf);
    ::ccc::CC4x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y10E);
    dp->::ccc::CC4x6y10::~CC4x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y10E(Test__ZN3ccc8CC4x6y10E, "_ZN3ccc8CC4x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y10C1Ev();
extern void _ZN3ccc8CC4x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y10E[] = {
  NSPAIR(_ZN3ccc8CC4x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y10E[];
extern void _ZN3ccc8CC4x6y103pqrEv();
extern void _ZN3ccc8CC4x6y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y103abcEv,_ZThn4_N3ccc8CC4x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x6y103abcEv,_ZThn4_N3ccc8CC4x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y10E[];
Class_Descriptor cd__ZN3ccc8CC4x6y10E = {  "_ZN3ccc8CC4x6y10E", // class name
  bases__ZN3ccc8CC4x6y10E, 2,
  &(vtc__ZN3ccc8CC4x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y11  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x6y113efgEv
  ~CC4x6y11(); // tgen
  CC4x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y11E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y113pqrEv");}
void  ccc::CC4x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x6y113efgEv");}
ccc::CC4x6y11 ::~CC4x6y11(){ note_dtor("_ZN3ccc8CC4x6y11E", this);} // tgen
ccc::CC4x6y11 ::CC4x6y11(){ note_ctor("_ZN3ccc8CC4x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y11E, buf);
    ::ccc::CC4x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y11E);
    dp->::ccc::CC4x6y11::~CC4x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y11E(Test__ZN3ccc8CC4x6y11E, "_ZN3ccc8CC4x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y11C1Ev();
extern void _ZN3ccc8CC4x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y11E[] = {
  NSPAIR(_ZN3ccc8CC4x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y11E[];
extern void _ZN3ccc8CC4x6y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y113efgEv,_ZThn4_N3ccc8CC4x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x6y113efgEv,_ZThn4_N3ccc8CC4x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y11E[];
Class_Descriptor cd__ZN3ccc8CC4x6y11E = {  "_ZN3ccc8CC4x6y11E", // class name
  bases__ZN3ccc8CC4x6y11E, 2,
  &(vtc__ZN3ccc8CC4x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y12  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC4x6y123abcEv
  ~CC4x6y12(); // tgen
  CC4x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x6y123abcEv");}
ccc::CC4x6y12 ::~CC4x6y12(){ note_dtor("_ZN3ccc8CC4x6y12E", this);} // tgen
ccc::CC4x6y12 ::CC4x6y12(){ note_ctor("_ZN3ccc8CC4x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y12E, buf);
    ::ccc::CC4x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y12E);
    dp->::ccc::CC4x6y12::~CC4x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y12E(Test__ZN3ccc8CC4x6y12E, "_ZN3ccc8CC4x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y12C1Ev();
extern void _ZN3ccc8CC4x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y12E[] = {
  NSPAIR(_ZN3ccc8CC4x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x6y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y123abcEv,_ZThn4_N3ccc8CC4x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x6y123abcEv,_ZThn4_N3ccc8CC4x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y12E[];
Class_Descriptor cd__ZN3ccc8CC4x6y12E = {  "_ZN3ccc8CC4x6y12E", // class name
  bases__ZN3ccc8CC4x6y12E, 2,
  &(vtc__ZN3ccc8CC4x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y13  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC4x6y133efgEv
  ~CC4x6y13(); // tgen
  CC4x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x6y133efgEv");}
ccc::CC4x6y13 ::~CC4x6y13(){ note_dtor("_ZN3ccc8CC4x6y13E", this);} // tgen
ccc::CC4x6y13 ::CC4x6y13(){ note_ctor("_ZN3ccc8CC4x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y13E, buf);
    ::ccc::CC4x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y13E);
    dp->::ccc::CC4x6y13::~CC4x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y13E(Test__ZN3ccc8CC4x6y13E, "_ZN3ccc8CC4x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y13C1Ev();
extern void _ZN3ccc8CC4x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y13E[] = {
  NSPAIR(_ZN3ccc8CC4x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x6y133efgEv,_ZThn4_N3ccc8CC4x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x6y133efgEv,_ZThn4_N3ccc8CC4x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y13E[];
Class_Descriptor cd__ZN3ccc8CC4x6y13E = {  "_ZN3ccc8CC4x6y13E", // class name
  bases__ZN3ccc8CC4x6y13E, 2,
  &(vtc__ZN3ccc8CC4x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y14  : ::ccc::AA4 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC4x6y143pqrEv
  ~CC4x6y14(); // tgen
  CC4x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x6y143pqrEv");}
ccc::CC4x6y14 ::~CC4x6y14(){ note_dtor("_ZN3ccc8CC4x6y14E", this);} // tgen
ccc::CC4x6y14 ::CC4x6y14(){ note_ctor("_ZN3ccc8CC4x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y14E, buf);
    ::ccc::CC4x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y14E);
    dp->::ccc::CC4x6y14::~CC4x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y14E(Test__ZN3ccc8CC4x6y14E, "_ZN3ccc8CC4x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y14C1Ev();
extern void _ZN3ccc8CC4x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y14E[] = {
  NSPAIR(_ZN3ccc8CC4x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y14E[];
extern void _ZN3ccc8CC4x6y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y14E[];
Class_Descriptor cd__ZN3ccc8CC4x6y14E = {  "_ZN3ccc8CC4x6y14E", // class name
  bases__ZN3ccc8CC4x6y14E, 2,
  &(vtc__ZN3ccc8CC4x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x6y15  : ::ccc::AA4 , ::ccc::BB6 {
  ~CC4x6y15(); // tgen
  CC4x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x6y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x6y15 ::~CC4x6y15(){ note_dtor("_ZN3ccc8CC4x6y15E", this);} // tgen
ccc::CC4x6y15 ::CC4x6y15(){ note_ctor("_ZN3ccc8CC4x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x6y15E, buf);
    ::ccc::CC4x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x6y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC4x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x6y15E);
    dp->::ccc::CC4x6y15::~CC4x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x6y15E(Test__ZN3ccc8CC4x6y15E, "_ZN3ccc8CC4x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x6y15C1Ev();
extern void _ZN3ccc8CC4x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x6y15E[] = {
  NSPAIR(_ZN3ccc8CC4x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC4x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x6y15E[];
Class_Descriptor cd__ZN3ccc8CC4x6y15E = {  "_ZN3ccc8CC4x6y15E", // class name
  bases__ZN3ccc8CC4x6y15E, 2,
  &(vtc__ZN3ccc8CC4x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y0  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y03pqrEv
  ~CC4x7y0(); // tgen
  CC4x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y0E) C1{ BC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y03abcEv");}
void  ccc::CC4x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y03efgEv");}
void  ccc::CC4x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y03pqrEv");}
ccc::CC4x7y0 ::~CC4x7y0(){ note_dtor("_ZN3ccc7CC4x7y0E", this);} // tgen
ccc::CC4x7y0 ::CC4x7y0(){ note_ctor("_ZN3ccc7CC4x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y0E, buf);
    ::ccc::CC4x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y0E);
    dp->::ccc::CC4x7y0::~CC4x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y0E(Test__ZN3ccc7CC4x7y0E, "_ZN3ccc7CC4x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y0C1Ev();
extern void _ZN3ccc7CC4x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y0E[] = {
  NSPAIR(_ZN3ccc7CC4x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y0E[];
extern void _ZN3ccc7CC4x7y03pqrEv();
extern void _ZN3ccc7CC4x7y03abcEv();
extern void _ZN3ccc7CC4x7y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y03abcEv,_ZThn4_N3ccc7CC4x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y03pqrEv,_ZThn4_N3ccc7CC4x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y03abcEv,_ZThn4_N3ccc7CC4x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y03pqrEv,_ZThn4_N3ccc7CC4x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y0E[];
Class_Descriptor cd__ZN3ccc7CC4x7y0E = {  "_ZN3ccc7CC4x7y0E", // class name
  bases__ZN3ccc7CC4x7y0E, 2,
  &(vtc__ZN3ccc7CC4x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y1  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x7y13efgEv
  ~CC4x7y1(); // tgen
  CC4x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y1E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y13abcEv");}
void  ccc::CC4x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y13pqrEv");}
void  ccc::CC4x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y13efgEv");}
ccc::CC4x7y1 ::~CC4x7y1(){ note_dtor("_ZN3ccc7CC4x7y1E", this);} // tgen
ccc::CC4x7y1 ::CC4x7y1(){ note_ctor("_ZN3ccc7CC4x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y1E, buf);
    ::ccc::CC4x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y1E);
    dp->::ccc::CC4x7y1::~CC4x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y1E(Test__ZN3ccc7CC4x7y1E, "_ZN3ccc7CC4x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y1C1Ev();
extern void _ZN3ccc7CC4x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y1E[] = {
  NSPAIR(_ZN3ccc7CC4x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y1E[];
extern void _ZN3ccc7CC4x7y13pqrEv();
extern void _ZN3ccc7CC4x7y13abcEv();
extern void _ZN3ccc7CC4x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y13abcEv,_ZThn4_N3ccc7CC4x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y13pqrEv,_ZThn4_N3ccc7CC4x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y13abcEv,_ZThn4_N3ccc7CC4x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y13pqrEv,_ZThn4_N3ccc7CC4x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y1E[];
Class_Descriptor cd__ZN3ccc7CC4x7y1E = {  "_ZN3ccc7CC4x7y1E", // class name
  bases__ZN3ccc7CC4x7y1E, 2,
  &(vtc__ZN3ccc7CC4x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y2  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y23pqrEv
  ~CC4x7y2(); // tgen
  CC4x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y2E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y23efgEv");}
void  ccc::CC4x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y23abcEv");}
void  ccc::CC4x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y23pqrEv");}
ccc::CC4x7y2 ::~CC4x7y2(){ note_dtor("_ZN3ccc7CC4x7y2E", this);} // tgen
ccc::CC4x7y2 ::CC4x7y2(){ note_ctor("_ZN3ccc7CC4x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y2E, buf);
    ::ccc::CC4x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y2E);
    dp->::ccc::CC4x7y2::~CC4x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y2E(Test__ZN3ccc7CC4x7y2E, "_ZN3ccc7CC4x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y2C1Ev();
extern void _ZN3ccc7CC4x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y2E[] = {
  NSPAIR(_ZN3ccc7CC4x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y2E[];
extern void _ZN3ccc7CC4x7y23pqrEv();
extern void _ZN3ccc7CC4x7y23abcEv();
extern void _ZN3ccc7CC4x7y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y23abcEv,_ZThn4_N3ccc7CC4x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y23pqrEv,_ZThn4_N3ccc7CC4x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y23abcEv,_ZThn4_N3ccc7CC4x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y23pqrEv,_ZThn4_N3ccc7CC4x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y2E[];
Class_Descriptor cd__ZN3ccc7CC4x7y2E = {  "_ZN3ccc7CC4x7y2E", // class name
  bases__ZN3ccc7CC4x7y2E, 2,
  &(vtc__ZN3ccc7CC4x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y3  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x7y33abcEv
  ~CC4x7y3(); // tgen
  CC4x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y3E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y33efgEv");}
void  ccc::CC4x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y33pqrEv");}
void  ccc::CC4x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y33abcEv");}
ccc::CC4x7y3 ::~CC4x7y3(){ note_dtor("_ZN3ccc7CC4x7y3E", this);} // tgen
ccc::CC4x7y3 ::CC4x7y3(){ note_ctor("_ZN3ccc7CC4x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y3E, buf);
    ::ccc::CC4x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y3E);
    dp->::ccc::CC4x7y3::~CC4x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y3E(Test__ZN3ccc7CC4x7y3E, "_ZN3ccc7CC4x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y3C1Ev();
extern void _ZN3ccc7CC4x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y3E[] = {
  NSPAIR(_ZN3ccc7CC4x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y3E[];
extern void _ZN3ccc7CC4x7y33pqrEv();
extern void _ZN3ccc7CC4x7y33abcEv();
extern void _ZN3ccc7CC4x7y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y33abcEv,_ZThn4_N3ccc7CC4x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y33pqrEv,_ZThn4_N3ccc7CC4x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y33abcEv,_ZThn4_N3ccc7CC4x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y33pqrEv,_ZThn4_N3ccc7CC4x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y3E[];
Class_Descriptor cd__ZN3ccc7CC4x7y3E = {  "_ZN3ccc7CC4x7y3E", // class name
  bases__ZN3ccc7CC4x7y3E, 2,
  &(vtc__ZN3ccc7CC4x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y4  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC4x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y43efgEv
  ~CC4x7y4(); // tgen
  CC4x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y4E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y43pqrEv");}
void  ccc::CC4x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y43abcEv");}
void  ccc::CC4x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y43efgEv");}
ccc::CC4x7y4 ::~CC4x7y4(){ note_dtor("_ZN3ccc7CC4x7y4E", this);} // tgen
ccc::CC4x7y4 ::CC4x7y4(){ note_ctor("_ZN3ccc7CC4x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y4E, buf);
    ::ccc::CC4x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y4E);
    dp->::ccc::CC4x7y4::~CC4x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y4E(Test__ZN3ccc7CC4x7y4E, "_ZN3ccc7CC4x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y4C1Ev();
extern void _ZN3ccc7CC4x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y4E[] = {
  NSPAIR(_ZN3ccc7CC4x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y4E[];
extern void _ZN3ccc7CC4x7y43pqrEv();
extern void _ZN3ccc7CC4x7y43abcEv();
extern void _ZN3ccc7CC4x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y43abcEv,_ZThn4_N3ccc7CC4x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y43pqrEv,_ZThn4_N3ccc7CC4x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y43abcEv,_ZThn4_N3ccc7CC4x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y43pqrEv,_ZThn4_N3ccc7CC4x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y4E[];
Class_Descriptor cd__ZN3ccc7CC4x7y4E = {  "_ZN3ccc7CC4x7y4E", // class name
  bases__ZN3ccc7CC4x7y4E, 2,
  &(vtc__ZN3ccc7CC4x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y5  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC4x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y53abcEv
  ~CC4x7y5(); // tgen
  CC4x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y5E) C1{ BC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y53pqrEv");}
void  ccc::CC4x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y53efgEv");}
void  ccc::CC4x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y53abcEv");}
ccc::CC4x7y5 ::~CC4x7y5(){ note_dtor("_ZN3ccc7CC4x7y5E", this);} // tgen
ccc::CC4x7y5 ::CC4x7y5(){ note_ctor("_ZN3ccc7CC4x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y5E, buf);
    ::ccc::CC4x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y5E);
    dp->::ccc::CC4x7y5::~CC4x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y5E(Test__ZN3ccc7CC4x7y5E, "_ZN3ccc7CC4x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y5C1Ev();
extern void _ZN3ccc7CC4x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y5E[] = {
  NSPAIR(_ZN3ccc7CC4x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y5E[];
extern void _ZN3ccc7CC4x7y53pqrEv();
extern void _ZN3ccc7CC4x7y53abcEv();
extern void _ZN3ccc7CC4x7y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y53abcEv,_ZThn4_N3ccc7CC4x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y53pqrEv,_ZThn4_N3ccc7CC4x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y53abcEv,_ZThn4_N3ccc7CC4x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y53pqrEv,_ZThn4_N3ccc7CC4x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y5E[];
Class_Descriptor cd__ZN3ccc7CC4x7y5E = {  "_ZN3ccc7CC4x7y5E", // class name
  bases__ZN3ccc7CC4x7y5E, 2,
  &(vtc__ZN3ccc7CC4x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y6  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x7y63efgEv
  ~CC4x7y6(); // tgen
  CC4x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y6E) C1{ BC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y63abcEv");}
void  ccc::CC4x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y63efgEv");}
ccc::CC4x7y6 ::~CC4x7y6(){ note_dtor("_ZN3ccc7CC4x7y6E", this);} // tgen
ccc::CC4x7y6 ::CC4x7y6(){ note_ctor("_ZN3ccc7CC4x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y6E, buf);
    ::ccc::CC4x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y6E);
    dp->::ccc::CC4x7y6::~CC4x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y6E(Test__ZN3ccc7CC4x7y6E, "_ZN3ccc7CC4x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y6C1Ev();
extern void _ZN3ccc7CC4x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y6E[] = {
  NSPAIR(_ZN3ccc7CC4x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x7y63abcEv();
extern void _ZN3ccc7CC4x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y63abcEv,_ZThn4_N3ccc7CC4x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y63abcEv,_ZThn4_N3ccc7CC4x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y6E[];
Class_Descriptor cd__ZN3ccc7CC4x7y6E = {  "_ZN3ccc7CC4x7y6E", // class name
  bases__ZN3ccc7CC4x7y6E, 2,
  &(vtc__ZN3ccc7CC4x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y7  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC4x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y73pqrEv
  ~CC4x7y7(); // tgen
  CC4x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y7E) C1{ BC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y73abcEv");}
void  ccc::CC4x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y73pqrEv");}
ccc::CC4x7y7 ::~CC4x7y7(){ note_dtor("_ZN3ccc7CC4x7y7E", this);} // tgen
ccc::CC4x7y7 ::CC4x7y7(){ note_ctor("_ZN3ccc7CC4x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y7E, buf);
    ::ccc::CC4x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y7E);
    dp->::ccc::CC4x7y7::~CC4x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y7E(Test__ZN3ccc7CC4x7y7E, "_ZN3ccc7CC4x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y7C1Ev();
extern void _ZN3ccc7CC4x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y7E[] = {
  NSPAIR(_ZN3ccc7CC4x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y7E[];
extern void _ZN3ccc7CC4x7y73pqrEv();
extern void _ZN3ccc7CC4x7y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y73abcEv,_ZThn4_N3ccc7CC4x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y73pqrEv,_ZThn4_N3ccc7CC4x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y73abcEv,_ZThn4_N3ccc7CC4x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y73pqrEv,_ZThn4_N3ccc7CC4x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y7E[];
Class_Descriptor cd__ZN3ccc7CC4x7y7E = {  "_ZN3ccc7CC4x7y7E", // class name
  bases__ZN3ccc7CC4x7y7E, 2,
  &(vtc__ZN3ccc7CC4x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y8  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x7y83abcEv
  ~CC4x7y8(); // tgen
  CC4x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y8E) C1{ BC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y83efgEv");}
void  ccc::CC4x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x7y83abcEv");}
ccc::CC4x7y8 ::~CC4x7y8(){ note_dtor("_ZN3ccc7CC4x7y8E", this);} // tgen
ccc::CC4x7y8 ::CC4x7y8(){ note_ctor("_ZN3ccc7CC4x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y8E, buf);
    ::ccc::CC4x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y8E);
    dp->::ccc::CC4x7y8::~CC4x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y8E(Test__ZN3ccc7CC4x7y8E, "_ZN3ccc7CC4x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y8C1Ev();
extern void _ZN3ccc7CC4x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y8E[] = {
  NSPAIR(_ZN3ccc7CC4x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x7y83abcEv();
extern void _ZN3ccc7CC4x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y83abcEv,_ZThn4_N3ccc7CC4x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y83abcEv,_ZThn4_N3ccc7CC4x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y8E[];
Class_Descriptor cd__ZN3ccc7CC4x7y8E = {  "_ZN3ccc7CC4x7y8E", // class name
  bases__ZN3ccc7CC4x7y8E, 2,
  &(vtc__ZN3ccc7CC4x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y9  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC4x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x7y93pqrEv
  ~CC4x7y9(); // tgen
  CC4x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x7y9E) C1{ BC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x7y93efgEv");}
void  ccc::CC4x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x7y93pqrEv");}
ccc::CC4x7y9 ::~CC4x7y9(){ note_dtor("_ZN3ccc7CC4x7y9E", this);} // tgen
ccc::CC4x7y9 ::CC4x7y9(){ note_ctor("_ZN3ccc7CC4x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x7y9E, buf);
    ::ccc::CC4x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x7y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7CC4x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x7y9E);
    dp->::ccc::CC4x7y9::~CC4x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x7y9E(Test__ZN3ccc7CC4x7y9E, "_ZN3ccc7CC4x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x7y9C1Ev();
extern void _ZN3ccc7CC4x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x7y9E[] = {
  NSPAIR(_ZN3ccc7CC4x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC4x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y9E[];
extern void _ZN3ccc7CC4x7y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x7y93pqrEv,_ZThn4_N3ccc7CC4x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x7y93pqrEv,_ZThn4_N3ccc7CC4x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x7y9E[];
Class_Descriptor cd__ZN3ccc7CC4x7y9E = {  "_ZN3ccc7CC4x7y9E", // class name
  bases__ZN3ccc7CC4x7y9E, 2,
  &(vtc__ZN3ccc7CC4x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y10  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x7y103abcEv
  ~CC4x7y10(); // tgen
  CC4x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y10E) C1{ BC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y103pqrEv");}
void  ccc::CC4x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x7y103abcEv");}
ccc::CC4x7y10 ::~CC4x7y10(){ note_dtor("_ZN3ccc8CC4x7y10E", this);} // tgen
ccc::CC4x7y10 ::CC4x7y10(){ note_ctor("_ZN3ccc8CC4x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y10E, buf);
    ::ccc::CC4x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y10E);
    dp->::ccc::CC4x7y10::~CC4x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y10E(Test__ZN3ccc8CC4x7y10E, "_ZN3ccc8CC4x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y10C1Ev();
extern void _ZN3ccc8CC4x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y10E[] = {
  NSPAIR(_ZN3ccc8CC4x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y10E[];
extern void _ZN3ccc8CC4x7y103pqrEv();
extern void _ZN3ccc8CC4x7y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y103abcEv,_ZThn4_N3ccc8CC4x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y103pqrEv,_ZThn4_N3ccc8CC4x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x7y103abcEv,_ZThn4_N3ccc8CC4x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x7y103pqrEv,_ZThn4_N3ccc8CC4x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y10E[];
Class_Descriptor cd__ZN3ccc8CC4x7y10E = {  "_ZN3ccc8CC4x7y10E", // class name
  bases__ZN3ccc8CC4x7y10E, 2,
  &(vtc__ZN3ccc8CC4x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y11  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x7y113efgEv
  ~CC4x7y11(); // tgen
  CC4x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y11E) C1{ BC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y113pqrEv");}
void  ccc::CC4x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x7y113efgEv");}
ccc::CC4x7y11 ::~CC4x7y11(){ note_dtor("_ZN3ccc8CC4x7y11E", this);} // tgen
ccc::CC4x7y11 ::CC4x7y11(){ note_ctor("_ZN3ccc8CC4x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y11E, buf);
    ::ccc::CC4x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y11E);
    dp->::ccc::CC4x7y11::~CC4x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y11E(Test__ZN3ccc8CC4x7y11E, "_ZN3ccc8CC4x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y11C1Ev();
extern void _ZN3ccc8CC4x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y11E[] = {
  NSPAIR(_ZN3ccc8CC4x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y11E[];
extern void _ZN3ccc8CC4x7y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y113pqrEv,_ZThn4_N3ccc8CC4x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x7y113pqrEv,_ZThn4_N3ccc8CC4x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y11E[];
Class_Descriptor cd__ZN3ccc8CC4x7y11E = {  "_ZN3ccc8CC4x7y11E", // class name
  bases__ZN3ccc8CC4x7y11E, 2,
  &(vtc__ZN3ccc8CC4x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y12  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC4x7y123abcEv
  ~CC4x7y12(); // tgen
  CC4x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y12E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x7y123abcEv");}
ccc::CC4x7y12 ::~CC4x7y12(){ note_dtor("_ZN3ccc8CC4x7y12E", this);} // tgen
ccc::CC4x7y12 ::CC4x7y12(){ note_ctor("_ZN3ccc8CC4x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y12E, buf);
    ::ccc::CC4x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y12E);
    dp->::ccc::CC4x7y12::~CC4x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y12E(Test__ZN3ccc8CC4x7y12E, "_ZN3ccc8CC4x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y12C1Ev();
extern void _ZN3ccc8CC4x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y12E[] = {
  NSPAIR(_ZN3ccc8CC4x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x7y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y123abcEv,_ZThn4_N3ccc8CC4x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x7y123abcEv,_ZThn4_N3ccc8CC4x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y12E[];
Class_Descriptor cd__ZN3ccc8CC4x7y12E = {  "_ZN3ccc8CC4x7y12E", // class name
  bases__ZN3ccc8CC4x7y12E, 2,
  &(vtc__ZN3ccc8CC4x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y13  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC4x7y133efgEv
  ~CC4x7y13(); // tgen
  CC4x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x7y133efgEv");}
ccc::CC4x7y13 ::~CC4x7y13(){ note_dtor("_ZN3ccc8CC4x7y13E", this);} // tgen
ccc::CC4x7y13 ::CC4x7y13(){ note_ctor("_ZN3ccc8CC4x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y13E, buf);
    ::ccc::CC4x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y13E);
    dp->::ccc::CC4x7y13::~CC4x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y13E(Test__ZN3ccc8CC4x7y13E, "_ZN3ccc8CC4x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y13C1Ev();
extern void _ZN3ccc8CC4x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y13E[] = {
  NSPAIR(_ZN3ccc8CC4x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y13E[];
Class_Descriptor cd__ZN3ccc8CC4x7y13E = {  "_ZN3ccc8CC4x7y13E", // class name
  bases__ZN3ccc8CC4x7y13E, 2,
  &(vtc__ZN3ccc8CC4x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y14  : ::ccc::AA4 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC4x7y143pqrEv
  ~CC4x7y14(); // tgen
  CC4x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x7y143pqrEv");}
ccc::CC4x7y14 ::~CC4x7y14(){ note_dtor("_ZN3ccc8CC4x7y14E", this);} // tgen
ccc::CC4x7y14 ::CC4x7y14(){ note_ctor("_ZN3ccc8CC4x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y14E, buf);
    ::ccc::CC4x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y14E);
    dp->::ccc::CC4x7y14::~CC4x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y14E(Test__ZN3ccc8CC4x7y14E, "_ZN3ccc8CC4x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y14C1Ev();
extern void _ZN3ccc8CC4x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y14E[] = {
  NSPAIR(_ZN3ccc8CC4x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y14E[];
extern void _ZN3ccc8CC4x7y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x7y143pqrEv,_ZThn4_N3ccc8CC4x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x7y143pqrEv,_ZThn4_N3ccc8CC4x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y14E[];
Class_Descriptor cd__ZN3ccc8CC4x7y14E = {  "_ZN3ccc8CC4x7y14E", // class name
  bases__ZN3ccc8CC4x7y14E, 2,
  &(vtc__ZN3ccc8CC4x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x7y15  : ::ccc::AA4 , ::ccc::BB7 {
  ~CC4x7y15(); // tgen
  CC4x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x7y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x7y15 ::~CC4x7y15(){ note_dtor("_ZN3ccc8CC4x7y15E", this);} // tgen
ccc::CC4x7y15 ::CC4x7y15(){ note_ctor("_ZN3ccc8CC4x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x7y15E, buf);
    ::ccc::CC4x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x7y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC4x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x7y15E);
    dp->::ccc::CC4x7y15::~CC4x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x7y15E(Test__ZN3ccc8CC4x7y15E, "_ZN3ccc8CC4x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x7y15C1Ev();
extern void _ZN3ccc8CC4x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x7y15E[] = {
  NSPAIR(_ZN3ccc8CC4x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC4x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x7y15E[];
Class_Descriptor cd__ZN3ccc8CC4x7y15E = {  "_ZN3ccc8CC4x7y15E", // class name
  bases__ZN3ccc8CC4x7y15E, 2,
  &(vtc__ZN3ccc8CC4x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y0  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y03pqrEv
  ~CC4x8y0(); // tgen
  CC4x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y0E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y03abcEv");}
void  ccc::CC4x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y03efgEv");}
void  ccc::CC4x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y03pqrEv");}
ccc::CC4x8y0 ::~CC4x8y0(){ note_dtor("_ZN3ccc7CC4x8y0E", this);} // tgen
ccc::CC4x8y0 ::CC4x8y0(){ note_ctor("_ZN3ccc7CC4x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y0E, buf);
    ::ccc::CC4x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y0E);
    dp->::ccc::CC4x8y0::~CC4x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y0E(Test__ZN3ccc7CC4x8y0E, "_ZN3ccc7CC4x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y0C1Ev();
extern void _ZN3ccc7CC4x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y0E[] = {
  NSPAIR(_ZN3ccc7CC4x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y0E[];
extern void _ZN3ccc7CC4x8y03pqrEv();
extern void _ZN3ccc7CC4x8y03abcEv();
extern void _ZN3ccc7CC4x8y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y03efgEv,_ZThn4_N3ccc7CC4x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y03abcEv,_ZThn4_N3ccc7CC4x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y03efgEv,_ZThn4_N3ccc7CC4x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y03abcEv,_ZThn4_N3ccc7CC4x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y0E[];
Class_Descriptor cd__ZN3ccc7CC4x8y0E = {  "_ZN3ccc7CC4x8y0E", // class name
  bases__ZN3ccc7CC4x8y0E, 2,
  &(vtc__ZN3ccc7CC4x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y1  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x8y13efgEv
  ~CC4x8y1(); // tgen
  CC4x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y1E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y13abcEv");}
void  ccc::CC4x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y13pqrEv");}
void  ccc::CC4x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y13efgEv");}
ccc::CC4x8y1 ::~CC4x8y1(){ note_dtor("_ZN3ccc7CC4x8y1E", this);} // tgen
ccc::CC4x8y1 ::CC4x8y1(){ note_ctor("_ZN3ccc7CC4x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y1E, buf);
    ::ccc::CC4x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y1E);
    dp->::ccc::CC4x8y1::~CC4x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y1E(Test__ZN3ccc7CC4x8y1E, "_ZN3ccc7CC4x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y1C1Ev();
extern void _ZN3ccc7CC4x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y1E[] = {
  NSPAIR(_ZN3ccc7CC4x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y1E[];
extern void _ZN3ccc7CC4x8y13pqrEv();
extern void _ZN3ccc7CC4x8y13abcEv();
extern void _ZN3ccc7CC4x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y13efgEv,_ZThn4_N3ccc7CC4x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y13abcEv,_ZThn4_N3ccc7CC4x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y13efgEv,_ZThn4_N3ccc7CC4x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y13abcEv,_ZThn4_N3ccc7CC4x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y1E[];
Class_Descriptor cd__ZN3ccc7CC4x8y1E = {  "_ZN3ccc7CC4x8y1E", // class name
  bases__ZN3ccc7CC4x8y1E, 2,
  &(vtc__ZN3ccc7CC4x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y2  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y23pqrEv
  ~CC4x8y2(); // tgen
  CC4x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y2E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y23efgEv");}
void  ccc::CC4x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y23abcEv");}
void  ccc::CC4x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y23pqrEv");}
ccc::CC4x8y2 ::~CC4x8y2(){ note_dtor("_ZN3ccc7CC4x8y2E", this);} // tgen
ccc::CC4x8y2 ::CC4x8y2(){ note_ctor("_ZN3ccc7CC4x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y2E, buf);
    ::ccc::CC4x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y2E);
    dp->::ccc::CC4x8y2::~CC4x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y2E(Test__ZN3ccc7CC4x8y2E, "_ZN3ccc7CC4x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y2C1Ev();
extern void _ZN3ccc7CC4x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y2E[] = {
  NSPAIR(_ZN3ccc7CC4x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y2E[];
extern void _ZN3ccc7CC4x8y23pqrEv();
extern void _ZN3ccc7CC4x8y23abcEv();
extern void _ZN3ccc7CC4x8y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y23efgEv,_ZThn4_N3ccc7CC4x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y23abcEv,_ZThn4_N3ccc7CC4x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y23efgEv,_ZThn4_N3ccc7CC4x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y23abcEv,_ZThn4_N3ccc7CC4x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y2E[];
Class_Descriptor cd__ZN3ccc7CC4x8y2E = {  "_ZN3ccc7CC4x8y2E", // class name
  bases__ZN3ccc7CC4x8y2E, 2,
  &(vtc__ZN3ccc7CC4x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y3  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x8y33abcEv
  ~CC4x8y3(); // tgen
  CC4x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y3E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y33efgEv");}
void  ccc::CC4x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y33pqrEv");}
void  ccc::CC4x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y33abcEv");}
ccc::CC4x8y3 ::~CC4x8y3(){ note_dtor("_ZN3ccc7CC4x8y3E", this);} // tgen
ccc::CC4x8y3 ::CC4x8y3(){ note_ctor("_ZN3ccc7CC4x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y3E, buf);
    ::ccc::CC4x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y3E);
    dp->::ccc::CC4x8y3::~CC4x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y3E(Test__ZN3ccc7CC4x8y3E, "_ZN3ccc7CC4x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y3C1Ev();
extern void _ZN3ccc7CC4x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y3E[] = {
  NSPAIR(_ZN3ccc7CC4x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y3E[];
extern void _ZN3ccc7CC4x8y33pqrEv();
extern void _ZN3ccc7CC4x8y33abcEv();
extern void _ZN3ccc7CC4x8y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y33efgEv,_ZThn4_N3ccc7CC4x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y33abcEv,_ZThn4_N3ccc7CC4x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y33efgEv,_ZThn4_N3ccc7CC4x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y33abcEv,_ZThn4_N3ccc7CC4x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y3E[];
Class_Descriptor cd__ZN3ccc7CC4x8y3E = {  "_ZN3ccc7CC4x8y3E", // class name
  bases__ZN3ccc7CC4x8y3E, 2,
  &(vtc__ZN3ccc7CC4x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y4  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC4x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y43efgEv
  ~CC4x8y4(); // tgen
  CC4x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y4E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y43pqrEv");}
void  ccc::CC4x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y43abcEv");}
void  ccc::CC4x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y43efgEv");}
ccc::CC4x8y4 ::~CC4x8y4(){ note_dtor("_ZN3ccc7CC4x8y4E", this);} // tgen
ccc::CC4x8y4 ::CC4x8y4(){ note_ctor("_ZN3ccc7CC4x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y4E, buf);
    ::ccc::CC4x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y4E);
    dp->::ccc::CC4x8y4::~CC4x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y4E(Test__ZN3ccc7CC4x8y4E, "_ZN3ccc7CC4x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y4C1Ev();
extern void _ZN3ccc7CC4x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y4E[] = {
  NSPAIR(_ZN3ccc7CC4x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y4E[];
extern void _ZN3ccc7CC4x8y43pqrEv();
extern void _ZN3ccc7CC4x8y43abcEv();
extern void _ZN3ccc7CC4x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y43efgEv,_ZThn4_N3ccc7CC4x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y43abcEv,_ZThn4_N3ccc7CC4x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y43efgEv,_ZThn4_N3ccc7CC4x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y43abcEv,_ZThn4_N3ccc7CC4x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y4E[];
Class_Descriptor cd__ZN3ccc7CC4x8y4E = {  "_ZN3ccc7CC4x8y4E", // class name
  bases__ZN3ccc7CC4x8y4E, 2,
  &(vtc__ZN3ccc7CC4x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y5  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC4x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y53abcEv
  ~CC4x8y5(); // tgen
  CC4x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y5E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y53pqrEv");}
void  ccc::CC4x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y53efgEv");}
void  ccc::CC4x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y53abcEv");}
ccc::CC4x8y5 ::~CC4x8y5(){ note_dtor("_ZN3ccc7CC4x8y5E", this);} // tgen
ccc::CC4x8y5 ::CC4x8y5(){ note_ctor("_ZN3ccc7CC4x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y5E, buf);
    ::ccc::CC4x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y5E);
    dp->::ccc::CC4x8y5::~CC4x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y5E(Test__ZN3ccc7CC4x8y5E, "_ZN3ccc7CC4x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y5C1Ev();
extern void _ZN3ccc7CC4x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y5E[] = {
  NSPAIR(_ZN3ccc7CC4x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y5E[];
extern void _ZN3ccc7CC4x8y53pqrEv();
extern void _ZN3ccc7CC4x8y53abcEv();
extern void _ZN3ccc7CC4x8y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y53efgEv,_ZThn4_N3ccc7CC4x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y53abcEv,_ZThn4_N3ccc7CC4x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y53efgEv,_ZThn4_N3ccc7CC4x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y53abcEv,_ZThn4_N3ccc7CC4x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y5E[];
Class_Descriptor cd__ZN3ccc7CC4x8y5E = {  "_ZN3ccc7CC4x8y5E", // class name
  bases__ZN3ccc7CC4x8y5E, 2,
  &(vtc__ZN3ccc7CC4x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y6  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x8y63efgEv
  ~CC4x8y6(); // tgen
  CC4x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y6E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y63abcEv");}
void  ccc::CC4x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y63efgEv");}
ccc::CC4x8y6 ::~CC4x8y6(){ note_dtor("_ZN3ccc7CC4x8y6E", this);} // tgen
ccc::CC4x8y6 ::CC4x8y6(){ note_ctor("_ZN3ccc7CC4x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y6E, buf);
    ::ccc::CC4x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y6E);
    dp->::ccc::CC4x8y6::~CC4x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y6E(Test__ZN3ccc7CC4x8y6E, "_ZN3ccc7CC4x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y6C1Ev();
extern void _ZN3ccc7CC4x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y6E[] = {
  NSPAIR(_ZN3ccc7CC4x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x8y63abcEv();
extern void _ZN3ccc7CC4x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y63efgEv,_ZThn4_N3ccc7CC4x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y63abcEv,_ZThn4_N3ccc7CC4x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y63efgEv,_ZThn4_N3ccc7CC4x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y63abcEv,_ZThn4_N3ccc7CC4x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y6E[];
Class_Descriptor cd__ZN3ccc7CC4x8y6E = {  "_ZN3ccc7CC4x8y6E", // class name
  bases__ZN3ccc7CC4x8y6E, 2,
  &(vtc__ZN3ccc7CC4x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y7  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC4x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y73pqrEv
  ~CC4x8y7(); // tgen
  CC4x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y7E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y73abcEv");}
void  ccc::CC4x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y73pqrEv");}
ccc::CC4x8y7 ::~CC4x8y7(){ note_dtor("_ZN3ccc7CC4x8y7E", this);} // tgen
ccc::CC4x8y7 ::CC4x8y7(){ note_ctor("_ZN3ccc7CC4x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y7E, buf);
    ::ccc::CC4x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y7E);
    dp->::ccc::CC4x8y7::~CC4x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y7E(Test__ZN3ccc7CC4x8y7E, "_ZN3ccc7CC4x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y7C1Ev();
extern void _ZN3ccc7CC4x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y7E[] = {
  NSPAIR(_ZN3ccc7CC4x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y7E[];
extern void _ZN3ccc7CC4x8y73pqrEv();
extern void _ZN3ccc7CC4x8y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y73abcEv,_ZThn4_N3ccc7CC4x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y73abcEv,_ZThn4_N3ccc7CC4x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y7E[];
Class_Descriptor cd__ZN3ccc7CC4x8y7E = {  "_ZN3ccc7CC4x8y7E", // class name
  bases__ZN3ccc7CC4x8y7E, 2,
  &(vtc__ZN3ccc7CC4x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y8  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x8y83abcEv
  ~CC4x8y8(); // tgen
  CC4x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y8E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y83efgEv");}
void  ccc::CC4x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x8y83abcEv");}
ccc::CC4x8y8 ::~CC4x8y8(){ note_dtor("_ZN3ccc7CC4x8y8E", this);} // tgen
ccc::CC4x8y8 ::CC4x8y8(){ note_ctor("_ZN3ccc7CC4x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y8E, buf);
    ::ccc::CC4x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y8E);
    dp->::ccc::CC4x8y8::~CC4x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y8E(Test__ZN3ccc7CC4x8y8E, "_ZN3ccc7CC4x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y8C1Ev();
extern void _ZN3ccc7CC4x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y8E[] = {
  NSPAIR(_ZN3ccc7CC4x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x8y83abcEv();
extern void _ZN3ccc7CC4x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y83efgEv,_ZThn4_N3ccc7CC4x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y83abcEv,_ZThn4_N3ccc7CC4x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y83efgEv,_ZThn4_N3ccc7CC4x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y83abcEv,_ZThn4_N3ccc7CC4x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y8E[];
Class_Descriptor cd__ZN3ccc7CC4x8y8E = {  "_ZN3ccc7CC4x8y8E", // class name
  bases__ZN3ccc7CC4x8y8E, 2,
  &(vtc__ZN3ccc7CC4x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y9  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC4x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x8y93pqrEv
  ~CC4x8y9(); // tgen
  CC4x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x8y9E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x8y93efgEv");}
void  ccc::CC4x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x8y93pqrEv");}
ccc::CC4x8y9 ::~CC4x8y9(){ note_dtor("_ZN3ccc7CC4x8y9E", this);} // tgen
ccc::CC4x8y9 ::CC4x8y9(){ note_ctor("_ZN3ccc7CC4x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x8y9E, buf);
    ::ccc::CC4x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x8y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7CC4x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x8y9E);
    dp->::ccc::CC4x8y9::~CC4x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x8y9E(Test__ZN3ccc7CC4x8y9E, "_ZN3ccc7CC4x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x8y9C1Ev();
extern void _ZN3ccc7CC4x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x8y9E[] = {
  NSPAIR(_ZN3ccc7CC4x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC4x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y9E[];
extern void _ZN3ccc7CC4x8y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x8y93efgEv,_ZThn4_N3ccc7CC4x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x8y93efgEv,_ZThn4_N3ccc7CC4x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x8y9E[];
Class_Descriptor cd__ZN3ccc7CC4x8y9E = {  "_ZN3ccc7CC4x8y9E", // class name
  bases__ZN3ccc7CC4x8y9E, 2,
  &(vtc__ZN3ccc7CC4x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y10  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x8y103abcEv
  ~CC4x8y10(); // tgen
  CC4x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y10E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y103pqrEv");}
void  ccc::CC4x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x8y103abcEv");}
ccc::CC4x8y10 ::~CC4x8y10(){ note_dtor("_ZN3ccc8CC4x8y10E", this);} // tgen
ccc::CC4x8y10 ::CC4x8y10(){ note_ctor("_ZN3ccc8CC4x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y10E, buf);
    ::ccc::CC4x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y10E);
    dp->::ccc::CC4x8y10::~CC4x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y10E(Test__ZN3ccc8CC4x8y10E, "_ZN3ccc8CC4x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y10C1Ev();
extern void _ZN3ccc8CC4x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y10E[] = {
  NSPAIR(_ZN3ccc8CC4x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y10E[];
extern void _ZN3ccc8CC4x8y103pqrEv();
extern void _ZN3ccc8CC4x8y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y103abcEv,_ZThn4_N3ccc8CC4x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x8y103abcEv,_ZThn4_N3ccc8CC4x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y10E[];
Class_Descriptor cd__ZN3ccc8CC4x8y10E = {  "_ZN3ccc8CC4x8y10E", // class name
  bases__ZN3ccc8CC4x8y10E, 2,
  &(vtc__ZN3ccc8CC4x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y11  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x8y113efgEv
  ~CC4x8y11(); // tgen
  CC4x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y11E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y113pqrEv");}
void  ccc::CC4x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x8y113efgEv");}
ccc::CC4x8y11 ::~CC4x8y11(){ note_dtor("_ZN3ccc8CC4x8y11E", this);} // tgen
ccc::CC4x8y11 ::CC4x8y11(){ note_ctor("_ZN3ccc8CC4x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y11E, buf);
    ::ccc::CC4x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y11E);
    dp->::ccc::CC4x8y11::~CC4x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y11E(Test__ZN3ccc8CC4x8y11E, "_ZN3ccc8CC4x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y11C1Ev();
extern void _ZN3ccc8CC4x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y11E[] = {
  NSPAIR(_ZN3ccc8CC4x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y11E[];
extern void _ZN3ccc8CC4x8y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y113efgEv,_ZThn4_N3ccc8CC4x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x8y113efgEv,_ZThn4_N3ccc8CC4x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y11E[];
Class_Descriptor cd__ZN3ccc8CC4x8y11E = {  "_ZN3ccc8CC4x8y11E", // class name
  bases__ZN3ccc8CC4x8y11E, 2,
  &(vtc__ZN3ccc8CC4x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y12  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC4x8y123abcEv
  ~CC4x8y12(); // tgen
  CC4x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x8y123abcEv");}
ccc::CC4x8y12 ::~CC4x8y12(){ note_dtor("_ZN3ccc8CC4x8y12E", this);} // tgen
ccc::CC4x8y12 ::CC4x8y12(){ note_ctor("_ZN3ccc8CC4x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y12E, buf);
    ::ccc::CC4x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y12E);
    dp->::ccc::CC4x8y12::~CC4x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y12E(Test__ZN3ccc8CC4x8y12E, "_ZN3ccc8CC4x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y12C1Ev();
extern void _ZN3ccc8CC4x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y12E[] = {
  NSPAIR(_ZN3ccc8CC4x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x8y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y123abcEv,_ZThn4_N3ccc8CC4x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x8y123abcEv,_ZThn4_N3ccc8CC4x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y12E[];
Class_Descriptor cd__ZN3ccc8CC4x8y12E = {  "_ZN3ccc8CC4x8y12E", // class name
  bases__ZN3ccc8CC4x8y12E, 2,
  &(vtc__ZN3ccc8CC4x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y13  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC4x8y133efgEv
  ~CC4x8y13(); // tgen
  CC4x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x8y133efgEv");}
ccc::CC4x8y13 ::~CC4x8y13(){ note_dtor("_ZN3ccc8CC4x8y13E", this);} // tgen
ccc::CC4x8y13 ::CC4x8y13(){ note_ctor("_ZN3ccc8CC4x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y13E, buf);
    ::ccc::CC4x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y13E);
    dp->::ccc::CC4x8y13::~CC4x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y13E(Test__ZN3ccc8CC4x8y13E, "_ZN3ccc8CC4x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y13C1Ev();
extern void _ZN3ccc8CC4x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y13E[] = {
  NSPAIR(_ZN3ccc8CC4x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x8y133efgEv,_ZThn4_N3ccc8CC4x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x8y133efgEv,_ZThn4_N3ccc8CC4x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y13E[];
Class_Descriptor cd__ZN3ccc8CC4x8y13E = {  "_ZN3ccc8CC4x8y13E", // class name
  bases__ZN3ccc8CC4x8y13E, 2,
  &(vtc__ZN3ccc8CC4x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y14  : ::ccc::AA4 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC4x8y143pqrEv
  ~CC4x8y14(); // tgen
  CC4x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x8y143pqrEv");}
ccc::CC4x8y14 ::~CC4x8y14(){ note_dtor("_ZN3ccc8CC4x8y14E", this);} // tgen
ccc::CC4x8y14 ::CC4x8y14(){ note_ctor("_ZN3ccc8CC4x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y14E, buf);
    ::ccc::CC4x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y14E);
    dp->::ccc::CC4x8y14::~CC4x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y14E(Test__ZN3ccc8CC4x8y14E, "_ZN3ccc8CC4x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y14C1Ev();
extern void _ZN3ccc8CC4x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y14E[] = {
  NSPAIR(_ZN3ccc8CC4x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y14E[];
extern void _ZN3ccc8CC4x8y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y14E[];
Class_Descriptor cd__ZN3ccc8CC4x8y14E = {  "_ZN3ccc8CC4x8y14E", // class name
  bases__ZN3ccc8CC4x8y14E, 2,
  &(vtc__ZN3ccc8CC4x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x8y15  : ::ccc::AA4 , ::ccc::BB8 {
  ~CC4x8y15(); // tgen
  CC4x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x8y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x8y15 ::~CC4x8y15(){ note_dtor("_ZN3ccc8CC4x8y15E", this);} // tgen
ccc::CC4x8y15 ::CC4x8y15(){ note_ctor("_ZN3ccc8CC4x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x8y15E, buf);
    ::ccc::CC4x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x8y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC4x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x8y15E);
    dp->::ccc::CC4x8y15::~CC4x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x8y15E(Test__ZN3ccc8CC4x8y15E, "_ZN3ccc8CC4x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x8y15C1Ev();
extern void _ZN3ccc8CC4x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x8y15E[] = {
  NSPAIR(_ZN3ccc8CC4x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC4x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x8y15E[];
Class_Descriptor cd__ZN3ccc8CC4x8y15E = {  "_ZN3ccc8CC4x8y15E", // class name
  bases__ZN3ccc8CC4x8y15E, 2,
  &(vtc__ZN3ccc8CC4x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y0  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y03pqrEv
  ~CC4x9y0(); // tgen
  CC4x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y0E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y03abcEv");}
void  ccc::CC4x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y03efgEv");}
void  ccc::CC4x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y03pqrEv");}
ccc::CC4x9y0 ::~CC4x9y0(){ note_dtor("_ZN3ccc7CC4x9y0E", this);} // tgen
ccc::CC4x9y0 ::CC4x9y0(){ note_ctor("_ZN3ccc7CC4x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y0E, buf);
    ::ccc::CC4x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y0E);
    dp->::ccc::CC4x9y0::~CC4x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y0E(Test__ZN3ccc7CC4x9y0E, "_ZN3ccc7CC4x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y0C1Ev();
extern void _ZN3ccc7CC4x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y0E[] = {
  NSPAIR(_ZN3ccc7CC4x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y0E[];
extern void _ZN3ccc7CC4x9y03pqrEv();
extern void _ZN3ccc7CC4x9y03abcEv();
extern void _ZN3ccc7CC4x9y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y03efgEv,_ZThn4_N3ccc7CC4x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y03pqrEv,_ZThn4_N3ccc7CC4x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y03efgEv,_ZThn4_N3ccc7CC4x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y03pqrEv,_ZThn4_N3ccc7CC4x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y0E[];
Class_Descriptor cd__ZN3ccc7CC4x9y0E = {  "_ZN3ccc7CC4x9y0E", // class name
  bases__ZN3ccc7CC4x9y0E, 2,
  &(vtc__ZN3ccc7CC4x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y1  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x9y13efgEv
  ~CC4x9y1(); // tgen
  CC4x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y1E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y13abcEv");}
void  ccc::CC4x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y13pqrEv");}
void  ccc::CC4x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y13efgEv");}
ccc::CC4x9y1 ::~CC4x9y1(){ note_dtor("_ZN3ccc7CC4x9y1E", this);} // tgen
ccc::CC4x9y1 ::CC4x9y1(){ note_ctor("_ZN3ccc7CC4x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y1E, buf);
    ::ccc::CC4x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y1E);
    dp->::ccc::CC4x9y1::~CC4x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y1E(Test__ZN3ccc7CC4x9y1E, "_ZN3ccc7CC4x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y1C1Ev();
extern void _ZN3ccc7CC4x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y1E[] = {
  NSPAIR(_ZN3ccc7CC4x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y1E[];
extern void _ZN3ccc7CC4x9y13pqrEv();
extern void _ZN3ccc7CC4x9y13abcEv();
extern void _ZN3ccc7CC4x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y13efgEv,_ZThn4_N3ccc7CC4x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y13pqrEv,_ZThn4_N3ccc7CC4x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y13efgEv,_ZThn4_N3ccc7CC4x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y13pqrEv,_ZThn4_N3ccc7CC4x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y1E[];
Class_Descriptor cd__ZN3ccc7CC4x9y1E = {  "_ZN3ccc7CC4x9y1E", // class name
  bases__ZN3ccc7CC4x9y1E, 2,
  &(vtc__ZN3ccc7CC4x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y2  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y23pqrEv
  ~CC4x9y2(); // tgen
  CC4x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y2E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y23efgEv");}
void  ccc::CC4x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y23abcEv");}
void  ccc::CC4x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y23pqrEv");}
ccc::CC4x9y2 ::~CC4x9y2(){ note_dtor("_ZN3ccc7CC4x9y2E", this);} // tgen
ccc::CC4x9y2 ::CC4x9y2(){ note_ctor("_ZN3ccc7CC4x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y2E, buf);
    ::ccc::CC4x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y2E);
    dp->::ccc::CC4x9y2::~CC4x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y2E(Test__ZN3ccc7CC4x9y2E, "_ZN3ccc7CC4x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y2C1Ev();
extern void _ZN3ccc7CC4x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y2E[] = {
  NSPAIR(_ZN3ccc7CC4x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y2E[];
extern void _ZN3ccc7CC4x9y23pqrEv();
extern void _ZN3ccc7CC4x9y23abcEv();
extern void _ZN3ccc7CC4x9y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y23efgEv,_ZThn4_N3ccc7CC4x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y23pqrEv,_ZThn4_N3ccc7CC4x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y23efgEv,_ZThn4_N3ccc7CC4x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y23pqrEv,_ZThn4_N3ccc7CC4x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y2E[];
Class_Descriptor cd__ZN3ccc7CC4x9y2E = {  "_ZN3ccc7CC4x9y2E", // class name
  bases__ZN3ccc7CC4x9y2E, 2,
  &(vtc__ZN3ccc7CC4x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y3  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x9y33abcEv
  ~CC4x9y3(); // tgen
  CC4x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y3E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y33efgEv");}
void  ccc::CC4x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y33pqrEv");}
void  ccc::CC4x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y33abcEv");}
ccc::CC4x9y3 ::~CC4x9y3(){ note_dtor("_ZN3ccc7CC4x9y3E", this);} // tgen
ccc::CC4x9y3 ::CC4x9y3(){ note_ctor("_ZN3ccc7CC4x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y3E, buf);
    ::ccc::CC4x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y3E);
    dp->::ccc::CC4x9y3::~CC4x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y3E(Test__ZN3ccc7CC4x9y3E, "_ZN3ccc7CC4x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y3C1Ev();
extern void _ZN3ccc7CC4x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y3E[] = {
  NSPAIR(_ZN3ccc7CC4x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y3E[];
extern void _ZN3ccc7CC4x9y33pqrEv();
extern void _ZN3ccc7CC4x9y33abcEv();
extern void _ZN3ccc7CC4x9y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y33efgEv,_ZThn4_N3ccc7CC4x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y33pqrEv,_ZThn4_N3ccc7CC4x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y33efgEv,_ZThn4_N3ccc7CC4x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y33pqrEv,_ZThn4_N3ccc7CC4x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y3E[];
Class_Descriptor cd__ZN3ccc7CC4x9y3E = {  "_ZN3ccc7CC4x9y3E", // class name
  bases__ZN3ccc7CC4x9y3E, 2,
  &(vtc__ZN3ccc7CC4x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y4  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC4x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC4x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y43efgEv
  ~CC4x9y4(); // tgen
  CC4x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y4E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y43pqrEv");}
void  ccc::CC4x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y43abcEv");}
void  ccc::CC4x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y43efgEv");}
ccc::CC4x9y4 ::~CC4x9y4(){ note_dtor("_ZN3ccc7CC4x9y4E", this);} // tgen
ccc::CC4x9y4 ::CC4x9y4(){ note_ctor("_ZN3ccc7CC4x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y4E, buf);
    ::ccc::CC4x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y4E);
    dp->::ccc::CC4x9y4::~CC4x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y4E(Test__ZN3ccc7CC4x9y4E, "_ZN3ccc7CC4x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y4C1Ev();
extern void _ZN3ccc7CC4x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y4E[] = {
  NSPAIR(_ZN3ccc7CC4x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y4E[];
extern void _ZN3ccc7CC4x9y43pqrEv();
extern void _ZN3ccc7CC4x9y43abcEv();
extern void _ZN3ccc7CC4x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y43efgEv,_ZThn4_N3ccc7CC4x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y43pqrEv,_ZThn4_N3ccc7CC4x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y43efgEv,_ZThn4_N3ccc7CC4x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y43pqrEv,_ZThn4_N3ccc7CC4x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y4E[];
Class_Descriptor cd__ZN3ccc7CC4x9y4E = {  "_ZN3ccc7CC4x9y4E", // class name
  bases__ZN3ccc7CC4x9y4E, 2,
  &(vtc__ZN3ccc7CC4x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y5  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC4x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC4x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y53abcEv
  ~CC4x9y5(); // tgen
  CC4x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y5E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y53pqrEv");}
void  ccc::CC4x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y53efgEv");}
void  ccc::CC4x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y53abcEv");}
ccc::CC4x9y5 ::~CC4x9y5(){ note_dtor("_ZN3ccc7CC4x9y5E", this);} // tgen
ccc::CC4x9y5 ::CC4x9y5(){ note_ctor("_ZN3ccc7CC4x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y5E, buf);
    ::ccc::CC4x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y5E);
    dp->::ccc::CC4x9y5::~CC4x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y5E(Test__ZN3ccc7CC4x9y5E, "_ZN3ccc7CC4x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y5C1Ev();
extern void _ZN3ccc7CC4x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y5E[] = {
  NSPAIR(_ZN3ccc7CC4x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y5E[];
extern void _ZN3ccc7CC4x9y53pqrEv();
extern void _ZN3ccc7CC4x9y53abcEv();
extern void _ZN3ccc7CC4x9y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y53efgEv,_ZThn4_N3ccc7CC4x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y53pqrEv,_ZThn4_N3ccc7CC4x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y53efgEv,_ZThn4_N3ccc7CC4x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y53pqrEv,_ZThn4_N3ccc7CC4x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y5E[];
Class_Descriptor cd__ZN3ccc7CC4x9y5E = {  "_ZN3ccc7CC4x9y5E", // class name
  bases__ZN3ccc7CC4x9y5E, 2,
  &(vtc__ZN3ccc7CC4x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y6  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC4x9y63efgEv
  ~CC4x9y6(); // tgen
  CC4x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y6E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y63abcEv");}
void  ccc::CC4x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y63efgEv");}
ccc::CC4x9y6 ::~CC4x9y6(){ note_dtor("_ZN3ccc7CC4x9y6E", this);} // tgen
ccc::CC4x9y6 ::CC4x9y6(){ note_ctor("_ZN3ccc7CC4x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y6E, buf);
    ::ccc::CC4x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y6E);
    dp->::ccc::CC4x9y6::~CC4x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y6E(Test__ZN3ccc7CC4x9y6E, "_ZN3ccc7CC4x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y6C1Ev();
extern void _ZN3ccc7CC4x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y6E[] = {
  NSPAIR(_ZN3ccc7CC4x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x9y63abcEv();
extern void _ZN3ccc7CC4x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y63efgEv,_ZThn4_N3ccc7CC4x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y63efgEv,_ZThn4_N3ccc7CC4x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y6E[];
Class_Descriptor cd__ZN3ccc7CC4x9y6E = {  "_ZN3ccc7CC4x9y6E", // class name
  bases__ZN3ccc7CC4x9y6E, 2,
  &(vtc__ZN3ccc7CC4x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y7  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC4x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y73pqrEv
  ~CC4x9y7(); // tgen
  CC4x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y7E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y73abcEv");}
void  ccc::CC4x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y73pqrEv");}
ccc::CC4x9y7 ::~CC4x9y7(){ note_dtor("_ZN3ccc7CC4x9y7E", this);} // tgen
ccc::CC4x9y7 ::CC4x9y7(){ note_ctor("_ZN3ccc7CC4x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y7E, buf);
    ::ccc::CC4x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y7E);
    dp->::ccc::CC4x9y7::~CC4x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y7E(Test__ZN3ccc7CC4x9y7E, "_ZN3ccc7CC4x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y7C1Ev();
extern void _ZN3ccc7CC4x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y7E[] = {
  NSPAIR(_ZN3ccc7CC4x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y7E[];
extern void _ZN3ccc7CC4x9y73pqrEv();
extern void _ZN3ccc7CC4x9y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y73pqrEv,_ZThn4_N3ccc7CC4x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y73pqrEv,_ZThn4_N3ccc7CC4x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y7E[];
Class_Descriptor cd__ZN3ccc7CC4x9y7E = {  "_ZN3ccc7CC4x9y7E", // class name
  bases__ZN3ccc7CC4x9y7E, 2,
  &(vtc__ZN3ccc7CC4x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y8  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC4x9y83abcEv
  ~CC4x9y8(); // tgen
  CC4x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y8E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y83efgEv");}
void  ccc::CC4x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC4x9y83abcEv");}
ccc::CC4x9y8 ::~CC4x9y8(){ note_dtor("_ZN3ccc7CC4x9y8E", this);} // tgen
ccc::CC4x9y8 ::CC4x9y8(){ note_ctor("_ZN3ccc7CC4x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y8E, buf);
    ::ccc::CC4x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y8E);
    dp->::ccc::CC4x9y8::~CC4x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y8E(Test__ZN3ccc7CC4x9y8E, "_ZN3ccc7CC4x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y8C1Ev();
extern void _ZN3ccc7CC4x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y8E[] = {
  NSPAIR(_ZN3ccc7CC4x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc7CC4x9y83abcEv();
extern void _ZN3ccc7CC4x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y83efgEv,_ZThn4_N3ccc7CC4x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y83efgEv,_ZThn4_N3ccc7CC4x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y8E[];
Class_Descriptor cd__ZN3ccc7CC4x9y8E = {  "_ZN3ccc7CC4x9y8E", // class name
  bases__ZN3ccc7CC4x9y8E, 2,
  &(vtc__ZN3ccc7CC4x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y9  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC4x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC4x9y93pqrEv
  ~CC4x9y9(); // tgen
  CC4x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC4x9y9E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC4x9y93efgEv");}
void  ccc::CC4x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC4x9y93pqrEv");}
ccc::CC4x9y9 ::~CC4x9y9(){ note_dtor("_ZN3ccc7CC4x9y9E", this);} // tgen
ccc::CC4x9y9 ::CC4x9y9(){ note_ctor("_ZN3ccc7CC4x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC4x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC4x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC4x9y9E, buf);
    ::ccc::CC4x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC4x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC4x9y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc7CC4x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7CC4x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC4x9y9E);
    dp->::ccc::CC4x9y9::~CC4x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC4x9y9E(Test__ZN3ccc7CC4x9y9E, "_ZN3ccc7CC4x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC4x9y9C1Ev();
extern void _ZN3ccc7CC4x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC4x9y9E[] = {
  NSPAIR(_ZN3ccc7CC4x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC4x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC4x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y9E[];
extern void _ZN3ccc7CC4x9y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc7CC4x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y93efgEv,_ZThn4_N3ccc7CC4x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC4x9y93pqrEv,_ZThn4_N3ccc7CC4x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC4x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC4x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC4x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y93efgEv,_ZThn4_N3ccc7CC4x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC4x9y93pqrEv,_ZThn4_N3ccc7CC4x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC4x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC4x9y9E[];
Class_Descriptor cd__ZN3ccc7CC4x9y9E = {  "_ZN3ccc7CC4x9y9E", // class name
  bases__ZN3ccc7CC4x9y9E, 2,
  &(vtc__ZN3ccc7CC4x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC4x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC4x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y10  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x9y103abcEv
  ~CC4x9y10(); // tgen
  CC4x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y10E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y103pqrEv");}
void  ccc::CC4x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x9y103abcEv");}
ccc::CC4x9y10 ::~CC4x9y10(){ note_dtor("_ZN3ccc8CC4x9y10E", this);} // tgen
ccc::CC4x9y10 ::CC4x9y10(){ note_ctor("_ZN3ccc8CC4x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y10E, buf);
    ::ccc::CC4x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y10E);
    dp->::ccc::CC4x9y10::~CC4x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y10E(Test__ZN3ccc8CC4x9y10E, "_ZN3ccc8CC4x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y10C1Ev();
extern void _ZN3ccc8CC4x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y10E[] = {
  NSPAIR(_ZN3ccc8CC4x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y10E[];
extern void _ZN3ccc8CC4x9y103pqrEv();
extern void _ZN3ccc8CC4x9y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y103pqrEv,_ZThn4_N3ccc8CC4x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x9y103pqrEv,_ZThn4_N3ccc8CC4x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y10E[];
Class_Descriptor cd__ZN3ccc8CC4x9y10E = {  "_ZN3ccc8CC4x9y10E", // class name
  bases__ZN3ccc8CC4x9y10E, 2,
  &(vtc__ZN3ccc8CC4x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y11  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x9y113efgEv
  ~CC4x9y11(); // tgen
  CC4x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y11E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y113pqrEv");}
void  ccc::CC4x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x9y113efgEv");}
ccc::CC4x9y11 ::~CC4x9y11(){ note_dtor("_ZN3ccc8CC4x9y11E", this);} // tgen
ccc::CC4x9y11 ::CC4x9y11(){ note_ctor("_ZN3ccc8CC4x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y11E, buf);
    ::ccc::CC4x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y11E);
    dp->::ccc::CC4x9y11::~CC4x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y11E(Test__ZN3ccc8CC4x9y11E, "_ZN3ccc8CC4x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y11C1Ev();
extern void _ZN3ccc8CC4x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y11E[] = {
  NSPAIR(_ZN3ccc8CC4x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y11E[];
extern void _ZN3ccc8CC4x9y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y113efgEv,_ZThn4_N3ccc8CC4x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y113pqrEv,_ZThn4_N3ccc8CC4x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x9y113efgEv,_ZThn4_N3ccc8CC4x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x9y113pqrEv,_ZThn4_N3ccc8CC4x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y11E[];
Class_Descriptor cd__ZN3ccc8CC4x9y11E = {  "_ZN3ccc8CC4x9y11E", // class name
  bases__ZN3ccc8CC4x9y11E, 2,
  &(vtc__ZN3ccc8CC4x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y12  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC4x9y123abcEv
  ~CC4x9y12(); // tgen
  CC4x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x9y123abcEv");}
ccc::CC4x9y12 ::~CC4x9y12(){ note_dtor("_ZN3ccc8CC4x9y12E", this);} // tgen
ccc::CC4x9y12 ::CC4x9y12(){ note_ctor("_ZN3ccc8CC4x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y12E, buf);
    ::ccc::CC4x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y12E);
    dp->::ccc::CC4x9y12::~CC4x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y12E(Test__ZN3ccc8CC4x9y12E, "_ZN3ccc8CC4x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y12C1Ev();
extern void _ZN3ccc8CC4x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y12E[] = {
  NSPAIR(_ZN3ccc8CC4x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x9y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y12E[];
Class_Descriptor cd__ZN3ccc8CC4x9y12E = {  "_ZN3ccc8CC4x9y12E", // class name
  bases__ZN3ccc8CC4x9y12E, 2,
  &(vtc__ZN3ccc8CC4x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y13  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC4x9y133efgEv
  ~CC4x9y13(); // tgen
  CC4x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y13E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x9y133efgEv");}
ccc::CC4x9y13 ::~CC4x9y13(){ note_dtor("_ZN3ccc8CC4x9y13E", this);} // tgen
ccc::CC4x9y13 ::CC4x9y13(){ note_ctor("_ZN3ccc8CC4x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y13E, buf);
    ::ccc::CC4x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y13E);
    dp->::ccc::CC4x9y13::~CC4x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y13E(Test__ZN3ccc8CC4x9y13E, "_ZN3ccc8CC4x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y13C1Ev();
extern void _ZN3ccc8CC4x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y13E[] = {
  NSPAIR(_ZN3ccc8CC4x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y133efgEv,_ZThn4_N3ccc8CC4x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x9y133efgEv,_ZThn4_N3ccc8CC4x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y13E[];
Class_Descriptor cd__ZN3ccc8CC4x9y13E = {  "_ZN3ccc8CC4x9y13E", // class name
  bases__ZN3ccc8CC4x9y13E, 2,
  &(vtc__ZN3ccc8CC4x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y14  : ::ccc::AA4 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC4x9y143pqrEv
  ~CC4x9y14(); // tgen
  CC4x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x9y143pqrEv");}
ccc::CC4x9y14 ::~CC4x9y14(){ note_dtor("_ZN3ccc8CC4x9y14E", this);} // tgen
ccc::CC4x9y14 ::CC4x9y14(){ note_ctor("_ZN3ccc8CC4x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y14E, buf);
    ::ccc::CC4x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y14E);
    dp->::ccc::CC4x9y14::~CC4x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y14E(Test__ZN3ccc8CC4x9y14E, "_ZN3ccc8CC4x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y14C1Ev();
extern void _ZN3ccc8CC4x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y14E[] = {
  NSPAIR(_ZN3ccc8CC4x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y14E[];
extern void _ZN3ccc8CC4x9y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x9y143pqrEv,_ZThn4_N3ccc8CC4x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x9y143pqrEv,_ZThn4_N3ccc8CC4x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y14E[];
Class_Descriptor cd__ZN3ccc8CC4x9y14E = {  "_ZN3ccc8CC4x9y14E", // class name
  bases__ZN3ccc8CC4x9y14E, 2,
  &(vtc__ZN3ccc8CC4x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x9y15  : ::ccc::AA4 , ::ccc::BB9 {
  ~CC4x9y15(); // tgen
  CC4x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC4x9y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x9y15 ::~CC4x9y15(){ note_dtor("_ZN3ccc8CC4x9y15E", this);} // tgen
ccc::CC4x9y15 ::CC4x9y15(){ note_ctor("_ZN3ccc8CC4x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC4x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x9y15E, buf);
    ::ccc::CC4x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x9y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC4x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x9y15E);
    dp->::ccc::CC4x9y15::~CC4x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x9y15E(Test__ZN3ccc8CC4x9y15E, "_ZN3ccc8CC4x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x9y15C1Ev();
extern void _ZN3ccc8CC4x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC4x9y15E[] = {
  NSPAIR(_ZN3ccc8CC4x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC4x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC4x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x9y15E[];
Class_Descriptor cd__ZN3ccc8CC4x9y15E = {  "_ZN3ccc8CC4x9y15E", // class name
  bases__ZN3ccc8CC4x9y15E, 2,
  &(vtc__ZN3ccc8CC4x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y0  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y03pqrEv
  ~CC4x10y0(); // tgen
  CC4x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y0E) C1{ BC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y03abcEv");}
void  ccc::CC4x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y03efgEv");}
void  ccc::CC4x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y03pqrEv");}
ccc::CC4x10y0 ::~CC4x10y0(){ note_dtor("_ZN3ccc8CC4x10y0E", this);} // tgen
ccc::CC4x10y0 ::CC4x10y0(){ note_ctor("_ZN3ccc8CC4x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y0E, buf);
    ::ccc::CC4x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y0E);
    dp->::ccc::CC4x10y0::~CC4x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y0E(Test__ZN3ccc8CC4x10y0E, "_ZN3ccc8CC4x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y0C1Ev();
extern void _ZN3ccc8CC4x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y0E[] = {
  NSPAIR(_ZN3ccc8CC4x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y0E[];
extern void _ZN3ccc8CC4x10y03pqrEv();
extern void _ZN3ccc8CC4x10y03abcEv();
extern void _ZN3ccc8CC4x10y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y03pqrEv,_ZThn4_N3ccc8CC4x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y03abcEv,_ZThn4_N3ccc8CC4x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y03pqrEv,_ZThn4_N3ccc8CC4x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y03abcEv,_ZThn4_N3ccc8CC4x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y0E[];
Class_Descriptor cd__ZN3ccc8CC4x10y0E = {  "_ZN3ccc8CC4x10y0E", // class name
  bases__ZN3ccc8CC4x10y0E, 2,
  &(vtc__ZN3ccc8CC4x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y1  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x10y13efgEv
  ~CC4x10y1(); // tgen
  CC4x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y1E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y13abcEv");}
void  ccc::CC4x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y13pqrEv");}
void  ccc::CC4x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y13efgEv");}
ccc::CC4x10y1 ::~CC4x10y1(){ note_dtor("_ZN3ccc8CC4x10y1E", this);} // tgen
ccc::CC4x10y1 ::CC4x10y1(){ note_ctor("_ZN3ccc8CC4x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y1E, buf);
    ::ccc::CC4x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y1E);
    dp->::ccc::CC4x10y1::~CC4x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y1E(Test__ZN3ccc8CC4x10y1E, "_ZN3ccc8CC4x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y1C1Ev();
extern void _ZN3ccc8CC4x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y1E[] = {
  NSPAIR(_ZN3ccc8CC4x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y1E[];
extern void _ZN3ccc8CC4x10y13pqrEv();
extern void _ZN3ccc8CC4x10y13abcEv();
extern void _ZN3ccc8CC4x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y13pqrEv,_ZThn4_N3ccc8CC4x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y13abcEv,_ZThn4_N3ccc8CC4x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y13pqrEv,_ZThn4_N3ccc8CC4x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y13abcEv,_ZThn4_N3ccc8CC4x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y1E[];
Class_Descriptor cd__ZN3ccc8CC4x10y1E = {  "_ZN3ccc8CC4x10y1E", // class name
  bases__ZN3ccc8CC4x10y1E, 2,
  &(vtc__ZN3ccc8CC4x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y2  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y23pqrEv
  ~CC4x10y2(); // tgen
  CC4x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y2E) C1{ BC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y23efgEv");}
void  ccc::CC4x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y23abcEv");}
void  ccc::CC4x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y23pqrEv");}
ccc::CC4x10y2 ::~CC4x10y2(){ note_dtor("_ZN3ccc8CC4x10y2E", this);} // tgen
ccc::CC4x10y2 ::CC4x10y2(){ note_ctor("_ZN3ccc8CC4x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y2E, buf);
    ::ccc::CC4x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y2E);
    dp->::ccc::CC4x10y2::~CC4x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y2E(Test__ZN3ccc8CC4x10y2E, "_ZN3ccc8CC4x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y2C1Ev();
extern void _ZN3ccc8CC4x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y2E[] = {
  NSPAIR(_ZN3ccc8CC4x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y2E[];
extern void _ZN3ccc8CC4x10y23pqrEv();
extern void _ZN3ccc8CC4x10y23abcEv();
extern void _ZN3ccc8CC4x10y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y23pqrEv,_ZThn4_N3ccc8CC4x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y23abcEv,_ZThn4_N3ccc8CC4x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y23pqrEv,_ZThn4_N3ccc8CC4x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y23abcEv,_ZThn4_N3ccc8CC4x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y2E[];
Class_Descriptor cd__ZN3ccc8CC4x10y2E = {  "_ZN3ccc8CC4x10y2E", // class name
  bases__ZN3ccc8CC4x10y2E, 2,
  &(vtc__ZN3ccc8CC4x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y3  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x10y33abcEv
  ~CC4x10y3(); // tgen
  CC4x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y3E) C1{ BC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y33efgEv");}
void  ccc::CC4x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y33pqrEv");}
void  ccc::CC4x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y33abcEv");}
ccc::CC4x10y3 ::~CC4x10y3(){ note_dtor("_ZN3ccc8CC4x10y3E", this);} // tgen
ccc::CC4x10y3 ::CC4x10y3(){ note_ctor("_ZN3ccc8CC4x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y3E, buf);
    ::ccc::CC4x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y3E);
    dp->::ccc::CC4x10y3::~CC4x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y3E(Test__ZN3ccc8CC4x10y3E, "_ZN3ccc8CC4x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y3C1Ev();
extern void _ZN3ccc8CC4x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y3E[] = {
  NSPAIR(_ZN3ccc8CC4x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y3E[];
extern void _ZN3ccc8CC4x10y33pqrEv();
extern void _ZN3ccc8CC4x10y33abcEv();
extern void _ZN3ccc8CC4x10y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y33pqrEv,_ZThn4_N3ccc8CC4x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y33abcEv,_ZThn4_N3ccc8CC4x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y33pqrEv,_ZThn4_N3ccc8CC4x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y33abcEv,_ZThn4_N3ccc8CC4x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y3E[];
Class_Descriptor cd__ZN3ccc8CC4x10y3E = {  "_ZN3ccc8CC4x10y3E", // class name
  bases__ZN3ccc8CC4x10y3E, 2,
  &(vtc__ZN3ccc8CC4x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y4  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC4x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y43efgEv
  ~CC4x10y4(); // tgen
  CC4x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y4E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y43pqrEv");}
void  ccc::CC4x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y43abcEv");}
void  ccc::CC4x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y43efgEv");}
ccc::CC4x10y4 ::~CC4x10y4(){ note_dtor("_ZN3ccc8CC4x10y4E", this);} // tgen
ccc::CC4x10y4 ::CC4x10y4(){ note_ctor("_ZN3ccc8CC4x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y4E, buf);
    ::ccc::CC4x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y4E);
    dp->::ccc::CC4x10y4::~CC4x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y4E(Test__ZN3ccc8CC4x10y4E, "_ZN3ccc8CC4x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y4C1Ev();
extern void _ZN3ccc8CC4x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y4E[] = {
  NSPAIR(_ZN3ccc8CC4x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y4E[];
extern void _ZN3ccc8CC4x10y43pqrEv();
extern void _ZN3ccc8CC4x10y43abcEv();
extern void _ZN3ccc8CC4x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y43pqrEv,_ZThn4_N3ccc8CC4x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y43abcEv,_ZThn4_N3ccc8CC4x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y43pqrEv,_ZThn4_N3ccc8CC4x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y43abcEv,_ZThn4_N3ccc8CC4x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y4E[];
Class_Descriptor cd__ZN3ccc8CC4x10y4E = {  "_ZN3ccc8CC4x10y4E", // class name
  bases__ZN3ccc8CC4x10y4E, 2,
  &(vtc__ZN3ccc8CC4x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y5  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC4x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y53abcEv
  ~CC4x10y5(); // tgen
  CC4x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y5E) C1{ BC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y53pqrEv");}
void  ccc::CC4x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y53efgEv");}
void  ccc::CC4x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y53abcEv");}
ccc::CC4x10y5 ::~CC4x10y5(){ note_dtor("_ZN3ccc8CC4x10y5E", this);} // tgen
ccc::CC4x10y5 ::CC4x10y5(){ note_ctor("_ZN3ccc8CC4x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y5E, buf);
    ::ccc::CC4x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y5E);
    dp->::ccc::CC4x10y5::~CC4x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y5E(Test__ZN3ccc8CC4x10y5E, "_ZN3ccc8CC4x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y5C1Ev();
extern void _ZN3ccc8CC4x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y5E[] = {
  NSPAIR(_ZN3ccc8CC4x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y5E[];
extern void _ZN3ccc8CC4x10y53pqrEv();
extern void _ZN3ccc8CC4x10y53abcEv();
extern void _ZN3ccc8CC4x10y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y53pqrEv,_ZThn4_N3ccc8CC4x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y53abcEv,_ZThn4_N3ccc8CC4x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y53pqrEv,_ZThn4_N3ccc8CC4x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y53abcEv,_ZThn4_N3ccc8CC4x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y5E[];
Class_Descriptor cd__ZN3ccc8CC4x10y5E = {  "_ZN3ccc8CC4x10y5E", // class name
  bases__ZN3ccc8CC4x10y5E, 2,
  &(vtc__ZN3ccc8CC4x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y6  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x10y63efgEv
  ~CC4x10y6(); // tgen
  CC4x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y6E) C1{ BC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y63abcEv");}
void  ccc::CC4x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y63efgEv");}
ccc::CC4x10y6 ::~CC4x10y6(){ note_dtor("_ZN3ccc8CC4x10y6E", this);} // tgen
ccc::CC4x10y6 ::CC4x10y6(){ note_ctor("_ZN3ccc8CC4x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y6E, buf);
    ::ccc::CC4x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y6E);
    dp->::ccc::CC4x10y6::~CC4x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y6E(Test__ZN3ccc8CC4x10y6E, "_ZN3ccc8CC4x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y6C1Ev();
extern void _ZN3ccc8CC4x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y6E[] = {
  NSPAIR(_ZN3ccc8CC4x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x10y63abcEv();
extern void _ZN3ccc8CC4x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y63abcEv,_ZThn4_N3ccc8CC4x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y63abcEv,_ZThn4_N3ccc8CC4x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y6E[];
Class_Descriptor cd__ZN3ccc8CC4x10y6E = {  "_ZN3ccc8CC4x10y6E", // class name
  bases__ZN3ccc8CC4x10y6E, 2,
  &(vtc__ZN3ccc8CC4x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y7  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC4x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y73pqrEv
  ~CC4x10y7(); // tgen
  CC4x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y7E) C1{ BC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y73abcEv");}
void  ccc::CC4x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y73pqrEv");}
ccc::CC4x10y7 ::~CC4x10y7(){ note_dtor("_ZN3ccc8CC4x10y7E", this);} // tgen
ccc::CC4x10y7 ::CC4x10y7(){ note_ctor("_ZN3ccc8CC4x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y7E, buf);
    ::ccc::CC4x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y7E);
    dp->::ccc::CC4x10y7::~CC4x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y7E(Test__ZN3ccc8CC4x10y7E, "_ZN3ccc8CC4x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y7C1Ev();
extern void _ZN3ccc8CC4x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y7E[] = {
  NSPAIR(_ZN3ccc8CC4x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y7E[];
extern void _ZN3ccc8CC4x10y73pqrEv();
extern void _ZN3ccc8CC4x10y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y73pqrEv,_ZThn4_N3ccc8CC4x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y73abcEv,_ZThn4_N3ccc8CC4x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y73pqrEv,_ZThn4_N3ccc8CC4x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y73abcEv,_ZThn4_N3ccc8CC4x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y7E[];
Class_Descriptor cd__ZN3ccc8CC4x10y7E = {  "_ZN3ccc8CC4x10y7E", // class name
  bases__ZN3ccc8CC4x10y7E, 2,
  &(vtc__ZN3ccc8CC4x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y8  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x10y83abcEv
  ~CC4x10y8(); // tgen
  CC4x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y8E) C1{ BC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y83efgEv");}
void  ccc::CC4x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x10y83abcEv");}
ccc::CC4x10y8 ::~CC4x10y8(){ note_dtor("_ZN3ccc8CC4x10y8E", this);} // tgen
ccc::CC4x10y8 ::CC4x10y8(){ note_ctor("_ZN3ccc8CC4x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y8E, buf);
    ::ccc::CC4x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y8E);
    dp->::ccc::CC4x10y8::~CC4x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y8E(Test__ZN3ccc8CC4x10y8E, "_ZN3ccc8CC4x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y8C1Ev();
extern void _ZN3ccc8CC4x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y8E[] = {
  NSPAIR(_ZN3ccc8CC4x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x10y83abcEv();
extern void _ZN3ccc8CC4x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y83abcEv,_ZThn4_N3ccc8CC4x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y83abcEv,_ZThn4_N3ccc8CC4x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y8E[];
Class_Descriptor cd__ZN3ccc8CC4x10y8E = {  "_ZN3ccc8CC4x10y8E", // class name
  bases__ZN3ccc8CC4x10y8E, 2,
  &(vtc__ZN3ccc8CC4x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y9  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC4x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x10y93pqrEv
  ~CC4x10y9(); // tgen
  CC4x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x10y9E) C1{ BC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x10y93efgEv");}
void  ccc::CC4x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x10y93pqrEv");}
ccc::CC4x10y9 ::~CC4x10y9(){ note_dtor("_ZN3ccc8CC4x10y9E", this);} // tgen
ccc::CC4x10y9 ::CC4x10y9(){ note_ctor("_ZN3ccc8CC4x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x10y9E, buf);
    ::ccc::CC4x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x10y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8CC4x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x10y9E);
    dp->::ccc::CC4x10y9::~CC4x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x10y9E(Test__ZN3ccc8CC4x10y9E, "_ZN3ccc8CC4x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x10y9C1Ev();
extern void _ZN3ccc8CC4x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x10y9E[] = {
  NSPAIR(_ZN3ccc8CC4x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC4x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y9E[];
extern void _ZN3ccc8CC4x10y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x10y93pqrEv,_ZThn4_N3ccc8CC4x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x10y93pqrEv,_ZThn4_N3ccc8CC4x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x10y9E[];
Class_Descriptor cd__ZN3ccc8CC4x10y9E = {  "_ZN3ccc8CC4x10y9E", // class name
  bases__ZN3ccc8CC4x10y9E, 2,
  &(vtc__ZN3ccc8CC4x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y10  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x10y103abcEv
  ~CC4x10y10(); // tgen
  CC4x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y10E) C1{ BC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y103pqrEv");}
void  ccc::CC4x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x10y103abcEv");}
ccc::CC4x10y10 ::~CC4x10y10(){ note_dtor("_ZN3ccc9CC4x10y10E", this);} // tgen
ccc::CC4x10y10 ::CC4x10y10(){ note_ctor("_ZN3ccc9CC4x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y10E, buf);
    ::ccc::CC4x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y10E);
    dp->::ccc::CC4x10y10::~CC4x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y10E(Test__ZN3ccc9CC4x10y10E, "_ZN3ccc9CC4x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y10C1Ev();
extern void _ZN3ccc9CC4x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y10E[] = {
  NSPAIR(_ZN3ccc9CC4x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y10E[];
extern void _ZN3ccc9CC4x10y103pqrEv();
extern void _ZN3ccc9CC4x10y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y103pqrEv,_ZThn4_N3ccc9CC4x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y103abcEv,_ZThn4_N3ccc9CC4x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x10y103pqrEv,_ZThn4_N3ccc9CC4x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x10y103abcEv,_ZThn4_N3ccc9CC4x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y10E[];
Class_Descriptor cd__ZN3ccc9CC4x10y10E = {  "_ZN3ccc9CC4x10y10E", // class name
  bases__ZN3ccc9CC4x10y10E, 2,
  &(vtc__ZN3ccc9CC4x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y11  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x10y113efgEv
  ~CC4x10y11(); // tgen
  CC4x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y11E) C1{ BC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y113pqrEv");}
void  ccc::CC4x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x10y113efgEv");}
ccc::CC4x10y11 ::~CC4x10y11(){ note_dtor("_ZN3ccc9CC4x10y11E", this);} // tgen
ccc::CC4x10y11 ::CC4x10y11(){ note_ctor("_ZN3ccc9CC4x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y11E, buf);
    ::ccc::CC4x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y11E);
    dp->::ccc::CC4x10y11::~CC4x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y11E(Test__ZN3ccc9CC4x10y11E, "_ZN3ccc9CC4x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y11C1Ev();
extern void _ZN3ccc9CC4x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y11E[] = {
  NSPAIR(_ZN3ccc9CC4x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y11E[];
extern void _ZN3ccc9CC4x10y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y113pqrEv,_ZThn4_N3ccc9CC4x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x10y113pqrEv,_ZThn4_N3ccc9CC4x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y11E[];
Class_Descriptor cd__ZN3ccc9CC4x10y11E = {  "_ZN3ccc9CC4x10y11E", // class name
  bases__ZN3ccc9CC4x10y11E, 2,
  &(vtc__ZN3ccc9CC4x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y12  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC4x10y123abcEv
  ~CC4x10y12(); // tgen
  CC4x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x10y123abcEv");}
ccc::CC4x10y12 ::~CC4x10y12(){ note_dtor("_ZN3ccc9CC4x10y12E", this);} // tgen
ccc::CC4x10y12 ::CC4x10y12(){ note_ctor("_ZN3ccc9CC4x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y12E, buf);
    ::ccc::CC4x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y12E);
    dp->::ccc::CC4x10y12::~CC4x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y12E(Test__ZN3ccc9CC4x10y12E, "_ZN3ccc9CC4x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y12C1Ev();
extern void _ZN3ccc9CC4x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y12E[] = {
  NSPAIR(_ZN3ccc9CC4x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x10y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y123abcEv,_ZThn4_N3ccc9CC4x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x10y123abcEv,_ZThn4_N3ccc9CC4x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y12E[];
Class_Descriptor cd__ZN3ccc9CC4x10y12E = {  "_ZN3ccc9CC4x10y12E", // class name
  bases__ZN3ccc9CC4x10y12E, 2,
  &(vtc__ZN3ccc9CC4x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y13  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC4x10y133efgEv
  ~CC4x10y13(); // tgen
  CC4x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x10y133efgEv");}
ccc::CC4x10y13 ::~CC4x10y13(){ note_dtor("_ZN3ccc9CC4x10y13E", this);} // tgen
ccc::CC4x10y13 ::CC4x10y13(){ note_ctor("_ZN3ccc9CC4x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y13E, buf);
    ::ccc::CC4x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y13E);
    dp->::ccc::CC4x10y13::~CC4x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y13E(Test__ZN3ccc9CC4x10y13E, "_ZN3ccc9CC4x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y13C1Ev();
extern void _ZN3ccc9CC4x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y13E[] = {
  NSPAIR(_ZN3ccc9CC4x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y13E[];
Class_Descriptor cd__ZN3ccc9CC4x10y13E = {  "_ZN3ccc9CC4x10y13E", // class name
  bases__ZN3ccc9CC4x10y13E, 2,
  &(vtc__ZN3ccc9CC4x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y14  : ::ccc::AA4 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC4x10y143pqrEv
  ~CC4x10y14(); // tgen
  CC4x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y14E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x10y143pqrEv");}
ccc::CC4x10y14 ::~CC4x10y14(){ note_dtor("_ZN3ccc9CC4x10y14E", this);} // tgen
ccc::CC4x10y14 ::CC4x10y14(){ note_ctor("_ZN3ccc9CC4x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y14E, buf);
    ::ccc::CC4x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y14E);
    dp->::ccc::CC4x10y14::~CC4x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y14E(Test__ZN3ccc9CC4x10y14E, "_ZN3ccc9CC4x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y14C1Ev();
extern void _ZN3ccc9CC4x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y14E[] = {
  NSPAIR(_ZN3ccc9CC4x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y14E[];
extern void _ZN3ccc9CC4x10y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x10y143pqrEv,_ZThn4_N3ccc9CC4x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x10y143pqrEv,_ZThn4_N3ccc9CC4x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y14E[];
Class_Descriptor cd__ZN3ccc9CC4x10y14E = {  "_ZN3ccc9CC4x10y14E", // class name
  bases__ZN3ccc9CC4x10y14E, 2,
  &(vtc__ZN3ccc9CC4x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x10y15  : ::ccc::AA4 , ::ccc::BB10 {
  ~CC4x10y15(); // tgen
  CC4x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x10y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x10y15 ::~CC4x10y15(){ note_dtor("_ZN3ccc9CC4x10y15E", this);} // tgen
ccc::CC4x10y15 ::CC4x10y15(){ note_ctor("_ZN3ccc9CC4x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x10y15E, buf);
    ::ccc::CC4x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x10y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC4x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x10y15E);
    dp->::ccc::CC4x10y15::~CC4x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x10y15E(Test__ZN3ccc9CC4x10y15E, "_ZN3ccc9CC4x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x10y15C1Ev();
extern void _ZN3ccc9CC4x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x10y15E[] = {
  NSPAIR(_ZN3ccc9CC4x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC4x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x10y15E[];
Class_Descriptor cd__ZN3ccc9CC4x10y15E = {  "_ZN3ccc9CC4x10y15E", // class name
  bases__ZN3ccc9CC4x10y15E, 2,
  &(vtc__ZN3ccc9CC4x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y0  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y03pqrEv
  ~CC4x11y0(); // tgen
  CC4x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y0E) C1{ BC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y03abcEv");}
void  ccc::CC4x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y03efgEv");}
void  ccc::CC4x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y03pqrEv");}
ccc::CC4x11y0 ::~CC4x11y0(){ note_dtor("_ZN3ccc8CC4x11y0E", this);} // tgen
ccc::CC4x11y0 ::CC4x11y0(){ note_ctor("_ZN3ccc8CC4x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y0E, buf);
    ::ccc::CC4x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y0E);
    dp->::ccc::CC4x11y0::~CC4x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y0E(Test__ZN3ccc8CC4x11y0E, "_ZN3ccc8CC4x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y0C1Ev();
extern void _ZN3ccc8CC4x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y0E[] = {
  NSPAIR(_ZN3ccc8CC4x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y0E[];
extern void _ZN3ccc8CC4x11y03pqrEv();
extern void _ZN3ccc8CC4x11y03abcEv();
extern void _ZN3ccc8CC4x11y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y03pqrEv,_ZThn4_N3ccc8CC4x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y03efgEv,_ZThn4_N3ccc8CC4x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y03pqrEv,_ZThn4_N3ccc8CC4x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y03efgEv,_ZThn4_N3ccc8CC4x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y0E[];
Class_Descriptor cd__ZN3ccc8CC4x11y0E = {  "_ZN3ccc8CC4x11y0E", // class name
  bases__ZN3ccc8CC4x11y0E, 2,
  &(vtc__ZN3ccc8CC4x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y1  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x11y13efgEv
  ~CC4x11y1(); // tgen
  CC4x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y1E) C1{ BC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y13abcEv");}
void  ccc::CC4x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y13pqrEv");}
void  ccc::CC4x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y13efgEv");}
ccc::CC4x11y1 ::~CC4x11y1(){ note_dtor("_ZN3ccc8CC4x11y1E", this);} // tgen
ccc::CC4x11y1 ::CC4x11y1(){ note_ctor("_ZN3ccc8CC4x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y1E, buf);
    ::ccc::CC4x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y1E);
    dp->::ccc::CC4x11y1::~CC4x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y1E(Test__ZN3ccc8CC4x11y1E, "_ZN3ccc8CC4x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y1C1Ev();
extern void _ZN3ccc8CC4x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y1E[] = {
  NSPAIR(_ZN3ccc8CC4x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y1E[];
extern void _ZN3ccc8CC4x11y13pqrEv();
extern void _ZN3ccc8CC4x11y13abcEv();
extern void _ZN3ccc8CC4x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y13pqrEv,_ZThn4_N3ccc8CC4x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y13efgEv,_ZThn4_N3ccc8CC4x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y13pqrEv,_ZThn4_N3ccc8CC4x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y13efgEv,_ZThn4_N3ccc8CC4x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y1E[];
Class_Descriptor cd__ZN3ccc8CC4x11y1E = {  "_ZN3ccc8CC4x11y1E", // class name
  bases__ZN3ccc8CC4x11y1E, 2,
  &(vtc__ZN3ccc8CC4x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y2  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y23pqrEv
  ~CC4x11y2(); // tgen
  CC4x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y2E) C1{ BC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y23efgEv");}
void  ccc::CC4x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y23abcEv");}
void  ccc::CC4x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y23pqrEv");}
ccc::CC4x11y2 ::~CC4x11y2(){ note_dtor("_ZN3ccc8CC4x11y2E", this);} // tgen
ccc::CC4x11y2 ::CC4x11y2(){ note_ctor("_ZN3ccc8CC4x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y2E, buf);
    ::ccc::CC4x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y2E);
    dp->::ccc::CC4x11y2::~CC4x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y2E(Test__ZN3ccc8CC4x11y2E, "_ZN3ccc8CC4x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y2C1Ev();
extern void _ZN3ccc8CC4x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y2E[] = {
  NSPAIR(_ZN3ccc8CC4x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y2E[];
extern void _ZN3ccc8CC4x11y23pqrEv();
extern void _ZN3ccc8CC4x11y23abcEv();
extern void _ZN3ccc8CC4x11y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y23pqrEv,_ZThn4_N3ccc8CC4x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y23efgEv,_ZThn4_N3ccc8CC4x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y23pqrEv,_ZThn4_N3ccc8CC4x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y23efgEv,_ZThn4_N3ccc8CC4x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y2E[];
Class_Descriptor cd__ZN3ccc8CC4x11y2E = {  "_ZN3ccc8CC4x11y2E", // class name
  bases__ZN3ccc8CC4x11y2E, 2,
  &(vtc__ZN3ccc8CC4x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y3  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x11y33abcEv
  ~CC4x11y3(); // tgen
  CC4x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y3E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y33efgEv");}
void  ccc::CC4x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y33pqrEv");}
void  ccc::CC4x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y33abcEv");}
ccc::CC4x11y3 ::~CC4x11y3(){ note_dtor("_ZN3ccc8CC4x11y3E", this);} // tgen
ccc::CC4x11y3 ::CC4x11y3(){ note_ctor("_ZN3ccc8CC4x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y3E, buf);
    ::ccc::CC4x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y3E);
    dp->::ccc::CC4x11y3::~CC4x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y3E(Test__ZN3ccc8CC4x11y3E, "_ZN3ccc8CC4x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y3C1Ev();
extern void _ZN3ccc8CC4x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y3E[] = {
  NSPAIR(_ZN3ccc8CC4x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y3E[];
extern void _ZN3ccc8CC4x11y33pqrEv();
extern void _ZN3ccc8CC4x11y33abcEv();
extern void _ZN3ccc8CC4x11y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y33pqrEv,_ZThn4_N3ccc8CC4x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y33efgEv,_ZThn4_N3ccc8CC4x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y33pqrEv,_ZThn4_N3ccc8CC4x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y33efgEv,_ZThn4_N3ccc8CC4x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y3E[];
Class_Descriptor cd__ZN3ccc8CC4x11y3E = {  "_ZN3ccc8CC4x11y3E", // class name
  bases__ZN3ccc8CC4x11y3E, 2,
  &(vtc__ZN3ccc8CC4x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y4  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC4x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y43efgEv
  ~CC4x11y4(); // tgen
  CC4x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y4E) C1{ BC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y43pqrEv");}
void  ccc::CC4x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y43abcEv");}
void  ccc::CC4x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y43efgEv");}
ccc::CC4x11y4 ::~CC4x11y4(){ note_dtor("_ZN3ccc8CC4x11y4E", this);} // tgen
ccc::CC4x11y4 ::CC4x11y4(){ note_ctor("_ZN3ccc8CC4x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y4E, buf);
    ::ccc::CC4x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y4E);
    dp->::ccc::CC4x11y4::~CC4x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y4E(Test__ZN3ccc8CC4x11y4E, "_ZN3ccc8CC4x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y4C1Ev();
extern void _ZN3ccc8CC4x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y4E[] = {
  NSPAIR(_ZN3ccc8CC4x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y4E[];
extern void _ZN3ccc8CC4x11y43pqrEv();
extern void _ZN3ccc8CC4x11y43abcEv();
extern void _ZN3ccc8CC4x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y43pqrEv,_ZThn4_N3ccc8CC4x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y43efgEv,_ZThn4_N3ccc8CC4x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y43pqrEv,_ZThn4_N3ccc8CC4x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y43efgEv,_ZThn4_N3ccc8CC4x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y4E[];
Class_Descriptor cd__ZN3ccc8CC4x11y4E = {  "_ZN3ccc8CC4x11y4E", // class name
  bases__ZN3ccc8CC4x11y4E, 2,
  &(vtc__ZN3ccc8CC4x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y5  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC4x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y53abcEv
  ~CC4x11y5(); // tgen
  CC4x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y5E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y53pqrEv");}
void  ccc::CC4x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y53efgEv");}
void  ccc::CC4x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y53abcEv");}
ccc::CC4x11y5 ::~CC4x11y5(){ note_dtor("_ZN3ccc8CC4x11y5E", this);} // tgen
ccc::CC4x11y5 ::CC4x11y5(){ note_ctor("_ZN3ccc8CC4x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y5E, buf);
    ::ccc::CC4x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y5E);
    dp->::ccc::CC4x11y5::~CC4x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y5E(Test__ZN3ccc8CC4x11y5E, "_ZN3ccc8CC4x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y5C1Ev();
extern void _ZN3ccc8CC4x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y5E[] = {
  NSPAIR(_ZN3ccc8CC4x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y5E[];
extern void _ZN3ccc8CC4x11y53pqrEv();
extern void _ZN3ccc8CC4x11y53abcEv();
extern void _ZN3ccc8CC4x11y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y53pqrEv,_ZThn4_N3ccc8CC4x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y53efgEv,_ZThn4_N3ccc8CC4x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y53pqrEv,_ZThn4_N3ccc8CC4x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y53efgEv,_ZThn4_N3ccc8CC4x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y5E[];
Class_Descriptor cd__ZN3ccc8CC4x11y5E = {  "_ZN3ccc8CC4x11y5E", // class name
  bases__ZN3ccc8CC4x11y5E, 2,
  &(vtc__ZN3ccc8CC4x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y6  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x11y63efgEv
  ~CC4x11y6(); // tgen
  CC4x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y6E) C1{ BC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y63abcEv");}
void  ccc::CC4x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y63efgEv");}
ccc::CC4x11y6 ::~CC4x11y6(){ note_dtor("_ZN3ccc8CC4x11y6E", this);} // tgen
ccc::CC4x11y6 ::CC4x11y6(){ note_ctor("_ZN3ccc8CC4x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y6E, buf);
    ::ccc::CC4x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y6E);
    dp->::ccc::CC4x11y6::~CC4x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y6E(Test__ZN3ccc8CC4x11y6E, "_ZN3ccc8CC4x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y6C1Ev();
extern void _ZN3ccc8CC4x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y6E[] = {
  NSPAIR(_ZN3ccc8CC4x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x11y63abcEv();
extern void _ZN3ccc8CC4x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y63efgEv,_ZThn4_N3ccc8CC4x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y63efgEv,_ZThn4_N3ccc8CC4x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y6E[];
Class_Descriptor cd__ZN3ccc8CC4x11y6E = {  "_ZN3ccc8CC4x11y6E", // class name
  bases__ZN3ccc8CC4x11y6E, 2,
  &(vtc__ZN3ccc8CC4x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y7  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC4x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y73pqrEv
  ~CC4x11y7(); // tgen
  CC4x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y7E) C1{ BC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y73abcEv");}
void  ccc::CC4x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y73pqrEv");}
ccc::CC4x11y7 ::~CC4x11y7(){ note_dtor("_ZN3ccc8CC4x11y7E", this);} // tgen
ccc::CC4x11y7 ::CC4x11y7(){ note_ctor("_ZN3ccc8CC4x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y7E, buf);
    ::ccc::CC4x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y7E);
    dp->::ccc::CC4x11y7::~CC4x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y7E(Test__ZN3ccc8CC4x11y7E, "_ZN3ccc8CC4x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y7C1Ev();
extern void _ZN3ccc8CC4x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y7E[] = {
  NSPAIR(_ZN3ccc8CC4x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y7E[];
extern void _ZN3ccc8CC4x11y73pqrEv();
extern void _ZN3ccc8CC4x11y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y73pqrEv,_ZThn4_N3ccc8CC4x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y73pqrEv,_ZThn4_N3ccc8CC4x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y7E[];
Class_Descriptor cd__ZN3ccc8CC4x11y7E = {  "_ZN3ccc8CC4x11y7E", // class name
  bases__ZN3ccc8CC4x11y7E, 2,
  &(vtc__ZN3ccc8CC4x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y8  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x11y83abcEv
  ~CC4x11y8(); // tgen
  CC4x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y8E) C1{ BC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y83efgEv");}
void  ccc::CC4x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x11y83abcEv");}
ccc::CC4x11y8 ::~CC4x11y8(){ note_dtor("_ZN3ccc8CC4x11y8E", this);} // tgen
ccc::CC4x11y8 ::CC4x11y8(){ note_ctor("_ZN3ccc8CC4x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y8E, buf);
    ::ccc::CC4x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y8E);
    dp->::ccc::CC4x11y8::~CC4x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y8E(Test__ZN3ccc8CC4x11y8E, "_ZN3ccc8CC4x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y8C1Ev();
extern void _ZN3ccc8CC4x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y8E[] = {
  NSPAIR(_ZN3ccc8CC4x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x11y83abcEv();
extern void _ZN3ccc8CC4x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y83efgEv,_ZThn4_N3ccc8CC4x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y83efgEv,_ZThn4_N3ccc8CC4x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y8E[];
Class_Descriptor cd__ZN3ccc8CC4x11y8E = {  "_ZN3ccc8CC4x11y8E", // class name
  bases__ZN3ccc8CC4x11y8E, 2,
  &(vtc__ZN3ccc8CC4x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y9  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC4x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x11y93pqrEv
  ~CC4x11y9(); // tgen
  CC4x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x11y9E) C1{ BC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x11y93efgEv");}
void  ccc::CC4x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x11y93pqrEv");}
ccc::CC4x11y9 ::~CC4x11y9(){ note_dtor("_ZN3ccc8CC4x11y9E", this);} // tgen
ccc::CC4x11y9 ::CC4x11y9(){ note_ctor("_ZN3ccc8CC4x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x11y9E, buf);
    ::ccc::CC4x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x11y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8CC4x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x11y9E);
    dp->::ccc::CC4x11y9::~CC4x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x11y9E(Test__ZN3ccc8CC4x11y9E, "_ZN3ccc8CC4x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x11y9C1Ev();
extern void _ZN3ccc8CC4x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x11y9E[] = {
  NSPAIR(_ZN3ccc8CC4x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC4x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y9E[];
extern void _ZN3ccc8CC4x11y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y93pqrEv,_ZThn4_N3ccc8CC4x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC4x11y93efgEv,_ZThn4_N3ccc8CC4x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y93pqrEv,_ZThn4_N3ccc8CC4x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x11y93efgEv,_ZThn4_N3ccc8CC4x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x11y9E[];
Class_Descriptor cd__ZN3ccc8CC4x11y9E = {  "_ZN3ccc8CC4x11y9E", // class name
  bases__ZN3ccc8CC4x11y9E, 2,
  &(vtc__ZN3ccc8CC4x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y10  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x11y103abcEv
  ~CC4x11y10(); // tgen
  CC4x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y10E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y103pqrEv");}
void  ccc::CC4x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x11y103abcEv");}
ccc::CC4x11y10 ::~CC4x11y10(){ note_dtor("_ZN3ccc9CC4x11y10E", this);} // tgen
ccc::CC4x11y10 ::CC4x11y10(){ note_ctor("_ZN3ccc9CC4x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y10E, buf);
    ::ccc::CC4x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y10E);
    dp->::ccc::CC4x11y10::~CC4x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y10E(Test__ZN3ccc9CC4x11y10E, "_ZN3ccc9CC4x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y10C1Ev();
extern void _ZN3ccc9CC4x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y10E[] = {
  NSPAIR(_ZN3ccc9CC4x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y10E[];
extern void _ZN3ccc9CC4x11y103pqrEv();
extern void _ZN3ccc9CC4x11y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y103pqrEv,_ZThn4_N3ccc9CC4x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x11y103pqrEv,_ZThn4_N3ccc9CC4x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y10E[];
Class_Descriptor cd__ZN3ccc9CC4x11y10E = {  "_ZN3ccc9CC4x11y10E", // class name
  bases__ZN3ccc9CC4x11y10E, 2,
  &(vtc__ZN3ccc9CC4x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y11  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x11y113efgEv
  ~CC4x11y11(); // tgen
  CC4x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y11E) C1{ BC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y113pqrEv");}
void  ccc::CC4x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x11y113efgEv");}
ccc::CC4x11y11 ::~CC4x11y11(){ note_dtor("_ZN3ccc9CC4x11y11E", this);} // tgen
ccc::CC4x11y11 ::CC4x11y11(){ note_ctor("_ZN3ccc9CC4x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y11E, buf);
    ::ccc::CC4x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y11E);
    dp->::ccc::CC4x11y11::~CC4x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y11E(Test__ZN3ccc9CC4x11y11E, "_ZN3ccc9CC4x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y11C1Ev();
extern void _ZN3ccc9CC4x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y11E[] = {
  NSPAIR(_ZN3ccc9CC4x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y11E[];
extern void _ZN3ccc9CC4x11y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y113pqrEv,_ZThn4_N3ccc9CC4x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y113efgEv,_ZThn4_N3ccc9CC4x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x11y113pqrEv,_ZThn4_N3ccc9CC4x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x11y113efgEv,_ZThn4_N3ccc9CC4x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y11E[];
Class_Descriptor cd__ZN3ccc9CC4x11y11E = {  "_ZN3ccc9CC4x11y11E", // class name
  bases__ZN3ccc9CC4x11y11E, 2,
  &(vtc__ZN3ccc9CC4x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y12  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC4x11y123abcEv
  ~CC4x11y12(); // tgen
  CC4x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y12E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC4x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x11y123abcEv");}
ccc::CC4x11y12 ::~CC4x11y12(){ note_dtor("_ZN3ccc9CC4x11y12E", this);} // tgen
ccc::CC4x11y12 ::CC4x11y12(){ note_ctor("_ZN3ccc9CC4x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y12E, buf);
    ::ccc::CC4x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y12E);
    dp->::ccc::CC4x11y12::~CC4x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y12E(Test__ZN3ccc9CC4x11y12E, "_ZN3ccc9CC4x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y12C1Ev();
extern void _ZN3ccc9CC4x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y12E[] = {
  NSPAIR(_ZN3ccc9CC4x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x11y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y12E[];
Class_Descriptor cd__ZN3ccc9CC4x11y12E = {  "_ZN3ccc9CC4x11y12E", // class name
  bases__ZN3ccc9CC4x11y12E, 2,
  &(vtc__ZN3ccc9CC4x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y13  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC4x11y133efgEv
  ~CC4x11y13(); // tgen
  CC4x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y13E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC4x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x11y133efgEv");}
ccc::CC4x11y13 ::~CC4x11y13(){ note_dtor("_ZN3ccc9CC4x11y13E", this);} // tgen
ccc::CC4x11y13 ::CC4x11y13(){ note_ctor("_ZN3ccc9CC4x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y13E, buf);
    ::ccc::CC4x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y13E);
    dp->::ccc::CC4x11y13::~CC4x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y13E(Test__ZN3ccc9CC4x11y13E, "_ZN3ccc9CC4x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y13C1Ev();
extern void _ZN3ccc9CC4x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y13E[] = {
  NSPAIR(_ZN3ccc9CC4x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y133efgEv,_ZThn4_N3ccc9CC4x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x11y133efgEv,_ZThn4_N3ccc9CC4x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y13E[];
Class_Descriptor cd__ZN3ccc9CC4x11y13E = {  "_ZN3ccc9CC4x11y13E", // class name
  bases__ZN3ccc9CC4x11y13E, 2,
  &(vtc__ZN3ccc9CC4x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y14  : ::ccc::AA4 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC4x11y143pqrEv
  ~CC4x11y14(); // tgen
  CC4x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y14E) C1{ BC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC4x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x11y143pqrEv");}
ccc::CC4x11y14 ::~CC4x11y14(){ note_dtor("_ZN3ccc9CC4x11y14E", this);} // tgen
ccc::CC4x11y14 ::CC4x11y14(){ note_ctor("_ZN3ccc9CC4x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y14E, buf);
    ::ccc::CC4x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y14E);
    dp->::ccc::CC4x11y14::~CC4x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y14E(Test__ZN3ccc9CC4x11y14E, "_ZN3ccc9CC4x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y14C1Ev();
extern void _ZN3ccc9CC4x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y14E[] = {
  NSPAIR(_ZN3ccc9CC4x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y14E[];
extern void _ZN3ccc9CC4x11y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x11y143pqrEv,_ZThn4_N3ccc9CC4x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x11y143pqrEv,_ZThn4_N3ccc9CC4x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y14E[];
Class_Descriptor cd__ZN3ccc9CC4x11y14E = {  "_ZN3ccc9CC4x11y14E", // class name
  bases__ZN3ccc9CC4x11y14E, 2,
  &(vtc__ZN3ccc9CC4x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x11y15  : ::ccc::AA4 , ::ccc::BB11 {
  ~CC4x11y15(); // tgen
  CC4x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x11y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC4x11y15 ::~CC4x11y15(){ note_dtor("_ZN3ccc9CC4x11y15E", this);} // tgen
ccc::CC4x11y15 ::CC4x11y15(){ note_ctor("_ZN3ccc9CC4x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x11y15E, buf);
    ::ccc::CC4x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x11y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC4x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x11y15E);
    dp->::ccc::CC4x11y15::~CC4x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x11y15E(Test__ZN3ccc9CC4x11y15E, "_ZN3ccc9CC4x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x11y15C1Ev();
extern void _ZN3ccc9CC4x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x11y15E[] = {
  NSPAIR(_ZN3ccc9CC4x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC4x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x11y15E[];
Class_Descriptor cd__ZN3ccc9CC4x11y15E = {  "_ZN3ccc9CC4x11y15E", // class name
  bases__ZN3ccc9CC4x11y15E, 2,
  &(vtc__ZN3ccc9CC4x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y0  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y03pqrEv
  ~CC4x12y0(); // tgen
  CC4x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y0E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y03abcEv");}
void  ccc::CC4x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y03efgEv");}
void  ccc::CC4x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y03pqrEv");}
ccc::CC4x12y0 ::~CC4x12y0(){ note_dtor("_ZN3ccc8CC4x12y0E", this);} // tgen
ccc::CC4x12y0 ::CC4x12y0(){ note_ctor("_ZN3ccc8CC4x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y0E, buf);
    ::ccc::CC4x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y0E);
    dp->::ccc::CC4x12y0::~CC4x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y0E(Test__ZN3ccc8CC4x12y0E, "_ZN3ccc8CC4x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y0C1Ev();
extern void _ZN3ccc8CC4x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y0E[] = {
  NSPAIR(_ZN3ccc8CC4x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y0E[];
extern void _ZN3ccc8CC4x12y03pqrEv();
extern void _ZN3ccc8CC4x12y03abcEv();
extern void _ZN3ccc8CC4x12y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y03abcEv,_ZThn4_N3ccc8CC4x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y03abcEv,_ZThn4_N3ccc8CC4x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y0E[];
Class_Descriptor cd__ZN3ccc8CC4x12y0E = {  "_ZN3ccc8CC4x12y0E", // class name
  bases__ZN3ccc8CC4x12y0E, 2,
  &(vtc__ZN3ccc8CC4x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y1  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x12y13efgEv
  ~CC4x12y1(); // tgen
  CC4x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y1E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y13abcEv");}
void  ccc::CC4x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y13pqrEv");}
void  ccc::CC4x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y13efgEv");}
ccc::CC4x12y1 ::~CC4x12y1(){ note_dtor("_ZN3ccc8CC4x12y1E", this);} // tgen
ccc::CC4x12y1 ::CC4x12y1(){ note_ctor("_ZN3ccc8CC4x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y1E, buf);
    ::ccc::CC4x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y1E);
    dp->::ccc::CC4x12y1::~CC4x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y1E(Test__ZN3ccc8CC4x12y1E, "_ZN3ccc8CC4x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y1C1Ev();
extern void _ZN3ccc8CC4x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y1E[] = {
  NSPAIR(_ZN3ccc8CC4x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y1E[];
extern void _ZN3ccc8CC4x12y13pqrEv();
extern void _ZN3ccc8CC4x12y13abcEv();
extern void _ZN3ccc8CC4x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y13abcEv,_ZThn4_N3ccc8CC4x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y13abcEv,_ZThn4_N3ccc8CC4x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y1E[];
Class_Descriptor cd__ZN3ccc8CC4x12y1E = {  "_ZN3ccc8CC4x12y1E", // class name
  bases__ZN3ccc8CC4x12y1E, 2,
  &(vtc__ZN3ccc8CC4x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y2  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y23pqrEv
  ~CC4x12y2(); // tgen
  CC4x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y2E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y23efgEv");}
void  ccc::CC4x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y23abcEv");}
void  ccc::CC4x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y23pqrEv");}
ccc::CC4x12y2 ::~CC4x12y2(){ note_dtor("_ZN3ccc8CC4x12y2E", this);} // tgen
ccc::CC4x12y2 ::CC4x12y2(){ note_ctor("_ZN3ccc8CC4x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y2E, buf);
    ::ccc::CC4x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y2E);
    dp->::ccc::CC4x12y2::~CC4x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y2E(Test__ZN3ccc8CC4x12y2E, "_ZN3ccc8CC4x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y2C1Ev();
extern void _ZN3ccc8CC4x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y2E[] = {
  NSPAIR(_ZN3ccc8CC4x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y2E[];
extern void _ZN3ccc8CC4x12y23pqrEv();
extern void _ZN3ccc8CC4x12y23abcEv();
extern void _ZN3ccc8CC4x12y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y23abcEv,_ZThn4_N3ccc8CC4x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y23abcEv,_ZThn4_N3ccc8CC4x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y2E[];
Class_Descriptor cd__ZN3ccc8CC4x12y2E = {  "_ZN3ccc8CC4x12y2E", // class name
  bases__ZN3ccc8CC4x12y2E, 2,
  &(vtc__ZN3ccc8CC4x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y3  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x12y33abcEv
  ~CC4x12y3(); // tgen
  CC4x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y3E) C1{ BC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y33efgEv");}
void  ccc::CC4x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y33pqrEv");}
void  ccc::CC4x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y33abcEv");}
ccc::CC4x12y3 ::~CC4x12y3(){ note_dtor("_ZN3ccc8CC4x12y3E", this);} // tgen
ccc::CC4x12y3 ::CC4x12y3(){ note_ctor("_ZN3ccc8CC4x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y3E, buf);
    ::ccc::CC4x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y3E);
    dp->::ccc::CC4x12y3::~CC4x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y3E(Test__ZN3ccc8CC4x12y3E, "_ZN3ccc8CC4x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y3C1Ev();
extern void _ZN3ccc8CC4x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y3E[] = {
  NSPAIR(_ZN3ccc8CC4x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y3E[];
extern void _ZN3ccc8CC4x12y33pqrEv();
extern void _ZN3ccc8CC4x12y33abcEv();
extern void _ZN3ccc8CC4x12y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y33abcEv,_ZThn4_N3ccc8CC4x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y33abcEv,_ZThn4_N3ccc8CC4x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y3E[];
Class_Descriptor cd__ZN3ccc8CC4x12y3E = {  "_ZN3ccc8CC4x12y3E", // class name
  bases__ZN3ccc8CC4x12y3E, 2,
  &(vtc__ZN3ccc8CC4x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y4  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC4x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y43efgEv
  ~CC4x12y4(); // tgen
  CC4x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y4E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y43pqrEv");}
void  ccc::CC4x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y43abcEv");}
void  ccc::CC4x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y43efgEv");}
ccc::CC4x12y4 ::~CC4x12y4(){ note_dtor("_ZN3ccc8CC4x12y4E", this);} // tgen
ccc::CC4x12y4 ::CC4x12y4(){ note_ctor("_ZN3ccc8CC4x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y4E, buf);
    ::ccc::CC4x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y4E);
    dp->::ccc::CC4x12y4::~CC4x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y4E(Test__ZN3ccc8CC4x12y4E, "_ZN3ccc8CC4x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y4C1Ev();
extern void _ZN3ccc8CC4x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y4E[] = {
  NSPAIR(_ZN3ccc8CC4x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y4E[];
extern void _ZN3ccc8CC4x12y43pqrEv();
extern void _ZN3ccc8CC4x12y43abcEv();
extern void _ZN3ccc8CC4x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y43abcEv,_ZThn4_N3ccc8CC4x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y43abcEv,_ZThn4_N3ccc8CC4x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y4E[];
Class_Descriptor cd__ZN3ccc8CC4x12y4E = {  "_ZN3ccc8CC4x12y4E", // class name
  bases__ZN3ccc8CC4x12y4E, 2,
  &(vtc__ZN3ccc8CC4x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y5  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC4x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y53abcEv
  ~CC4x12y5(); // tgen
  CC4x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y5E) C1{ BC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y53pqrEv");}
void  ccc::CC4x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y53efgEv");}
void  ccc::CC4x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y53abcEv");}
ccc::CC4x12y5 ::~CC4x12y5(){ note_dtor("_ZN3ccc8CC4x12y5E", this);} // tgen
ccc::CC4x12y5 ::CC4x12y5(){ note_ctor("_ZN3ccc8CC4x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y5E, buf);
    ::ccc::CC4x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y5E);
    dp->::ccc::CC4x12y5::~CC4x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y5E(Test__ZN3ccc8CC4x12y5E, "_ZN3ccc8CC4x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y5C1Ev();
extern void _ZN3ccc8CC4x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y5E[] = {
  NSPAIR(_ZN3ccc8CC4x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y5E[];
extern void _ZN3ccc8CC4x12y53pqrEv();
extern void _ZN3ccc8CC4x12y53abcEv();
extern void _ZN3ccc8CC4x12y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y53abcEv,_ZThn4_N3ccc8CC4x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y53abcEv,_ZThn4_N3ccc8CC4x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y5E[];
Class_Descriptor cd__ZN3ccc8CC4x12y5E = {  "_ZN3ccc8CC4x12y5E", // class name
  bases__ZN3ccc8CC4x12y5E, 2,
  &(vtc__ZN3ccc8CC4x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y6  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x12y63efgEv
  ~CC4x12y6(); // tgen
  CC4x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y6E) C1{ BC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y63abcEv");}
void  ccc::CC4x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y63efgEv");}
ccc::CC4x12y6 ::~CC4x12y6(){ note_dtor("_ZN3ccc8CC4x12y6E", this);} // tgen
ccc::CC4x12y6 ::CC4x12y6(){ note_ctor("_ZN3ccc8CC4x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y6E, buf);
    ::ccc::CC4x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y6E);
    dp->::ccc::CC4x12y6::~CC4x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y6E(Test__ZN3ccc8CC4x12y6E, "_ZN3ccc8CC4x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y6C1Ev();
extern void _ZN3ccc8CC4x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y6E[] = {
  NSPAIR(_ZN3ccc8CC4x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x12y63abcEv();
extern void _ZN3ccc8CC4x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y63abcEv,_ZThn4_N3ccc8CC4x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y63abcEv,_ZThn4_N3ccc8CC4x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y6E[];
Class_Descriptor cd__ZN3ccc8CC4x12y6E = {  "_ZN3ccc8CC4x12y6E", // class name
  bases__ZN3ccc8CC4x12y6E, 2,
  &(vtc__ZN3ccc8CC4x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y7  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC4x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y73pqrEv
  ~CC4x12y7(); // tgen
  CC4x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y7E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y73abcEv");}
void  ccc::CC4x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y73pqrEv");}
ccc::CC4x12y7 ::~CC4x12y7(){ note_dtor("_ZN3ccc8CC4x12y7E", this);} // tgen
ccc::CC4x12y7 ::CC4x12y7(){ note_ctor("_ZN3ccc8CC4x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y7E, buf);
    ::ccc::CC4x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y7E);
    dp->::ccc::CC4x12y7::~CC4x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y7E(Test__ZN3ccc8CC4x12y7E, "_ZN3ccc8CC4x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y7C1Ev();
extern void _ZN3ccc8CC4x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y7E[] = {
  NSPAIR(_ZN3ccc8CC4x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y7E[];
extern void _ZN3ccc8CC4x12y73pqrEv();
extern void _ZN3ccc8CC4x12y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y73abcEv,_ZThn4_N3ccc8CC4x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y73abcEv,_ZThn4_N3ccc8CC4x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y7E[];
Class_Descriptor cd__ZN3ccc8CC4x12y7E = {  "_ZN3ccc8CC4x12y7E", // class name
  bases__ZN3ccc8CC4x12y7E, 2,
  &(vtc__ZN3ccc8CC4x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y8  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x12y83abcEv
  ~CC4x12y8(); // tgen
  CC4x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y8E) C1{ BC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y83efgEv");}
void  ccc::CC4x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x12y83abcEv");}
ccc::CC4x12y8 ::~CC4x12y8(){ note_dtor("_ZN3ccc8CC4x12y8E", this);} // tgen
ccc::CC4x12y8 ::CC4x12y8(){ note_ctor("_ZN3ccc8CC4x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y8E, buf);
    ::ccc::CC4x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y8E);
    dp->::ccc::CC4x12y8::~CC4x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y8E(Test__ZN3ccc8CC4x12y8E, "_ZN3ccc8CC4x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y8C1Ev();
extern void _ZN3ccc8CC4x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y8E[] = {
  NSPAIR(_ZN3ccc8CC4x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x12y83abcEv();
extern void _ZN3ccc8CC4x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x12y83abcEv,_ZThn4_N3ccc8CC4x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x12y83abcEv,_ZThn4_N3ccc8CC4x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y8E[];
Class_Descriptor cd__ZN3ccc8CC4x12y8E = {  "_ZN3ccc8CC4x12y8E", // class name
  bases__ZN3ccc8CC4x12y8E, 2,
  &(vtc__ZN3ccc8CC4x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y9  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC4x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x12y93pqrEv
  ~CC4x12y9(); // tgen
  CC4x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x12y9E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x12y93efgEv");}
void  ccc::CC4x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x12y93pqrEv");}
ccc::CC4x12y9 ::~CC4x12y9(){ note_dtor("_ZN3ccc8CC4x12y9E", this);} // tgen
ccc::CC4x12y9 ::CC4x12y9(){ note_ctor("_ZN3ccc8CC4x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x12y9E, buf);
    ::ccc::CC4x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x12y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8CC4x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x12y9E);
    dp->::ccc::CC4x12y9::~CC4x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x12y9E(Test__ZN3ccc8CC4x12y9E, "_ZN3ccc8CC4x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x12y9C1Ev();
extern void _ZN3ccc8CC4x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x12y9E[] = {
  NSPAIR(_ZN3ccc8CC4x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC4x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y9E[];
extern void _ZN3ccc8CC4x12y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x12y9E[];
Class_Descriptor cd__ZN3ccc8CC4x12y9E = {  "_ZN3ccc8CC4x12y9E", // class name
  bases__ZN3ccc8CC4x12y9E, 2,
  &(vtc__ZN3ccc8CC4x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y10  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x12y103abcEv
  ~CC4x12y10(); // tgen
  CC4x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y10E) C1{ BC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y103pqrEv");}
void  ccc::CC4x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x12y103abcEv");}
ccc::CC4x12y10 ::~CC4x12y10(){ note_dtor("_ZN3ccc9CC4x12y10E", this);} // tgen
ccc::CC4x12y10 ::CC4x12y10(){ note_ctor("_ZN3ccc9CC4x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y10E, buf);
    ::ccc::CC4x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y10E);
    dp->::ccc::CC4x12y10::~CC4x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y10E(Test__ZN3ccc9CC4x12y10E, "_ZN3ccc9CC4x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y10C1Ev();
extern void _ZN3ccc9CC4x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y10E[] = {
  NSPAIR(_ZN3ccc9CC4x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y10E[];
extern void _ZN3ccc9CC4x12y103pqrEv();
extern void _ZN3ccc9CC4x12y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y103abcEv,_ZThn4_N3ccc9CC4x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x12y103abcEv,_ZThn4_N3ccc9CC4x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y10E[];
Class_Descriptor cd__ZN3ccc9CC4x12y10E = {  "_ZN3ccc9CC4x12y10E", // class name
  bases__ZN3ccc9CC4x12y10E, 2,
  &(vtc__ZN3ccc9CC4x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y11  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x12y113efgEv
  ~CC4x12y11(); // tgen
  CC4x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y11E) C1{ BC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y113pqrEv");}
void  ccc::CC4x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x12y113efgEv");}
ccc::CC4x12y11 ::~CC4x12y11(){ note_dtor("_ZN3ccc9CC4x12y11E", this);} // tgen
ccc::CC4x12y11 ::CC4x12y11(){ note_ctor("_ZN3ccc9CC4x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y11E, buf);
    ::ccc::CC4x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y11E);
    dp->::ccc::CC4x12y11::~CC4x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y11E(Test__ZN3ccc9CC4x12y11E, "_ZN3ccc9CC4x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y11C1Ev();
extern void _ZN3ccc9CC4x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y11E[] = {
  NSPAIR(_ZN3ccc9CC4x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y11E[];
extern void _ZN3ccc9CC4x12y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y11E[];
Class_Descriptor cd__ZN3ccc9CC4x12y11E = {  "_ZN3ccc9CC4x12y11E", // class name
  bases__ZN3ccc9CC4x12y11E, 2,
  &(vtc__ZN3ccc9CC4x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y12  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC4x12y123abcEv
  ~CC4x12y12(); // tgen
  CC4x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y12E) C1{ BC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x12y123abcEv");}
ccc::CC4x12y12 ::~CC4x12y12(){ note_dtor("_ZN3ccc9CC4x12y12E", this);} // tgen
ccc::CC4x12y12 ::CC4x12y12(){ note_ctor("_ZN3ccc9CC4x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y12E, buf);
    ::ccc::CC4x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y12E);
    dp->::ccc::CC4x12y12::~CC4x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y12E(Test__ZN3ccc9CC4x12y12E, "_ZN3ccc9CC4x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y12C1Ev();
extern void _ZN3ccc9CC4x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y12E[] = {
  NSPAIR(_ZN3ccc9CC4x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x12y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x12y123abcEv,_ZThn4_N3ccc9CC4x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x12y123abcEv,_ZThn4_N3ccc9CC4x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y12E[];
Class_Descriptor cd__ZN3ccc9CC4x12y12E = {  "_ZN3ccc9CC4x12y12E", // class name
  bases__ZN3ccc9CC4x12y12E, 2,
  &(vtc__ZN3ccc9CC4x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y13  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC4x12y133efgEv
  ~CC4x12y13(); // tgen
  CC4x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y13E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x12y133efgEv");}
ccc::CC4x12y13 ::~CC4x12y13(){ note_dtor("_ZN3ccc9CC4x12y13E", this);} // tgen
ccc::CC4x12y13 ::CC4x12y13(){ note_ctor("_ZN3ccc9CC4x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y13E, buf);
    ::ccc::CC4x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y13E);
    dp->::ccc::CC4x12y13::~CC4x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y13E(Test__ZN3ccc9CC4x12y13E, "_ZN3ccc9CC4x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y13C1Ev();
extern void _ZN3ccc9CC4x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y13E[] = {
  NSPAIR(_ZN3ccc9CC4x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y13E[];
Class_Descriptor cd__ZN3ccc9CC4x12y13E = {  "_ZN3ccc9CC4x12y13E", // class name
  bases__ZN3ccc9CC4x12y13E, 2,
  &(vtc__ZN3ccc9CC4x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y14  : ::ccc::AA4 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC4x12y143pqrEv
  ~CC4x12y14(); // tgen
  CC4x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y14E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x12y143pqrEv");}
ccc::CC4x12y14 ::~CC4x12y14(){ note_dtor("_ZN3ccc9CC4x12y14E", this);} // tgen
ccc::CC4x12y14 ::CC4x12y14(){ note_ctor("_ZN3ccc9CC4x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y14E, buf);
    ::ccc::CC4x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y14E);
    dp->::ccc::CC4x12y14::~CC4x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y14E(Test__ZN3ccc9CC4x12y14E, "_ZN3ccc9CC4x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y14C1Ev();
extern void _ZN3ccc9CC4x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y14E[] = {
  NSPAIR(_ZN3ccc9CC4x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y14E[];
extern void _ZN3ccc9CC4x12y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y14E[];
Class_Descriptor cd__ZN3ccc9CC4x12y14E = {  "_ZN3ccc9CC4x12y14E", // class name
  bases__ZN3ccc9CC4x12y14E, 2,
  &(vtc__ZN3ccc9CC4x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x12y15  : ::ccc::AA4 , ::ccc::BB12 {
  ~CC4x12y15(); // tgen
  CC4x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x12y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x12y15 ::~CC4x12y15(){ note_dtor("_ZN3ccc9CC4x12y15E", this);} // tgen
ccc::CC4x12y15 ::CC4x12y15(){ note_ctor("_ZN3ccc9CC4x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x12y15E, buf);
    ::ccc::CC4x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x12y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC4x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x12y15E);
    dp->::ccc::CC4x12y15::~CC4x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x12y15E(Test__ZN3ccc9CC4x12y15E, "_ZN3ccc9CC4x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x12y15C1Ev();
extern void _ZN3ccc9CC4x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x12y15E[] = {
  NSPAIR(_ZN3ccc9CC4x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC4x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x12y15E[];
Class_Descriptor cd__ZN3ccc9CC4x12y15E = {  "_ZN3ccc9CC4x12y15E", // class name
  bases__ZN3ccc9CC4x12y15E, 2,
  &(vtc__ZN3ccc9CC4x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y0  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y03pqrEv
  ~CC4x13y0(); // tgen
  CC4x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y0E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y03abcEv");}
void  ccc::CC4x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y03efgEv");}
void  ccc::CC4x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y03pqrEv");}
ccc::CC4x13y0 ::~CC4x13y0(){ note_dtor("_ZN3ccc8CC4x13y0E", this);} // tgen
ccc::CC4x13y0 ::CC4x13y0(){ note_ctor("_ZN3ccc8CC4x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y0E, buf);
    ::ccc::CC4x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y0E);
    dp->::ccc::CC4x13y0::~CC4x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y0E(Test__ZN3ccc8CC4x13y0E, "_ZN3ccc8CC4x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y0C1Ev();
extern void _ZN3ccc8CC4x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y0E[] = {
  NSPAIR(_ZN3ccc8CC4x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y0E[];
extern void _ZN3ccc8CC4x13y03pqrEv();
extern void _ZN3ccc8CC4x13y03abcEv();
extern void _ZN3ccc8CC4x13y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y03efgEv,_ZThn4_N3ccc8CC4x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y03efgEv,_ZThn4_N3ccc8CC4x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y0E[];
Class_Descriptor cd__ZN3ccc8CC4x13y0E = {  "_ZN3ccc8CC4x13y0E", // class name
  bases__ZN3ccc8CC4x13y0E, 2,
  &(vtc__ZN3ccc8CC4x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y1  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x13y13efgEv
  ~CC4x13y1(); // tgen
  CC4x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y1E) C1{ BC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y13abcEv");}
void  ccc::CC4x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y13pqrEv");}
void  ccc::CC4x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y13efgEv");}
ccc::CC4x13y1 ::~CC4x13y1(){ note_dtor("_ZN3ccc8CC4x13y1E", this);} // tgen
ccc::CC4x13y1 ::CC4x13y1(){ note_ctor("_ZN3ccc8CC4x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y1E, buf);
    ::ccc::CC4x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y1E);
    dp->::ccc::CC4x13y1::~CC4x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y1E(Test__ZN3ccc8CC4x13y1E, "_ZN3ccc8CC4x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y1C1Ev();
extern void _ZN3ccc8CC4x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y1E[] = {
  NSPAIR(_ZN3ccc8CC4x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y1E[];
extern void _ZN3ccc8CC4x13y13pqrEv();
extern void _ZN3ccc8CC4x13y13abcEv();
extern void _ZN3ccc8CC4x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y13efgEv,_ZThn4_N3ccc8CC4x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y13efgEv,_ZThn4_N3ccc8CC4x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y1E[];
Class_Descriptor cd__ZN3ccc8CC4x13y1E = {  "_ZN3ccc8CC4x13y1E", // class name
  bases__ZN3ccc8CC4x13y1E, 2,
  &(vtc__ZN3ccc8CC4x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y2  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y23pqrEv
  ~CC4x13y2(); // tgen
  CC4x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y2E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y23efgEv");}
void  ccc::CC4x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y23abcEv");}
void  ccc::CC4x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y23pqrEv");}
ccc::CC4x13y2 ::~CC4x13y2(){ note_dtor("_ZN3ccc8CC4x13y2E", this);} // tgen
ccc::CC4x13y2 ::CC4x13y2(){ note_ctor("_ZN3ccc8CC4x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y2E, buf);
    ::ccc::CC4x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y2E);
    dp->::ccc::CC4x13y2::~CC4x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y2E(Test__ZN3ccc8CC4x13y2E, "_ZN3ccc8CC4x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y2C1Ev();
extern void _ZN3ccc8CC4x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y2E[] = {
  NSPAIR(_ZN3ccc8CC4x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y2E[];
extern void _ZN3ccc8CC4x13y23pqrEv();
extern void _ZN3ccc8CC4x13y23abcEv();
extern void _ZN3ccc8CC4x13y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y23efgEv,_ZThn4_N3ccc8CC4x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y23efgEv,_ZThn4_N3ccc8CC4x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y2E[];
Class_Descriptor cd__ZN3ccc8CC4x13y2E = {  "_ZN3ccc8CC4x13y2E", // class name
  bases__ZN3ccc8CC4x13y2E, 2,
  &(vtc__ZN3ccc8CC4x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y3  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x13y33abcEv
  ~CC4x13y3(); // tgen
  CC4x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y3E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y33efgEv");}
void  ccc::CC4x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y33pqrEv");}
void  ccc::CC4x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y33abcEv");}
ccc::CC4x13y3 ::~CC4x13y3(){ note_dtor("_ZN3ccc8CC4x13y3E", this);} // tgen
ccc::CC4x13y3 ::CC4x13y3(){ note_ctor("_ZN3ccc8CC4x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y3E, buf);
    ::ccc::CC4x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y3E);
    dp->::ccc::CC4x13y3::~CC4x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y3E(Test__ZN3ccc8CC4x13y3E, "_ZN3ccc8CC4x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y3C1Ev();
extern void _ZN3ccc8CC4x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y3E[] = {
  NSPAIR(_ZN3ccc8CC4x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y3E[];
extern void _ZN3ccc8CC4x13y33pqrEv();
extern void _ZN3ccc8CC4x13y33abcEv();
extern void _ZN3ccc8CC4x13y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y33efgEv,_ZThn4_N3ccc8CC4x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y33efgEv,_ZThn4_N3ccc8CC4x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y3E[];
Class_Descriptor cd__ZN3ccc8CC4x13y3E = {  "_ZN3ccc8CC4x13y3E", // class name
  bases__ZN3ccc8CC4x13y3E, 2,
  &(vtc__ZN3ccc8CC4x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y4  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC4x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y43efgEv
  ~CC4x13y4(); // tgen
  CC4x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y4E) C1{ BC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y43pqrEv");}
void  ccc::CC4x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y43abcEv");}
void  ccc::CC4x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y43efgEv");}
ccc::CC4x13y4 ::~CC4x13y4(){ note_dtor("_ZN3ccc8CC4x13y4E", this);} // tgen
ccc::CC4x13y4 ::CC4x13y4(){ note_ctor("_ZN3ccc8CC4x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y4E, buf);
    ::ccc::CC4x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y4E);
    dp->::ccc::CC4x13y4::~CC4x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y4E(Test__ZN3ccc8CC4x13y4E, "_ZN3ccc8CC4x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y4C1Ev();
extern void _ZN3ccc8CC4x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y4E[] = {
  NSPAIR(_ZN3ccc8CC4x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y4E[];
extern void _ZN3ccc8CC4x13y43pqrEv();
extern void _ZN3ccc8CC4x13y43abcEv();
extern void _ZN3ccc8CC4x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y43efgEv,_ZThn4_N3ccc8CC4x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y43efgEv,_ZThn4_N3ccc8CC4x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y4E[];
Class_Descriptor cd__ZN3ccc8CC4x13y4E = {  "_ZN3ccc8CC4x13y4E", // class name
  bases__ZN3ccc8CC4x13y4E, 2,
  &(vtc__ZN3ccc8CC4x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y5  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC4x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y53abcEv
  ~CC4x13y5(); // tgen
  CC4x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y5E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y53pqrEv");}
void  ccc::CC4x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y53efgEv");}
void  ccc::CC4x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y53abcEv");}
ccc::CC4x13y5 ::~CC4x13y5(){ note_dtor("_ZN3ccc8CC4x13y5E", this);} // tgen
ccc::CC4x13y5 ::CC4x13y5(){ note_ctor("_ZN3ccc8CC4x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y5E, buf);
    ::ccc::CC4x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y5E);
    dp->::ccc::CC4x13y5::~CC4x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y5E(Test__ZN3ccc8CC4x13y5E, "_ZN3ccc8CC4x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y5C1Ev();
extern void _ZN3ccc8CC4x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y5E[] = {
  NSPAIR(_ZN3ccc8CC4x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y5E[];
extern void _ZN3ccc8CC4x13y53pqrEv();
extern void _ZN3ccc8CC4x13y53abcEv();
extern void _ZN3ccc8CC4x13y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y53efgEv,_ZThn4_N3ccc8CC4x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y53efgEv,_ZThn4_N3ccc8CC4x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y5E[];
Class_Descriptor cd__ZN3ccc8CC4x13y5E = {  "_ZN3ccc8CC4x13y5E", // class name
  bases__ZN3ccc8CC4x13y5E, 2,
  &(vtc__ZN3ccc8CC4x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y6  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x13y63efgEv
  ~CC4x13y6(); // tgen
  CC4x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y6E) C1{ BC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y63abcEv");}
void  ccc::CC4x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y63efgEv");}
ccc::CC4x13y6 ::~CC4x13y6(){ note_dtor("_ZN3ccc8CC4x13y6E", this);} // tgen
ccc::CC4x13y6 ::CC4x13y6(){ note_ctor("_ZN3ccc8CC4x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y6E, buf);
    ::ccc::CC4x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y6E);
    dp->::ccc::CC4x13y6::~CC4x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y6E(Test__ZN3ccc8CC4x13y6E, "_ZN3ccc8CC4x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y6C1Ev();
extern void _ZN3ccc8CC4x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y6E[] = {
  NSPAIR(_ZN3ccc8CC4x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x13y63abcEv();
extern void _ZN3ccc8CC4x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y63efgEv,_ZThn4_N3ccc8CC4x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y63efgEv,_ZThn4_N3ccc8CC4x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y6E[];
Class_Descriptor cd__ZN3ccc8CC4x13y6E = {  "_ZN3ccc8CC4x13y6E", // class name
  bases__ZN3ccc8CC4x13y6E, 2,
  &(vtc__ZN3ccc8CC4x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y7  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC4x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y73pqrEv
  ~CC4x13y7(); // tgen
  CC4x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y7E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y73abcEv");}
void  ccc::CC4x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y73pqrEv");}
ccc::CC4x13y7 ::~CC4x13y7(){ note_dtor("_ZN3ccc8CC4x13y7E", this);} // tgen
ccc::CC4x13y7 ::CC4x13y7(){ note_ctor("_ZN3ccc8CC4x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y7E, buf);
    ::ccc::CC4x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y7E);
    dp->::ccc::CC4x13y7::~CC4x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y7E(Test__ZN3ccc8CC4x13y7E, "_ZN3ccc8CC4x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y7C1Ev();
extern void _ZN3ccc8CC4x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y7E[] = {
  NSPAIR(_ZN3ccc8CC4x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y7E[];
extern void _ZN3ccc8CC4x13y73pqrEv();
extern void _ZN3ccc8CC4x13y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y7E[];
Class_Descriptor cd__ZN3ccc8CC4x13y7E = {  "_ZN3ccc8CC4x13y7E", // class name
  bases__ZN3ccc8CC4x13y7E, 2,
  &(vtc__ZN3ccc8CC4x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y8  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x13y83abcEv
  ~CC4x13y8(); // tgen
  CC4x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y8E) C1{ BC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y83efgEv");}
void  ccc::CC4x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x13y83abcEv");}
ccc::CC4x13y8 ::~CC4x13y8(){ note_dtor("_ZN3ccc8CC4x13y8E", this);} // tgen
ccc::CC4x13y8 ::CC4x13y8(){ note_ctor("_ZN3ccc8CC4x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y8E, buf);
    ::ccc::CC4x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y8E);
    dp->::ccc::CC4x13y8::~CC4x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y8E(Test__ZN3ccc8CC4x13y8E, "_ZN3ccc8CC4x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y8C1Ev();
extern void _ZN3ccc8CC4x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y8E[] = {
  NSPAIR(_ZN3ccc8CC4x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x13y83abcEv();
extern void _ZN3ccc8CC4x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y83efgEv,_ZThn4_N3ccc8CC4x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y83efgEv,_ZThn4_N3ccc8CC4x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y8E[];
Class_Descriptor cd__ZN3ccc8CC4x13y8E = {  "_ZN3ccc8CC4x13y8E", // class name
  bases__ZN3ccc8CC4x13y8E, 2,
  &(vtc__ZN3ccc8CC4x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y9  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC4x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x13y93pqrEv
  ~CC4x13y9(); // tgen
  CC4x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x13y9E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x13y93efgEv");}
void  ccc::CC4x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x13y93pqrEv");}
ccc::CC4x13y9 ::~CC4x13y9(){ note_dtor("_ZN3ccc8CC4x13y9E", this);} // tgen
ccc::CC4x13y9 ::CC4x13y9(){ note_ctor("_ZN3ccc8CC4x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x13y9E, buf);
    ::ccc::CC4x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x13y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8CC4x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x13y9E);
    dp->::ccc::CC4x13y9::~CC4x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x13y9E(Test__ZN3ccc8CC4x13y9E, "_ZN3ccc8CC4x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x13y9C1Ev();
extern void _ZN3ccc8CC4x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x13y9E[] = {
  NSPAIR(_ZN3ccc8CC4x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC4x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y9E[];
extern void _ZN3ccc8CC4x13y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x13y93efgEv,_ZThn4_N3ccc8CC4x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x13y93efgEv,_ZThn4_N3ccc8CC4x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x13y9E[];
Class_Descriptor cd__ZN3ccc8CC4x13y9E = {  "_ZN3ccc8CC4x13y9E", // class name
  bases__ZN3ccc8CC4x13y9E, 2,
  &(vtc__ZN3ccc8CC4x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y10  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x13y103abcEv
  ~CC4x13y10(); // tgen
  CC4x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y10E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y103pqrEv");}
void  ccc::CC4x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x13y103abcEv");}
ccc::CC4x13y10 ::~CC4x13y10(){ note_dtor("_ZN3ccc9CC4x13y10E", this);} // tgen
ccc::CC4x13y10 ::CC4x13y10(){ note_ctor("_ZN3ccc9CC4x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y10E, buf);
    ::ccc::CC4x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y10E);
    dp->::ccc::CC4x13y10::~CC4x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y10E(Test__ZN3ccc9CC4x13y10E, "_ZN3ccc9CC4x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y10C1Ev();
extern void _ZN3ccc9CC4x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y10E[] = {
  NSPAIR(_ZN3ccc9CC4x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y10E[];
extern void _ZN3ccc9CC4x13y103pqrEv();
extern void _ZN3ccc9CC4x13y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y10E[];
Class_Descriptor cd__ZN3ccc9CC4x13y10E = {  "_ZN3ccc9CC4x13y10E", // class name
  bases__ZN3ccc9CC4x13y10E, 2,
  &(vtc__ZN3ccc9CC4x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y11  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x13y113efgEv
  ~CC4x13y11(); // tgen
  CC4x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y11E) C1{ BC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y113pqrEv");}
void  ccc::CC4x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x13y113efgEv");}
ccc::CC4x13y11 ::~CC4x13y11(){ note_dtor("_ZN3ccc9CC4x13y11E", this);} // tgen
ccc::CC4x13y11 ::CC4x13y11(){ note_ctor("_ZN3ccc9CC4x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y11E, buf);
    ::ccc::CC4x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y11E);
    dp->::ccc::CC4x13y11::~CC4x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y11E(Test__ZN3ccc9CC4x13y11E, "_ZN3ccc9CC4x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y11C1Ev();
extern void _ZN3ccc9CC4x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y11E[] = {
  NSPAIR(_ZN3ccc9CC4x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y11E[];
extern void _ZN3ccc9CC4x13y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y113efgEv,_ZThn4_N3ccc9CC4x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x13y113efgEv,_ZThn4_N3ccc9CC4x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y11E[];
Class_Descriptor cd__ZN3ccc9CC4x13y11E = {  "_ZN3ccc9CC4x13y11E", // class name
  bases__ZN3ccc9CC4x13y11E, 2,
  &(vtc__ZN3ccc9CC4x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y12  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC4x13y123abcEv
  ~CC4x13y12(); // tgen
  CC4x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y12E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x13y123abcEv");}
ccc::CC4x13y12 ::~CC4x13y12(){ note_dtor("_ZN3ccc9CC4x13y12E", this);} // tgen
ccc::CC4x13y12 ::CC4x13y12(){ note_ctor("_ZN3ccc9CC4x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y12E, buf);
    ::ccc::CC4x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y12E);
    dp->::ccc::CC4x13y12::~CC4x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y12E(Test__ZN3ccc9CC4x13y12E, "_ZN3ccc9CC4x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y12C1Ev();
extern void _ZN3ccc9CC4x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y12E[] = {
  NSPAIR(_ZN3ccc9CC4x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x13y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y12E[];
Class_Descriptor cd__ZN3ccc9CC4x13y12E = {  "_ZN3ccc9CC4x13y12E", // class name
  bases__ZN3ccc9CC4x13y12E, 2,
  &(vtc__ZN3ccc9CC4x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y13  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC4x13y133efgEv
  ~CC4x13y13(); // tgen
  CC4x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y13E) C1{ BC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x13y133efgEv");}
ccc::CC4x13y13 ::~CC4x13y13(){ note_dtor("_ZN3ccc9CC4x13y13E", this);} // tgen
ccc::CC4x13y13 ::CC4x13y13(){ note_ctor("_ZN3ccc9CC4x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y13E, buf);
    ::ccc::CC4x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y13E);
    dp->::ccc::CC4x13y13::~CC4x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y13E(Test__ZN3ccc9CC4x13y13E, "_ZN3ccc9CC4x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y13C1Ev();
extern void _ZN3ccc9CC4x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y13E[] = {
  NSPAIR(_ZN3ccc9CC4x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x13y133efgEv,_ZThn4_N3ccc9CC4x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x13y133efgEv,_ZThn4_N3ccc9CC4x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y13E[];
Class_Descriptor cd__ZN3ccc9CC4x13y13E = {  "_ZN3ccc9CC4x13y13E", // class name
  bases__ZN3ccc9CC4x13y13E, 2,
  &(vtc__ZN3ccc9CC4x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y14  : ::ccc::AA4 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC4x13y143pqrEv
  ~CC4x13y14(); // tgen
  CC4x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y14E) C1{ BC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x13y143pqrEv");}
ccc::CC4x13y14 ::~CC4x13y14(){ note_dtor("_ZN3ccc9CC4x13y14E", this);} // tgen
ccc::CC4x13y14 ::CC4x13y14(){ note_ctor("_ZN3ccc9CC4x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y14E, buf);
    ::ccc::CC4x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y14E);
    dp->::ccc::CC4x13y14::~CC4x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y14E(Test__ZN3ccc9CC4x13y14E, "_ZN3ccc9CC4x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y14C1Ev();
extern void _ZN3ccc9CC4x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y14E[] = {
  NSPAIR(_ZN3ccc9CC4x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y14E[];
extern void _ZN3ccc9CC4x13y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y14E[];
Class_Descriptor cd__ZN3ccc9CC4x13y14E = {  "_ZN3ccc9CC4x13y14E", // class name
  bases__ZN3ccc9CC4x13y14E, 2,
  &(vtc__ZN3ccc9CC4x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x13y15  : ::ccc::AA4 , ::ccc::BB13 {
  ~CC4x13y15(); // tgen
  CC4x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x13y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x13y15 ::~CC4x13y15(){ note_dtor("_ZN3ccc9CC4x13y15E", this);} // tgen
ccc::CC4x13y15 ::CC4x13y15(){ note_ctor("_ZN3ccc9CC4x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x13y15E, buf);
    ::ccc::CC4x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x13y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC4x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x13y15E);
    dp->::ccc::CC4x13y15::~CC4x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x13y15E(Test__ZN3ccc9CC4x13y15E, "_ZN3ccc9CC4x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x13y15C1Ev();
extern void _ZN3ccc9CC4x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x13y15E[] = {
  NSPAIR(_ZN3ccc9CC4x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC4x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x13y15E[];
Class_Descriptor cd__ZN3ccc9CC4x13y15E = {  "_ZN3ccc9CC4x13y15E", // class name
  bases__ZN3ccc9CC4x13y15E, 2,
  &(vtc__ZN3ccc9CC4x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y0  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y03pqrEv
  ~CC4x14y0(); // tgen
  CC4x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y0E) C1{ BC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y03abcEv");}
void  ccc::CC4x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y03efgEv");}
void  ccc::CC4x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y03pqrEv");}
ccc::CC4x14y0 ::~CC4x14y0(){ note_dtor("_ZN3ccc8CC4x14y0E", this);} // tgen
ccc::CC4x14y0 ::CC4x14y0(){ note_ctor("_ZN3ccc8CC4x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y0E, buf);
    ::ccc::CC4x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y0E);
    dp->::ccc::CC4x14y0::~CC4x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y0E(Test__ZN3ccc8CC4x14y0E, "_ZN3ccc8CC4x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y0C1Ev();
extern void _ZN3ccc8CC4x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y0E[] = {
  NSPAIR(_ZN3ccc8CC4x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y0E[];
extern void _ZN3ccc8CC4x14y03pqrEv();
extern void _ZN3ccc8CC4x14y03abcEv();
extern void _ZN3ccc8CC4x14y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y03pqrEv,_ZThn4_N3ccc8CC4x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y03pqrEv,_ZThn4_N3ccc8CC4x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y0E[];
Class_Descriptor cd__ZN3ccc8CC4x14y0E = {  "_ZN3ccc8CC4x14y0E", // class name
  bases__ZN3ccc8CC4x14y0E, 2,
  &(vtc__ZN3ccc8CC4x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y1  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x14y13efgEv
  ~CC4x14y1(); // tgen
  CC4x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y1E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y13abcEv");}
void  ccc::CC4x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y13pqrEv");}
void  ccc::CC4x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y13efgEv");}
ccc::CC4x14y1 ::~CC4x14y1(){ note_dtor("_ZN3ccc8CC4x14y1E", this);} // tgen
ccc::CC4x14y1 ::CC4x14y1(){ note_ctor("_ZN3ccc8CC4x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y1E, buf);
    ::ccc::CC4x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y1E);
    dp->::ccc::CC4x14y1::~CC4x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y1E(Test__ZN3ccc8CC4x14y1E, "_ZN3ccc8CC4x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y1C1Ev();
extern void _ZN3ccc8CC4x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y1E[] = {
  NSPAIR(_ZN3ccc8CC4x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y1E[];
extern void _ZN3ccc8CC4x14y13pqrEv();
extern void _ZN3ccc8CC4x14y13abcEv();
extern void _ZN3ccc8CC4x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y13pqrEv,_ZThn4_N3ccc8CC4x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y13pqrEv,_ZThn4_N3ccc8CC4x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y1E[];
Class_Descriptor cd__ZN3ccc8CC4x14y1E = {  "_ZN3ccc8CC4x14y1E", // class name
  bases__ZN3ccc8CC4x14y1E, 2,
  &(vtc__ZN3ccc8CC4x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y2  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y23pqrEv
  ~CC4x14y2(); // tgen
  CC4x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y2E) C1{ BC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y23efgEv");}
void  ccc::CC4x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y23abcEv");}
void  ccc::CC4x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y23pqrEv");}
ccc::CC4x14y2 ::~CC4x14y2(){ note_dtor("_ZN3ccc8CC4x14y2E", this);} // tgen
ccc::CC4x14y2 ::CC4x14y2(){ note_ctor("_ZN3ccc8CC4x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y2E, buf);
    ::ccc::CC4x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y2E);
    dp->::ccc::CC4x14y2::~CC4x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y2E(Test__ZN3ccc8CC4x14y2E, "_ZN3ccc8CC4x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y2C1Ev();
extern void _ZN3ccc8CC4x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y2E[] = {
  NSPAIR(_ZN3ccc8CC4x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y2E[];
extern void _ZN3ccc8CC4x14y23pqrEv();
extern void _ZN3ccc8CC4x14y23abcEv();
extern void _ZN3ccc8CC4x14y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y23pqrEv,_ZThn4_N3ccc8CC4x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y23pqrEv,_ZThn4_N3ccc8CC4x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y2E[];
Class_Descriptor cd__ZN3ccc8CC4x14y2E = {  "_ZN3ccc8CC4x14y2E", // class name
  bases__ZN3ccc8CC4x14y2E, 2,
  &(vtc__ZN3ccc8CC4x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y3  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x14y33abcEv
  ~CC4x14y3(); // tgen
  CC4x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y3E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y33efgEv");}
void  ccc::CC4x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y33pqrEv");}
void  ccc::CC4x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y33abcEv");}
ccc::CC4x14y3 ::~CC4x14y3(){ note_dtor("_ZN3ccc8CC4x14y3E", this);} // tgen
ccc::CC4x14y3 ::CC4x14y3(){ note_ctor("_ZN3ccc8CC4x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y3E, buf);
    ::ccc::CC4x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y3E);
    dp->::ccc::CC4x14y3::~CC4x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y3E(Test__ZN3ccc8CC4x14y3E, "_ZN3ccc8CC4x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y3C1Ev();
extern void _ZN3ccc8CC4x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y3E[] = {
  NSPAIR(_ZN3ccc8CC4x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y3E[];
extern void _ZN3ccc8CC4x14y33pqrEv();
extern void _ZN3ccc8CC4x14y33abcEv();
extern void _ZN3ccc8CC4x14y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y33pqrEv,_ZThn4_N3ccc8CC4x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y33pqrEv,_ZThn4_N3ccc8CC4x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y3E[];
Class_Descriptor cd__ZN3ccc8CC4x14y3E = {  "_ZN3ccc8CC4x14y3E", // class name
  bases__ZN3ccc8CC4x14y3E, 2,
  &(vtc__ZN3ccc8CC4x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y4  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC4x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y43efgEv
  ~CC4x14y4(); // tgen
  CC4x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y4E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y43pqrEv");}
void  ccc::CC4x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y43abcEv");}
void  ccc::CC4x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y43efgEv");}
ccc::CC4x14y4 ::~CC4x14y4(){ note_dtor("_ZN3ccc8CC4x14y4E", this);} // tgen
ccc::CC4x14y4 ::CC4x14y4(){ note_ctor("_ZN3ccc8CC4x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y4E, buf);
    ::ccc::CC4x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y4E);
    dp->::ccc::CC4x14y4::~CC4x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y4E(Test__ZN3ccc8CC4x14y4E, "_ZN3ccc8CC4x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y4C1Ev();
extern void _ZN3ccc8CC4x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y4E[] = {
  NSPAIR(_ZN3ccc8CC4x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y4E[];
extern void _ZN3ccc8CC4x14y43pqrEv();
extern void _ZN3ccc8CC4x14y43abcEv();
extern void _ZN3ccc8CC4x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y43pqrEv,_ZThn4_N3ccc8CC4x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y43pqrEv,_ZThn4_N3ccc8CC4x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y4E[];
Class_Descriptor cd__ZN3ccc8CC4x14y4E = {  "_ZN3ccc8CC4x14y4E", // class name
  bases__ZN3ccc8CC4x14y4E, 2,
  &(vtc__ZN3ccc8CC4x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y5  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC4x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y53abcEv
  ~CC4x14y5(); // tgen
  CC4x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y5E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y53pqrEv");}
void  ccc::CC4x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y53efgEv");}
void  ccc::CC4x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y53abcEv");}
ccc::CC4x14y5 ::~CC4x14y5(){ note_dtor("_ZN3ccc8CC4x14y5E", this);} // tgen
ccc::CC4x14y5 ::CC4x14y5(){ note_ctor("_ZN3ccc8CC4x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y5E, buf);
    ::ccc::CC4x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y5E);
    dp->::ccc::CC4x14y5::~CC4x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y5E(Test__ZN3ccc8CC4x14y5E, "_ZN3ccc8CC4x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y5C1Ev();
extern void _ZN3ccc8CC4x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y5E[] = {
  NSPAIR(_ZN3ccc8CC4x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y5E[];
extern void _ZN3ccc8CC4x14y53pqrEv();
extern void _ZN3ccc8CC4x14y53abcEv();
extern void _ZN3ccc8CC4x14y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y53pqrEv,_ZThn4_N3ccc8CC4x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y53pqrEv,_ZThn4_N3ccc8CC4x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y5E[];
Class_Descriptor cd__ZN3ccc8CC4x14y5E = {  "_ZN3ccc8CC4x14y5E", // class name
  bases__ZN3ccc8CC4x14y5E, 2,
  &(vtc__ZN3ccc8CC4x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y6  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x14y63efgEv
  ~CC4x14y6(); // tgen
  CC4x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y6E) C1{ BC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y63abcEv");}
void  ccc::CC4x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y63efgEv");}
ccc::CC4x14y6 ::~CC4x14y6(){ note_dtor("_ZN3ccc8CC4x14y6E", this);} // tgen
ccc::CC4x14y6 ::CC4x14y6(){ note_ctor("_ZN3ccc8CC4x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y6E, buf);
    ::ccc::CC4x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y6E);
    dp->::ccc::CC4x14y6::~CC4x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y6E(Test__ZN3ccc8CC4x14y6E, "_ZN3ccc8CC4x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y6C1Ev();
extern void _ZN3ccc8CC4x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y6E[] = {
  NSPAIR(_ZN3ccc8CC4x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x14y63abcEv();
extern void _ZN3ccc8CC4x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y6E[];
Class_Descriptor cd__ZN3ccc8CC4x14y6E = {  "_ZN3ccc8CC4x14y6E", // class name
  bases__ZN3ccc8CC4x14y6E, 2,
  &(vtc__ZN3ccc8CC4x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y7  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC4x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y73pqrEv
  ~CC4x14y7(); // tgen
  CC4x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y7E) C1{ BC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y73abcEv");}
void  ccc::CC4x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y73pqrEv");}
ccc::CC4x14y7 ::~CC4x14y7(){ note_dtor("_ZN3ccc8CC4x14y7E", this);} // tgen
ccc::CC4x14y7 ::CC4x14y7(){ note_ctor("_ZN3ccc8CC4x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y7E, buf);
    ::ccc::CC4x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y7E);
    dp->::ccc::CC4x14y7::~CC4x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y7E(Test__ZN3ccc8CC4x14y7E, "_ZN3ccc8CC4x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y7C1Ev();
extern void _ZN3ccc8CC4x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y7E[] = {
  NSPAIR(_ZN3ccc8CC4x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y7E[];
extern void _ZN3ccc8CC4x14y73pqrEv();
extern void _ZN3ccc8CC4x14y73abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y73pqrEv,_ZThn4_N3ccc8CC4x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y73pqrEv,_ZThn4_N3ccc8CC4x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y7E[];
Class_Descriptor cd__ZN3ccc8CC4x14y7E = {  "_ZN3ccc8CC4x14y7E", // class name
  bases__ZN3ccc8CC4x14y7E, 2,
  &(vtc__ZN3ccc8CC4x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y8  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x14y83abcEv
  ~CC4x14y8(); // tgen
  CC4x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y8E) C1{ BC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y83efgEv");}
void  ccc::CC4x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x14y83abcEv");}
ccc::CC4x14y8 ::~CC4x14y8(){ note_dtor("_ZN3ccc8CC4x14y8E", this);} // tgen
ccc::CC4x14y8 ::CC4x14y8(){ note_ctor("_ZN3ccc8CC4x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y8E, buf);
    ::ccc::CC4x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y8E);
    dp->::ccc::CC4x14y8::~CC4x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y8E(Test__ZN3ccc8CC4x14y8E, "_ZN3ccc8CC4x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y8C1Ev();
extern void _ZN3ccc8CC4x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y8E[] = {
  NSPAIR(_ZN3ccc8CC4x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x14y83abcEv();
extern void _ZN3ccc8CC4x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y8E[];
Class_Descriptor cd__ZN3ccc8CC4x14y8E = {  "_ZN3ccc8CC4x14y8E", // class name
  bases__ZN3ccc8CC4x14y8E, 2,
  &(vtc__ZN3ccc8CC4x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y9  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC4x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x14y93pqrEv
  ~CC4x14y9(); // tgen
  CC4x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x14y9E) C1{ BC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x14y93efgEv");}
void  ccc::CC4x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x14y93pqrEv");}
ccc::CC4x14y9 ::~CC4x14y9(){ note_dtor("_ZN3ccc8CC4x14y9E", this);} // tgen
ccc::CC4x14y9 ::CC4x14y9(){ note_ctor("_ZN3ccc8CC4x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC4x14y9E, buf);
    ::ccc::CC4x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC4x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x14y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8CC4x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x14y9E);
    dp->::ccc::CC4x14y9::~CC4x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x14y9E(Test__ZN3ccc8CC4x14y9E, "_ZN3ccc8CC4x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC4x14y9C1Ev();
extern void _ZN3ccc8CC4x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x14y9E[] = {
  NSPAIR(_ZN3ccc8CC4x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC4x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y9E[];
extern void _ZN3ccc8CC4x14y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC4x14y93pqrEv,_ZThn4_N3ccc8CC4x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC4x14y93pqrEv,_ZThn4_N3ccc8CC4x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x14y9E[];
Class_Descriptor cd__ZN3ccc8CC4x14y9E = {  "_ZN3ccc8CC4x14y9E", // class name
  bases__ZN3ccc8CC4x14y9E, 2,
  &(vtc__ZN3ccc8CC4x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC4x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y10  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x14y103abcEv
  ~CC4x14y10(); // tgen
  CC4x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y10E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y103pqrEv");}
void  ccc::CC4x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x14y103abcEv");}
ccc::CC4x14y10 ::~CC4x14y10(){ note_dtor("_ZN3ccc9CC4x14y10E", this);} // tgen
ccc::CC4x14y10 ::CC4x14y10(){ note_ctor("_ZN3ccc9CC4x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y10E, buf);
    ::ccc::CC4x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y10E);
    dp->::ccc::CC4x14y10::~CC4x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y10E(Test__ZN3ccc9CC4x14y10E, "_ZN3ccc9CC4x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y10C1Ev();
extern void _ZN3ccc9CC4x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y10E[] = {
  NSPAIR(_ZN3ccc9CC4x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y10E[];
extern void _ZN3ccc9CC4x14y103pqrEv();
extern void _ZN3ccc9CC4x14y103abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y103pqrEv,_ZThn4_N3ccc9CC4x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x14y103pqrEv,_ZThn4_N3ccc9CC4x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y10E[];
Class_Descriptor cd__ZN3ccc9CC4x14y10E = {  "_ZN3ccc9CC4x14y10E", // class name
  bases__ZN3ccc9CC4x14y10E, 2,
  &(vtc__ZN3ccc9CC4x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y11  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x14y113efgEv
  ~CC4x14y11(); // tgen
  CC4x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y11E) C1{ BC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC4x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y113pqrEv");}
void  ccc::CC4x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x14y113efgEv");}
ccc::CC4x14y11 ::~CC4x14y11(){ note_dtor("_ZN3ccc9CC4x14y11E", this);} // tgen
ccc::CC4x14y11 ::CC4x14y11(){ note_ctor("_ZN3ccc9CC4x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y11E, buf);
    ::ccc::CC4x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y11E);
    dp->::ccc::CC4x14y11::~CC4x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y11E(Test__ZN3ccc9CC4x14y11E, "_ZN3ccc9CC4x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y11C1Ev();
extern void _ZN3ccc9CC4x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y11E[] = {
  NSPAIR(_ZN3ccc9CC4x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y11E[];
extern void _ZN3ccc9CC4x14y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y113pqrEv,_ZThn4_N3ccc9CC4x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x14y113pqrEv,_ZThn4_N3ccc9CC4x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y11E[];
Class_Descriptor cd__ZN3ccc9CC4x14y11E = {  "_ZN3ccc9CC4x14y11E", // class name
  bases__ZN3ccc9CC4x14y11E, 2,
  &(vtc__ZN3ccc9CC4x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y12  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC4x14y123abcEv
  ~CC4x14y12(); // tgen
  CC4x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y12E) C1{ BC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x14y123abcEv");}
ccc::CC4x14y12 ::~CC4x14y12(){ note_dtor("_ZN3ccc9CC4x14y12E", this);} // tgen
ccc::CC4x14y12 ::CC4x14y12(){ note_ctor("_ZN3ccc9CC4x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y12E, buf);
    ::ccc::CC4x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y12E);
    dp->::ccc::CC4x14y12::~CC4x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y12E(Test__ZN3ccc9CC4x14y12E, "_ZN3ccc9CC4x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y12C1Ev();
extern void _ZN3ccc9CC4x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y12E[] = {
  NSPAIR(_ZN3ccc9CC4x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x14y123abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y12E[];
Class_Descriptor cd__ZN3ccc9CC4x14y12E = {  "_ZN3ccc9CC4x14y12E", // class name
  bases__ZN3ccc9CC4x14y12E, 2,
  &(vtc__ZN3ccc9CC4x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y13  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC4x14y133efgEv
  ~CC4x14y13(); // tgen
  CC4x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y13E) C1{ BC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC4x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x14y133efgEv");}
ccc::CC4x14y13 ::~CC4x14y13(){ note_dtor("_ZN3ccc9CC4x14y13E", this);} // tgen
ccc::CC4x14y13 ::CC4x14y13(){ note_ctor("_ZN3ccc9CC4x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y13E, buf);
    ::ccc::CC4x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y13E);
    dp->::ccc::CC4x14y13::~CC4x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y13E(Test__ZN3ccc9CC4x14y13E, "_ZN3ccc9CC4x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y13C1Ev();
extern void _ZN3ccc9CC4x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y13E[] = {
  NSPAIR(_ZN3ccc9CC4x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y13E[];
Class_Descriptor cd__ZN3ccc9CC4x14y13E = {  "_ZN3ccc9CC4x14y13E", // class name
  bases__ZN3ccc9CC4x14y13E, 2,
  &(vtc__ZN3ccc9CC4x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y14  : ::ccc::AA4 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC4x14y143pqrEv
  ~CC4x14y14(); // tgen
  CC4x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y14E) C1{ BC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC4x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x14y143pqrEv");}
ccc::CC4x14y14 ::~CC4x14y14(){ note_dtor("_ZN3ccc9CC4x14y14E", this);} // tgen
ccc::CC4x14y14 ::CC4x14y14(){ note_ctor("_ZN3ccc9CC4x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y14E, buf);
    ::ccc::CC4x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y14E);
    dp->::ccc::CC4x14y14::~CC4x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y14E(Test__ZN3ccc9CC4x14y14E, "_ZN3ccc9CC4x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y14C1Ev();
extern void _ZN3ccc9CC4x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y14E[] = {
  NSPAIR(_ZN3ccc9CC4x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y14E[];
extern void _ZN3ccc9CC4x14y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC4x14y143pqrEv,_ZThn4_N3ccc9CC4x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC4x14y143pqrEv,_ZThn4_N3ccc9CC4x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y14E[];
Class_Descriptor cd__ZN3ccc9CC4x14y14E = {  "_ZN3ccc9CC4x14y14E", // class name
  bases__ZN3ccc9CC4x14y14E, 2,
  &(vtc__ZN3ccc9CC4x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x14y15  : ::ccc::AA4 , ::ccc::BB14 {
  ~CC4x14y15(); // tgen
  CC4x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x14y15E) C1{ BC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC4x14y15 ::~CC4x14y15(){ note_dtor("_ZN3ccc9CC4x14y15E", this);} // tgen
ccc::CC4x14y15 ::CC4x14y15(){ note_ctor("_ZN3ccc9CC4x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC4x14y15E, buf);
    ::ccc::CC4x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC4x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x14y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC4x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x14y15E);
    dp->::ccc::CC4x14y15::~CC4x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x14y15E(Test__ZN3ccc9CC4x14y15E, "_ZN3ccc9CC4x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC4x14y15C1Ev();
extern void _ZN3ccc9CC4x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x14y15E[] = {
  NSPAIR(_ZN3ccc9CC4x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC4x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x14y15E[];
Class_Descriptor cd__ZN3ccc9CC4x14y15E = {  "_ZN3ccc9CC4x14y15E", // class name
  bases__ZN3ccc9CC4x14y15E, 2,
  &(vtc__ZN3ccc9CC4x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC4x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y0  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y03pqrEv
  ~CC4x15y0(); // tgen
  CC4x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y0E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y03abcEv");}
void  ccc::CC4x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y03efgEv");}
void  ccc::CC4x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y03pqrEv");}
ccc::CC4x15y0 ::~CC4x15y0(){ note_dtor("_ZN3ccc8CC4x15y0E", this);} // tgen
ccc::CC4x15y0 ::CC4x15y0(){ note_ctor("_ZN3ccc8CC4x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y0E, buf);
    ::ccc::CC4x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y0E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y0E);
    dp->::ccc::CC4x15y0::~CC4x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y0E(Test__ZN3ccc8CC4x15y0E, "_ZN3ccc8CC4x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y0C1Ev();
extern void _ZN3ccc8CC4x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y0E[] = {
  NSPAIR(_ZN3ccc8CC4x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y0E[];
extern void _ZN3ccc8CC4x15y03pqrEv();
extern void _ZN3ccc8CC4x15y03abcEv();
extern void _ZN3ccc8CC4x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y0E[];
Class_Descriptor cd__ZN3ccc8CC4x15y0E = {  "_ZN3ccc8CC4x15y0E", // class name
  bases__ZN3ccc8CC4x15y0E, 2,
  &(vtc__ZN3ccc8CC4x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y1  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x15y13efgEv
  ~CC4x15y1(); // tgen
  CC4x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y1E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y13abcEv");}
void  ccc::CC4x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y13pqrEv");}
void  ccc::CC4x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y13efgEv");}
ccc::CC4x15y1 ::~CC4x15y1(){ note_dtor("_ZN3ccc8CC4x15y1E", this);} // tgen
ccc::CC4x15y1 ::CC4x15y1(){ note_ctor("_ZN3ccc8CC4x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y1E, buf);
    ::ccc::CC4x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y1E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y1E);
    dp->::ccc::CC4x15y1::~CC4x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y1E(Test__ZN3ccc8CC4x15y1E, "_ZN3ccc8CC4x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y1C1Ev();
extern void _ZN3ccc8CC4x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y1E[] = {
  NSPAIR(_ZN3ccc8CC4x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y1E[];
extern void _ZN3ccc8CC4x15y13pqrEv();
extern void _ZN3ccc8CC4x15y13abcEv();
extern void _ZN3ccc8CC4x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y1E[];
Class_Descriptor cd__ZN3ccc8CC4x15y1E = {  "_ZN3ccc8CC4x15y1E", // class name
  bases__ZN3ccc8CC4x15y1E, 2,
  &(vtc__ZN3ccc8CC4x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y2  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y23pqrEv
  ~CC4x15y2(); // tgen
  CC4x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y2E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y23efgEv");}
void  ccc::CC4x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y23abcEv");}
void  ccc::CC4x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y23pqrEv");}
ccc::CC4x15y2 ::~CC4x15y2(){ note_dtor("_ZN3ccc8CC4x15y2E", this);} // tgen
ccc::CC4x15y2 ::CC4x15y2(){ note_ctor("_ZN3ccc8CC4x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y2E, buf);
    ::ccc::CC4x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y2E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y2E);
    dp->::ccc::CC4x15y2::~CC4x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y2E(Test__ZN3ccc8CC4x15y2E, "_ZN3ccc8CC4x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y2C1Ev();
extern void _ZN3ccc8CC4x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y2E[] = {
  NSPAIR(_ZN3ccc8CC4x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y2E[];
extern void _ZN3ccc8CC4x15y23pqrEv();
extern void _ZN3ccc8CC4x15y23abcEv();
extern void _ZN3ccc8CC4x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y2E[];
Class_Descriptor cd__ZN3ccc8CC4x15y2E = {  "_ZN3ccc8CC4x15y2E", // class name
  bases__ZN3ccc8CC4x15y2E, 2,
  &(vtc__ZN3ccc8CC4x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y3  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x15y33abcEv
  ~CC4x15y3(); // tgen
  CC4x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y3E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y33efgEv");}
void  ccc::CC4x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y33pqrEv");}
void  ccc::CC4x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y33abcEv");}
ccc::CC4x15y3 ::~CC4x15y3(){ note_dtor("_ZN3ccc8CC4x15y3E", this);} // tgen
ccc::CC4x15y3 ::CC4x15y3(){ note_ctor("_ZN3ccc8CC4x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y3E, buf);
    ::ccc::CC4x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y3E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y3E);
    dp->::ccc::CC4x15y3::~CC4x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y3E(Test__ZN3ccc8CC4x15y3E, "_ZN3ccc8CC4x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y3C1Ev();
extern void _ZN3ccc8CC4x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y3E[] = {
  NSPAIR(_ZN3ccc8CC4x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y3E[];
extern void _ZN3ccc8CC4x15y33pqrEv();
extern void _ZN3ccc8CC4x15y33abcEv();
extern void _ZN3ccc8CC4x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y3E[];
Class_Descriptor cd__ZN3ccc8CC4x15y3E = {  "_ZN3ccc8CC4x15y3E", // class name
  bases__ZN3ccc8CC4x15y3E, 2,
  &(vtc__ZN3ccc8CC4x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y4  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC4x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC4x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y43efgEv
  ~CC4x15y4(); // tgen
  CC4x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y4E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y43pqrEv");}
void  ccc::CC4x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y43abcEv");}
void  ccc::CC4x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y43efgEv");}
ccc::CC4x15y4 ::~CC4x15y4(){ note_dtor("_ZN3ccc8CC4x15y4E", this);} // tgen
ccc::CC4x15y4 ::CC4x15y4(){ note_ctor("_ZN3ccc8CC4x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y4E, buf);
    ::ccc::CC4x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y4E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y4E);
    dp->::ccc::CC4x15y4::~CC4x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y4E(Test__ZN3ccc8CC4x15y4E, "_ZN3ccc8CC4x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y4C1Ev();
extern void _ZN3ccc8CC4x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y4E[] = {
  NSPAIR(_ZN3ccc8CC4x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y4E[];
extern void _ZN3ccc8CC4x15y43pqrEv();
extern void _ZN3ccc8CC4x15y43abcEv();
extern void _ZN3ccc8CC4x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y4E[];
Class_Descriptor cd__ZN3ccc8CC4x15y4E = {  "_ZN3ccc8CC4x15y4E", // class name
  bases__ZN3ccc8CC4x15y4E, 2,
  &(vtc__ZN3ccc8CC4x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y5  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC4x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC4x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y53abcEv
  ~CC4x15y5(); // tgen
  CC4x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y5E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC4x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y53pqrEv");}
void  ccc::CC4x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y53efgEv");}
void  ccc::CC4x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y53abcEv");}
ccc::CC4x15y5 ::~CC4x15y5(){ note_dtor("_ZN3ccc8CC4x15y5E", this);} // tgen
ccc::CC4x15y5 ::CC4x15y5(){ note_ctor("_ZN3ccc8CC4x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y5E, buf);
    ::ccc::CC4x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y5E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y5E);
    dp->::ccc::CC4x15y5::~CC4x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y5E(Test__ZN3ccc8CC4x15y5E, "_ZN3ccc8CC4x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y5C1Ev();
extern void _ZN3ccc8CC4x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y5E[] = {
  NSPAIR(_ZN3ccc8CC4x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y5E[];
extern void _ZN3ccc8CC4x15y53pqrEv();
extern void _ZN3ccc8CC4x15y53abcEv();
extern void _ZN3ccc8CC4x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y5E[];
Class_Descriptor cd__ZN3ccc8CC4x15y5E = {  "_ZN3ccc8CC4x15y5E", // class name
  bases__ZN3ccc8CC4x15y5E, 2,
  &(vtc__ZN3ccc8CC4x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y6  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC4x15y63efgEv
  ~CC4x15y6(); // tgen
  CC4x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y6E) C1{ BC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y63abcEv");}
void  ccc::CC4x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y63efgEv");}
ccc::CC4x15y6 ::~CC4x15y6(){ note_dtor("_ZN3ccc8CC4x15y6E", this);} // tgen
ccc::CC4x15y6 ::CC4x15y6(){ note_ctor("_ZN3ccc8CC4x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y6E, buf);
    ::ccc::CC4x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y6E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y6E);
    dp->::ccc::CC4x15y6::~CC4x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y6E(Test__ZN3ccc8CC4x15y6E, "_ZN3ccc8CC4x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y6C1Ev();
extern void _ZN3ccc8CC4x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y6E[] = {
  NSPAIR(_ZN3ccc8CC4x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y6E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x15y63abcEv();
extern void _ZN3ccc8CC4x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y6E[];
Class_Descriptor cd__ZN3ccc8CC4x15y6E = {  "_ZN3ccc8CC4x15y6E", // class name
  bases__ZN3ccc8CC4x15y6E, 2,
  &(vtc__ZN3ccc8CC4x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y7  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC4x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y73pqrEv
  ~CC4x15y7(); // tgen
  CC4x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y7E) C1{ BC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y73abcEv");}
void  ccc::CC4x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y73pqrEv");}
ccc::CC4x15y7 ::~CC4x15y7(){ note_dtor("_ZN3ccc8CC4x15y7E", this);} // tgen
ccc::CC4x15y7 ::CC4x15y7(){ note_ctor("_ZN3ccc8CC4x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y7E, buf);
    ::ccc::CC4x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y7E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y7E);
    dp->::ccc::CC4x15y7::~CC4x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y7E(Test__ZN3ccc8CC4x15y7E, "_ZN3ccc8CC4x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y7C1Ev();
extern void _ZN3ccc8CC4x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y7E[] = {
  NSPAIR(_ZN3ccc8CC4x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y7E[];
extern void _ZN3ccc8CC4x15y73pqrEv();
extern void _ZN3ccc8CC4x15y73abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y7E[];
Class_Descriptor cd__ZN3ccc8CC4x15y7E = {  "_ZN3ccc8CC4x15y7E", // class name
  bases__ZN3ccc8CC4x15y7E, 2,
  &(vtc__ZN3ccc8CC4x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y8  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC4x15y83abcEv
  ~CC4x15y8(); // tgen
  CC4x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y8E) C1{ BC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y83efgEv");}
void  ccc::CC4x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC4x15y83abcEv");}
ccc::CC4x15y8 ::~CC4x15y8(){ note_dtor("_ZN3ccc8CC4x15y8E", this);} // tgen
ccc::CC4x15y8 ::CC4x15y8(){ note_ctor("_ZN3ccc8CC4x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y8E, buf);
    ::ccc::CC4x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y8E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y8E);
    dp->::ccc::CC4x15y8::~CC4x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y8E(Test__ZN3ccc8CC4x15y8E, "_ZN3ccc8CC4x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y8C1Ev();
extern void _ZN3ccc8CC4x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y8E[] = {
  NSPAIR(_ZN3ccc8CC4x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y8E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc8CC4x15y83abcEv();
extern void _ZN3ccc8CC4x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y8E[];
Class_Descriptor cd__ZN3ccc8CC4x15y8E = {  "_ZN3ccc8CC4x15y8E", // class name
  bases__ZN3ccc8CC4x15y8E, 2,
  &(vtc__ZN3ccc8CC4x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y9  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC4x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC4x15y93pqrEv
  ~CC4x15y9(); // tgen
  CC4x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC4x15y9E) C1{ BC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC4x15y93efgEv");}
void  ccc::CC4x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC4x15y93pqrEv");}
ccc::CC4x15y9 ::~CC4x15y9(){ note_dtor("_ZN3ccc8CC4x15y9E", this);} // tgen
ccc::CC4x15y9 ::CC4x15y9(){ note_ctor("_ZN3ccc8CC4x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC4x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC4x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC4x15y9E, buf);
    ::ccc::CC4x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC4x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC4x15y9E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc8CC4x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC4x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC4x15y9E);
    dp->::ccc::CC4x15y9::~CC4x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC4x15y9E(Test__ZN3ccc8CC4x15y9E, "_ZN3ccc8CC4x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC4x15y9C1Ev();
extern void _ZN3ccc8CC4x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC4x15y9E[] = {
  NSPAIR(_ZN3ccc8CC4x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC4x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC4x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y9E[];
extern void _ZN3ccc8CC4x15y93pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc8CC4x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC4x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC4x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC4x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC4x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC4x15y9E[];
Class_Descriptor cd__ZN3ccc8CC4x15y9E = {  "_ZN3ccc8CC4x15y9E", // class name
  bases__ZN3ccc8CC4x15y9E, 2,
  &(vtc__ZN3ccc8CC4x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC4x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC4x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y10  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC4x15y103abcEv
  ~CC4x15y10(); // tgen
  CC4x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y10E) C1{ BC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y103pqrEv");}
void  ccc::CC4x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x15y103abcEv");}
ccc::CC4x15y10 ::~CC4x15y10(){ note_dtor("_ZN3ccc9CC4x15y10E", this);} // tgen
ccc::CC4x15y10 ::CC4x15y10(){ note_ctor("_ZN3ccc9CC4x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y10E, buf);
    ::ccc::CC4x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y10E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y10E);
    dp->::ccc::CC4x15y10::~CC4x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y10E(Test__ZN3ccc9CC4x15y10E, "_ZN3ccc9CC4x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y10C1Ev();
extern void _ZN3ccc9CC4x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y10E[] = {
  NSPAIR(_ZN3ccc9CC4x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y10E[];
extern void _ZN3ccc9CC4x15y103pqrEv();
extern void _ZN3ccc9CC4x15y103abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y10E[];
Class_Descriptor cd__ZN3ccc9CC4x15y10E = {  "_ZN3ccc9CC4x15y10E", // class name
  bases__ZN3ccc9CC4x15y10E, 2,
  &(vtc__ZN3ccc9CC4x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y11  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC4x15y113efgEv
  ~CC4x15y11(); // tgen
  CC4x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y11E) C1{ BC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC4x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y113pqrEv");}
void  ccc::CC4x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x15y113efgEv");}
ccc::CC4x15y11 ::~CC4x15y11(){ note_dtor("_ZN3ccc9CC4x15y11E", this);} // tgen
ccc::CC4x15y11 ::CC4x15y11(){ note_ctor("_ZN3ccc9CC4x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y11E, buf);
    ::ccc::CC4x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y11E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y11E);
    dp->::ccc::CC4x15y11::~CC4x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y11E(Test__ZN3ccc9CC4x15y11E, "_ZN3ccc9CC4x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y11C1Ev();
extern void _ZN3ccc9CC4x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y11E[] = {
  NSPAIR(_ZN3ccc9CC4x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y11E[];
extern void _ZN3ccc9CC4x15y113pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y11E[];
Class_Descriptor cd__ZN3ccc9CC4x15y11E = {  "_ZN3ccc9CC4x15y11E", // class name
  bases__ZN3ccc9CC4x15y11E, 2,
  &(vtc__ZN3ccc9CC4x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y12  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC4x15y123abcEv
  ~CC4x15y12(); // tgen
  CC4x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y12E) C1{ BC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC4x15y123abcEv");}
ccc::CC4x15y12 ::~CC4x15y12(){ note_dtor("_ZN3ccc9CC4x15y12E", this);} // tgen
ccc::CC4x15y12 ::CC4x15y12(){ note_ctor("_ZN3ccc9CC4x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y12E, buf);
    ::ccc::CC4x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y12E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y12E);
    dp->::ccc::CC4x15y12::~CC4x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y12E(Test__ZN3ccc9CC4x15y12E, "_ZN3ccc9CC4x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y12C1Ev();
extern void _ZN3ccc9CC4x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y12E[] = {
  NSPAIR(_ZN3ccc9CC4x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y12E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc9CC4x15y123abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y12E[];
Class_Descriptor cd__ZN3ccc9CC4x15y12E = {  "_ZN3ccc9CC4x15y12E", // class name
  bases__ZN3ccc9CC4x15y12E, 2,
  &(vtc__ZN3ccc9CC4x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y13  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC4x15y133efgEv
  ~CC4x15y13(); // tgen
  CC4x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y13E) C1{ BC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC4x15y133efgEv");}
ccc::CC4x15y13 ::~CC4x15y13(){ note_dtor("_ZN3ccc9CC4x15y13E", this);} // tgen
ccc::CC4x15y13 ::CC4x15y13(){ note_ctor("_ZN3ccc9CC4x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y13E, buf);
    ::ccc::CC4x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y13E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y13E);
    dp->::ccc::CC4x15y13::~CC4x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y13E(Test__ZN3ccc9CC4x15y13E, "_ZN3ccc9CC4x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y13C1Ev();
extern void _ZN3ccc9CC4x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y13E[] = {
  NSPAIR(_ZN3ccc9CC4x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y13E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc9CC4x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y13E[];
Class_Descriptor cd__ZN3ccc9CC4x15y13E = {  "_ZN3ccc9CC4x15y13E", // class name
  bases__ZN3ccc9CC4x15y13E, 2,
  &(vtc__ZN3ccc9CC4x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y14  : ::ccc::AA4 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC4x15y143pqrEv
  ~CC4x15y14(); // tgen
  CC4x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y14E) C1{ BC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC4x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC4x15y143pqrEv");}
ccc::CC4x15y14 ::~CC4x15y14(){ note_dtor("_ZN3ccc9CC4x15y14E", this);} // tgen
ccc::CC4x15y14 ::CC4x15y14(){ note_ctor("_ZN3ccc9CC4x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y14E, buf);
    ::ccc::CC4x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y14E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y14E);
    dp->::ccc::CC4x15y14::~CC4x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y14E(Test__ZN3ccc9CC4x15y14E, "_ZN3ccc9CC4x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y14C1Ev();
extern void _ZN3ccc9CC4x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y14E[] = {
  NSPAIR(_ZN3ccc9CC4x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y14E[];
extern void _ZN3ccc9CC4x15y143pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC4x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y14E[];
Class_Descriptor cd__ZN3ccc9CC4x15y14E = {  "_ZN3ccc9CC4x15y14E", // class name
  bases__ZN3ccc9CC4x15y14E, 2,
  &(vtc__ZN3ccc9CC4x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC4x15y15  : ::ccc::AA4 , ::ccc::BB15 {
  ~CC4x15y15(); // tgen
  CC4x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC4x15y15E) C1{ BC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC4x15y15 ::~CC4x15y15(){ note_dtor("_ZN3ccc9CC4x15y15E", this);} // tgen
ccc::CC4x15y15 ::CC4x15y15(){ note_ctor("_ZN3ccc9CC4x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC4x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC4x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC4x15y15E, buf);
    ::ccc::CC4x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC4x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC4x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC4x15y15E)");
    check_base_class_offset(lv, (::ccc::AA4*), 0, "_ZN3ccc9CC4x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC4x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC4x15y15E);
    dp->::ccc::CC4x15y15::~CC4x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC4x15y15E(Test__ZN3ccc9CC4x15y15E, "_ZN3ccc9CC4x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC4x15y15C1Ev();
extern void _ZN3ccc9CC4x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC4x15y15E[] = {
  NSPAIR(_ZN3ccc9CC4x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC4x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA4E;
extern VTBL_ENTRY _ZTIN3ccc3AA4E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA4E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC4x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y15E[];
extern void _ZN3ccc3AA43pqrEv();
extern void _ZN3ccc3AA43abcEv();
extern void _ZN3ccc3AA43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC4x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC4x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC4x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC4x15y15E[];
Class_Descriptor cd__ZN3ccc9CC4x15y15E = {  "_ZN3ccc9CC4x15y15E", // class name
  bases__ZN3ccc9CC4x15y15E, 2,
  &(vtc__ZN3ccc9CC4x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC4x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC4x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y0  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y03pqrEv
  ~CC5x0y0(); // tgen
  CC5x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y0E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y03abcEv");}
void  ccc::CC5x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y03efgEv");}
void  ccc::CC5x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y03pqrEv");}
ccc::CC5x0y0 ::~CC5x0y0(){ note_dtor("_ZN3ccc7CC5x0y0E", this);} // tgen
ccc::CC5x0y0 ::CC5x0y0(){ note_ctor("_ZN3ccc7CC5x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y0E, buf);
    ::ccc::CC5x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y0E);
    dp->::ccc::CC5x0y0::~CC5x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y0E(Test__ZN3ccc7CC5x0y0E, "_ZN3ccc7CC5x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y0C1Ev();
extern void _ZN3ccc7CC5x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y0E[] = {
  NSPAIR(_ZN3ccc7CC5x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y0E[];
extern void _ZN3ccc7CC5x0y03pqrEv();
extern void _ZN3ccc7CC5x0y03efgEv();
extern void _ZN3ccc7CC5x0y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03abcEv,_ZThn4_N3ccc7CC5x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03efgEv,_ZThn4_N3ccc7CC5x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y03pqrEv,_ZThn4_N3ccc7CC5x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y03abcEv,_ZThn4_N3ccc7CC5x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y03efgEv,_ZThn4_N3ccc7CC5x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y03pqrEv,_ZThn4_N3ccc7CC5x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y0E[];
Class_Descriptor cd__ZN3ccc7CC5x0y0E = {  "_ZN3ccc7CC5x0y0E", // class name
  bases__ZN3ccc7CC5x0y0E, 2,
  &(vtc__ZN3ccc7CC5x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y1  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x0y13efgEv
  ~CC5x0y1(); // tgen
  CC5x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y1E) C1{ BC2{ v2 v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y13abcEv");}
void  ccc::CC5x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y13pqrEv");}
void  ccc::CC5x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y13efgEv");}
ccc::CC5x0y1 ::~CC5x0y1(){ note_dtor("_ZN3ccc7CC5x0y1E", this);} // tgen
ccc::CC5x0y1 ::CC5x0y1(){ note_ctor("_ZN3ccc7CC5x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y1E, buf);
    ::ccc::CC5x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y1E);
    dp->::ccc::CC5x0y1::~CC5x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y1E(Test__ZN3ccc7CC5x0y1E, "_ZN3ccc7CC5x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y1C1Ev();
extern void _ZN3ccc7CC5x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y1E[] = {
  NSPAIR(_ZN3ccc7CC5x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y1E[];
extern void _ZN3ccc7CC5x0y13pqrEv();
extern void _ZN3ccc7CC5x0y13efgEv();
extern void _ZN3ccc7CC5x0y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13abcEv,_ZThn4_N3ccc7CC5x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13efgEv,_ZThn4_N3ccc7CC5x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y13pqrEv,_ZThn4_N3ccc7CC5x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y13abcEv,_ZThn4_N3ccc7CC5x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y13efgEv,_ZThn4_N3ccc7CC5x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y13pqrEv,_ZThn4_N3ccc7CC5x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y1E[];
Class_Descriptor cd__ZN3ccc7CC5x0y1E = {  "_ZN3ccc7CC5x0y1E", // class name
  bases__ZN3ccc7CC5x0y1E, 2,
  &(vtc__ZN3ccc7CC5x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y2  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y23pqrEv
  ~CC5x0y2(); // tgen
  CC5x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y2E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y23efgEv");}
void  ccc::CC5x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y23abcEv");}
void  ccc::CC5x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y23pqrEv");}
ccc::CC5x0y2 ::~CC5x0y2(){ note_dtor("_ZN3ccc7CC5x0y2E", this);} // tgen
ccc::CC5x0y2 ::CC5x0y2(){ note_ctor("_ZN3ccc7CC5x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y2E, buf);
    ::ccc::CC5x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y2E);
    dp->::ccc::CC5x0y2::~CC5x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y2E(Test__ZN3ccc7CC5x0y2E, "_ZN3ccc7CC5x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y2C1Ev();
extern void _ZN3ccc7CC5x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y2E[] = {
  NSPAIR(_ZN3ccc7CC5x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y2E[];
extern void _ZN3ccc7CC5x0y23pqrEv();
extern void _ZN3ccc7CC5x0y23efgEv();
extern void _ZN3ccc7CC5x0y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23abcEv,_ZThn4_N3ccc7CC5x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23efgEv,_ZThn4_N3ccc7CC5x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y23pqrEv,_ZThn4_N3ccc7CC5x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y23abcEv,_ZThn4_N3ccc7CC5x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y23efgEv,_ZThn4_N3ccc7CC5x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y23pqrEv,_ZThn4_N3ccc7CC5x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y2E[];
Class_Descriptor cd__ZN3ccc7CC5x0y2E = {  "_ZN3ccc7CC5x0y2E", // class name
  bases__ZN3ccc7CC5x0y2E, 2,
  &(vtc__ZN3ccc7CC5x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y3  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x0y33abcEv
  ~CC5x0y3(); // tgen
  CC5x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y3E) C1{ BC2{ v2 v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y33efgEv");}
void  ccc::CC5x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y33pqrEv");}
void  ccc::CC5x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y33abcEv");}
ccc::CC5x0y3 ::~CC5x0y3(){ note_dtor("_ZN3ccc7CC5x0y3E", this);} // tgen
ccc::CC5x0y3 ::CC5x0y3(){ note_ctor("_ZN3ccc7CC5x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y3E, buf);
    ::ccc::CC5x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y3E);
    dp->::ccc::CC5x0y3::~CC5x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y3E(Test__ZN3ccc7CC5x0y3E, "_ZN3ccc7CC5x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y3C1Ev();
extern void _ZN3ccc7CC5x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y3E[] = {
  NSPAIR(_ZN3ccc7CC5x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y3E[];
extern void _ZN3ccc7CC5x0y33pqrEv();
extern void _ZN3ccc7CC5x0y33efgEv();
extern void _ZN3ccc7CC5x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33abcEv,_ZThn4_N3ccc7CC5x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33efgEv,_ZThn4_N3ccc7CC5x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y33pqrEv,_ZThn4_N3ccc7CC5x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y33abcEv,_ZThn4_N3ccc7CC5x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y33efgEv,_ZThn4_N3ccc7CC5x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y33pqrEv,_ZThn4_N3ccc7CC5x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y3E[];
Class_Descriptor cd__ZN3ccc7CC5x0y3E = {  "_ZN3ccc7CC5x0y3E", // class name
  bases__ZN3ccc7CC5x0y3E, 2,
  &(vtc__ZN3ccc7CC5x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y4  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC5x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y43efgEv
  ~CC5x0y4(); // tgen
  CC5x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y4E) C1{ BC2{ v1 v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y43pqrEv");}
void  ccc::CC5x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y43abcEv");}
void  ccc::CC5x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y43efgEv");}
ccc::CC5x0y4 ::~CC5x0y4(){ note_dtor("_ZN3ccc7CC5x0y4E", this);} // tgen
ccc::CC5x0y4 ::CC5x0y4(){ note_ctor("_ZN3ccc7CC5x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y4E, buf);
    ::ccc::CC5x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y4E);
    dp->::ccc::CC5x0y4::~CC5x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y4E(Test__ZN3ccc7CC5x0y4E, "_ZN3ccc7CC5x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y4C1Ev();
extern void _ZN3ccc7CC5x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y4E[] = {
  NSPAIR(_ZN3ccc7CC5x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y4E[];
extern void _ZN3ccc7CC5x0y43pqrEv();
extern void _ZN3ccc7CC5x0y43efgEv();
extern void _ZN3ccc7CC5x0y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43abcEv,_ZThn4_N3ccc7CC5x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43efgEv,_ZThn4_N3ccc7CC5x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y43pqrEv,_ZThn4_N3ccc7CC5x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y43abcEv,_ZThn4_N3ccc7CC5x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y43efgEv,_ZThn4_N3ccc7CC5x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y43pqrEv,_ZThn4_N3ccc7CC5x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y4E[];
Class_Descriptor cd__ZN3ccc7CC5x0y4E = {  "_ZN3ccc7CC5x0y4E", // class name
  bases__ZN3ccc7CC5x0y4E, 2,
  &(vtc__ZN3ccc7CC5x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y5  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC5x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y53abcEv
  ~CC5x0y5(); // tgen
  CC5x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y5E) C1{ BC2{ v1 v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y53pqrEv");}
void  ccc::CC5x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y53efgEv");}
void  ccc::CC5x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y53abcEv");}
ccc::CC5x0y5 ::~CC5x0y5(){ note_dtor("_ZN3ccc7CC5x0y5E", this);} // tgen
ccc::CC5x0y5 ::CC5x0y5(){ note_ctor("_ZN3ccc7CC5x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y5E, buf);
    ::ccc::CC5x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y5E);
    dp->::ccc::CC5x0y5::~CC5x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y5E(Test__ZN3ccc7CC5x0y5E, "_ZN3ccc7CC5x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y5C1Ev();
extern void _ZN3ccc7CC5x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y5E[] = {
  NSPAIR(_ZN3ccc7CC5x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y5E[];
extern void _ZN3ccc7CC5x0y53pqrEv();
extern void _ZN3ccc7CC5x0y53efgEv();
extern void _ZN3ccc7CC5x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53abcEv,_ZThn4_N3ccc7CC5x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53efgEv,_ZThn4_N3ccc7CC5x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y53pqrEv,_ZThn4_N3ccc7CC5x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y53abcEv,_ZThn4_N3ccc7CC5x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y53efgEv,_ZThn4_N3ccc7CC5x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y53pqrEv,_ZThn4_N3ccc7CC5x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y5E[];
Class_Descriptor cd__ZN3ccc7CC5x0y5E = {  "_ZN3ccc7CC5x0y5E", // class name
  bases__ZN3ccc7CC5x0y5E, 2,
  &(vtc__ZN3ccc7CC5x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y6  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x0y63efgEv
  ~CC5x0y6(); // tgen
  CC5x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y6E) C1{ BC2{ v3 v2 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y63abcEv");}
void  ccc::CC5x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y63efgEv");}
ccc::CC5x0y6 ::~CC5x0y6(){ note_dtor("_ZN3ccc7CC5x0y6E", this);} // tgen
ccc::CC5x0y6 ::CC5x0y6(){ note_ctor("_ZN3ccc7CC5x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y6E, buf);
    ::ccc::CC5x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y6E);
    dp->::ccc::CC5x0y6::~CC5x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y6E(Test__ZN3ccc7CC5x0y6E, "_ZN3ccc7CC5x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y6C1Ev();
extern void _ZN3ccc7CC5x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y6E[] = {
  NSPAIR(_ZN3ccc7CC5x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x0y63efgEv();
extern void _ZN3ccc7CC5x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y63abcEv,_ZThn4_N3ccc7CC5x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y63efgEv,_ZThn4_N3ccc7CC5x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y63abcEv,_ZThn4_N3ccc7CC5x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y63efgEv,_ZThn4_N3ccc7CC5x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y6E[];
Class_Descriptor cd__ZN3ccc7CC5x0y6E = {  "_ZN3ccc7CC5x0y6E", // class name
  bases__ZN3ccc7CC5x0y6E, 2,
  &(vtc__ZN3ccc7CC5x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y7  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC5x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y73pqrEv
  ~CC5x0y7(); // tgen
  CC5x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y7E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y73abcEv");}
void  ccc::CC5x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y73pqrEv");}
ccc::CC5x0y7 ::~CC5x0y7(){ note_dtor("_ZN3ccc7CC5x0y7E", this);} // tgen
ccc::CC5x0y7 ::CC5x0y7(){ note_ctor("_ZN3ccc7CC5x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y7E, buf);
    ::ccc::CC5x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y7E);
    dp->::ccc::CC5x0y7::~CC5x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y7E(Test__ZN3ccc7CC5x0y7E, "_ZN3ccc7CC5x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y7C1Ev();
extern void _ZN3ccc7CC5x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y7E[] = {
  NSPAIR(_ZN3ccc7CC5x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y7E[];
extern void _ZN3ccc7CC5x0y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y73abcEv,_ZThn4_N3ccc7CC5x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y73pqrEv,_ZThn4_N3ccc7CC5x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y73abcEv,_ZThn4_N3ccc7CC5x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y73pqrEv,_ZThn4_N3ccc7CC5x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y7E[];
Class_Descriptor cd__ZN3ccc7CC5x0y7E = {  "_ZN3ccc7CC5x0y7E", // class name
  bases__ZN3ccc7CC5x0y7E, 2,
  &(vtc__ZN3ccc7CC5x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y8  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x0y83abcEv
  ~CC5x0y8(); // tgen
  CC5x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y8E) C1{ BC2{ v3 v1 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y83efgEv");}
void  ccc::CC5x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x0y83abcEv");}
ccc::CC5x0y8 ::~CC5x0y8(){ note_dtor("_ZN3ccc7CC5x0y8E", this);} // tgen
ccc::CC5x0y8 ::CC5x0y8(){ note_ctor("_ZN3ccc7CC5x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y8E, buf);
    ::ccc::CC5x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y8E);
    dp->::ccc::CC5x0y8::~CC5x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y8E(Test__ZN3ccc7CC5x0y8E, "_ZN3ccc7CC5x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y8C1Ev();
extern void _ZN3ccc7CC5x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y8E[] = {
  NSPAIR(_ZN3ccc7CC5x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x0y83efgEv();
extern void _ZN3ccc7CC5x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y83abcEv,_ZThn4_N3ccc7CC5x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y83efgEv,_ZThn4_N3ccc7CC5x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y83abcEv,_ZThn4_N3ccc7CC5x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y83efgEv,_ZThn4_N3ccc7CC5x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y8E[];
Class_Descriptor cd__ZN3ccc7CC5x0y8E = {  "_ZN3ccc7CC5x0y8E", // class name
  bases__ZN3ccc7CC5x0y8E, 2,
  &(vtc__ZN3ccc7CC5x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y9  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC5x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x0y93pqrEv
  ~CC5x0y9(); // tgen
  CC5x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x0y9E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x0y93efgEv");}
void  ccc::CC5x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x0y93pqrEv");}
ccc::CC5x0y9 ::~CC5x0y9(){ note_dtor("_ZN3ccc7CC5x0y9E", this);} // tgen
ccc::CC5x0y9 ::CC5x0y9(){ note_ctor("_ZN3ccc7CC5x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x0y9E, buf);
    ::ccc::CC5x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x0y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7CC5x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x0y9E);
    dp->::ccc::CC5x0y9::~CC5x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x0y9E(Test__ZN3ccc7CC5x0y9E, "_ZN3ccc7CC5x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x0y9C1Ev();
extern void _ZN3ccc7CC5x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x0y9E[] = {
  NSPAIR(_ZN3ccc7CC5x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC5x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y9E[];
extern void _ZN3ccc7CC5x0y93pqrEv();
extern void _ZN3ccc7CC5x0y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y93efgEv,_ZThn4_N3ccc7CC5x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x0y93pqrEv,_ZThn4_N3ccc7CC5x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y93efgEv,_ZThn4_N3ccc7CC5x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x0y93pqrEv,_ZThn4_N3ccc7CC5x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x0y9E[];
Class_Descriptor cd__ZN3ccc7CC5x0y9E = {  "_ZN3ccc7CC5x0y9E", // class name
  bases__ZN3ccc7CC5x0y9E, 2,
  &(vtc__ZN3ccc7CC5x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y10  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x0y103abcEv
  ~CC5x0y10(); // tgen
  CC5x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y10E) C1{ BC2{ v1 v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y103pqrEv");}
void  ccc::CC5x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x0y103abcEv");}
ccc::CC5x0y10 ::~CC5x0y10(){ note_dtor("_ZN3ccc8CC5x0y10E", this);} // tgen
ccc::CC5x0y10 ::CC5x0y10(){ note_ctor("_ZN3ccc8CC5x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y10E, buf);
    ::ccc::CC5x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y10E);
    dp->::ccc::CC5x0y10::~CC5x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y10E(Test__ZN3ccc8CC5x0y10E, "_ZN3ccc8CC5x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y10C1Ev();
extern void _ZN3ccc8CC5x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y10E[] = {
  NSPAIR(_ZN3ccc8CC5x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y10E[];
extern void _ZN3ccc8CC5x0y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y103abcEv,_ZThn4_N3ccc8CC5x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y103pqrEv,_ZThn4_N3ccc8CC5x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y103abcEv,_ZThn4_N3ccc8CC5x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y103pqrEv,_ZThn4_N3ccc8CC5x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y10E[];
Class_Descriptor cd__ZN3ccc8CC5x0y10E = {  "_ZN3ccc8CC5x0y10E", // class name
  bases__ZN3ccc8CC5x0y10E, 2,
  &(vtc__ZN3ccc8CC5x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y11  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x0y113efgEv
  ~CC5x0y11(); // tgen
  CC5x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y11E) C1{ BC2{ v1 v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y113pqrEv");}
void  ccc::CC5x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x0y113efgEv");}
ccc::CC5x0y11 ::~CC5x0y11(){ note_dtor("_ZN3ccc8CC5x0y11E", this);} // tgen
ccc::CC5x0y11 ::CC5x0y11(){ note_ctor("_ZN3ccc8CC5x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y11E, buf);
    ::ccc::CC5x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y11E);
    dp->::ccc::CC5x0y11::~CC5x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y11E(Test__ZN3ccc8CC5x0y11E, "_ZN3ccc8CC5x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y11C1Ev();
extern void _ZN3ccc8CC5x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y11E[] = {
  NSPAIR(_ZN3ccc8CC5x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y11E[];
extern void _ZN3ccc8CC5x0y113pqrEv();
extern void _ZN3ccc8CC5x0y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y113efgEv,_ZThn4_N3ccc8CC5x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y113pqrEv,_ZThn4_N3ccc8CC5x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y113efgEv,_ZThn4_N3ccc8CC5x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y113pqrEv,_ZThn4_N3ccc8CC5x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y11E[];
Class_Descriptor cd__ZN3ccc8CC5x0y11E = {  "_ZN3ccc8CC5x0y11E", // class name
  bases__ZN3ccc8CC5x0y11E, 2,
  &(vtc__ZN3ccc8CC5x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y12  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC5x0y123abcEv
  ~CC5x0y12(); // tgen
  CC5x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x0y123abcEv");}
ccc::CC5x0y12 ::~CC5x0y12(){ note_dtor("_ZN3ccc8CC5x0y12E", this);} // tgen
ccc::CC5x0y12 ::CC5x0y12(){ note_ctor("_ZN3ccc8CC5x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y12E, buf);
    ::ccc::CC5x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y12E);
    dp->::ccc::CC5x0y12::~CC5x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y12E(Test__ZN3ccc8CC5x0y12E, "_ZN3ccc8CC5x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y12C1Ev();
extern void _ZN3ccc8CC5x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y12E[] = {
  NSPAIR(_ZN3ccc8CC5x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y123abcEv,_ZThn4_N3ccc8CC5x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y123abcEv,_ZThn4_N3ccc8CC5x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y12E[];
Class_Descriptor cd__ZN3ccc8CC5x0y12E = {  "_ZN3ccc8CC5x0y12E", // class name
  bases__ZN3ccc8CC5x0y12E, 2,
  &(vtc__ZN3ccc8CC5x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y13  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC5x0y133efgEv
  ~CC5x0y13(); // tgen
  CC5x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x0y133efgEv");}
ccc::CC5x0y13 ::~CC5x0y13(){ note_dtor("_ZN3ccc8CC5x0y13E", this);} // tgen
ccc::CC5x0y13 ::CC5x0y13(){ note_ctor("_ZN3ccc8CC5x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y13E, buf);
    ::ccc::CC5x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y13E);
    dp->::ccc::CC5x0y13::~CC5x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y13E(Test__ZN3ccc8CC5x0y13E, "_ZN3ccc8CC5x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y13C1Ev();
extern void _ZN3ccc8CC5x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y13E[] = {
  NSPAIR(_ZN3ccc8CC5x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x0y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y133efgEv,_ZThn4_N3ccc8CC5x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y133efgEv,_ZThn4_N3ccc8CC5x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y13E[];
Class_Descriptor cd__ZN3ccc8CC5x0y13E = {  "_ZN3ccc8CC5x0y13E", // class name
  bases__ZN3ccc8CC5x0y13E, 2,
  &(vtc__ZN3ccc8CC5x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y14  : ::ccc::AA5 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC5x0y143pqrEv
  ~CC5x0y14(); // tgen
  CC5x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x0y143pqrEv");}
ccc::CC5x0y14 ::~CC5x0y14(){ note_dtor("_ZN3ccc8CC5x0y14E", this);} // tgen
ccc::CC5x0y14 ::CC5x0y14(){ note_ctor("_ZN3ccc8CC5x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y14E, buf);
    ::ccc::CC5x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y14E);
    dp->::ccc::CC5x0y14::~CC5x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y14E(Test__ZN3ccc8CC5x0y14E, "_ZN3ccc8CC5x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y14C1Ev();
extern void _ZN3ccc8CC5x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y14E[] = {
  NSPAIR(_ZN3ccc8CC5x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y14E[];
extern void _ZN3ccc8CC5x0y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x0y143pqrEv,_ZThn4_N3ccc8CC5x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x0y143pqrEv,_ZThn4_N3ccc8CC5x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y14E[];
Class_Descriptor cd__ZN3ccc8CC5x0y14E = {  "_ZN3ccc8CC5x0y14E", // class name
  bases__ZN3ccc8CC5x0y14E, 2,
  &(vtc__ZN3ccc8CC5x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x0y15  : ::ccc::AA5 , ::ccc::BB0 {
  ~CC5x0y15(); // tgen
  CC5x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x0y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x0y15 ::~CC5x0y15(){ note_dtor("_ZN3ccc8CC5x0y15E", this);} // tgen
ccc::CC5x0y15 ::CC5x0y15(){ note_ctor("_ZN3ccc8CC5x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x0y15E, buf);
    ::ccc::CC5x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x0y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC5x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x0y15E);
    dp->::ccc::CC5x0y15::~CC5x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x0y15E(Test__ZN3ccc8CC5x0y15E, "_ZN3ccc8CC5x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x0y15C1Ev();
extern void _ZN3ccc8CC5x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x0y15E[] = {
  NSPAIR(_ZN3ccc8CC5x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC5x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x0y15E[];
Class_Descriptor cd__ZN3ccc8CC5x0y15E = {  "_ZN3ccc8CC5x0y15E", // class name
  bases__ZN3ccc8CC5x0y15E, 2,
  &(vtc__ZN3ccc8CC5x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x0y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y0  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y03pqrEv
  ~CC5x1y0(); // tgen
  CC5x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y0E) C1{ BC2{ v3 v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y03abcEv");}
void  ccc::CC5x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y03efgEv");}
void  ccc::CC5x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y03pqrEv");}
ccc::CC5x1y0 ::~CC5x1y0(){ note_dtor("_ZN3ccc7CC5x1y0E", this);} // tgen
ccc::CC5x1y0 ::CC5x1y0(){ note_ctor("_ZN3ccc7CC5x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y0E, buf);
    ::ccc::CC5x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y0E);
    dp->::ccc::CC5x1y0::~CC5x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y0E(Test__ZN3ccc7CC5x1y0E, "_ZN3ccc7CC5x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y0C1Ev();
extern void _ZN3ccc7CC5x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y0E[] = {
  NSPAIR(_ZN3ccc7CC5x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y0E[];
extern void _ZN3ccc7CC5x1y03pqrEv();
extern void _ZN3ccc7CC5x1y03efgEv();
extern void _ZN3ccc7CC5x1y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03abcEv,_ZThn4_N3ccc7CC5x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03pqrEv,_ZThn4_N3ccc7CC5x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y03efgEv,_ZThn4_N3ccc7CC5x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y03abcEv,_ZThn4_N3ccc7CC5x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y03pqrEv,_ZThn4_N3ccc7CC5x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y03efgEv,_ZThn4_N3ccc7CC5x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y0E[];
Class_Descriptor cd__ZN3ccc7CC5x1y0E = {  "_ZN3ccc7CC5x1y0E", // class name
  bases__ZN3ccc7CC5x1y0E, 2,
  &(vtc__ZN3ccc7CC5x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y1  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x1y13efgEv
  ~CC5x1y1(); // tgen
  CC5x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y1E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y13abcEv");}
void  ccc::CC5x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y13pqrEv");}
void  ccc::CC5x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y13efgEv");}
ccc::CC5x1y1 ::~CC5x1y1(){ note_dtor("_ZN3ccc7CC5x1y1E", this);} // tgen
ccc::CC5x1y1 ::CC5x1y1(){ note_ctor("_ZN3ccc7CC5x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y1E, buf);
    ::ccc::CC5x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y1E);
    dp->::ccc::CC5x1y1::~CC5x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y1E(Test__ZN3ccc7CC5x1y1E, "_ZN3ccc7CC5x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y1C1Ev();
extern void _ZN3ccc7CC5x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y1E[] = {
  NSPAIR(_ZN3ccc7CC5x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y1E[];
extern void _ZN3ccc7CC5x1y13pqrEv();
extern void _ZN3ccc7CC5x1y13efgEv();
extern void _ZN3ccc7CC5x1y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13abcEv,_ZThn4_N3ccc7CC5x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13pqrEv,_ZThn4_N3ccc7CC5x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y13efgEv,_ZThn4_N3ccc7CC5x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y13abcEv,_ZThn4_N3ccc7CC5x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y13pqrEv,_ZThn4_N3ccc7CC5x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y13efgEv,_ZThn4_N3ccc7CC5x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y1E[];
Class_Descriptor cd__ZN3ccc7CC5x1y1E = {  "_ZN3ccc7CC5x1y1E", // class name
  bases__ZN3ccc7CC5x1y1E, 2,
  &(vtc__ZN3ccc7CC5x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y2  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y23pqrEv
  ~CC5x1y2(); // tgen
  CC5x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y2E) C1{ BC2{ v3 v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y23efgEv");}
void  ccc::CC5x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y23abcEv");}
void  ccc::CC5x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y23pqrEv");}
ccc::CC5x1y2 ::~CC5x1y2(){ note_dtor("_ZN3ccc7CC5x1y2E", this);} // tgen
ccc::CC5x1y2 ::CC5x1y2(){ note_ctor("_ZN3ccc7CC5x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y2E, buf);
    ::ccc::CC5x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y2E);
    dp->::ccc::CC5x1y2::~CC5x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y2E(Test__ZN3ccc7CC5x1y2E, "_ZN3ccc7CC5x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y2C1Ev();
extern void _ZN3ccc7CC5x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y2E[] = {
  NSPAIR(_ZN3ccc7CC5x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y2E[];
extern void _ZN3ccc7CC5x1y23pqrEv();
extern void _ZN3ccc7CC5x1y23efgEv();
extern void _ZN3ccc7CC5x1y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23abcEv,_ZThn4_N3ccc7CC5x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23pqrEv,_ZThn4_N3ccc7CC5x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y23efgEv,_ZThn4_N3ccc7CC5x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y23abcEv,_ZThn4_N3ccc7CC5x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y23pqrEv,_ZThn4_N3ccc7CC5x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y23efgEv,_ZThn4_N3ccc7CC5x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y2E[];
Class_Descriptor cd__ZN3ccc7CC5x1y2E = {  "_ZN3ccc7CC5x1y2E", // class name
  bases__ZN3ccc7CC5x1y2E, 2,
  &(vtc__ZN3ccc7CC5x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y3  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x1y33abcEv
  ~CC5x1y3(); // tgen
  CC5x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y3E) C1{ BC2{ v2 v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y33efgEv");}
void  ccc::CC5x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y33pqrEv");}
void  ccc::CC5x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y33abcEv");}
ccc::CC5x1y3 ::~CC5x1y3(){ note_dtor("_ZN3ccc7CC5x1y3E", this);} // tgen
ccc::CC5x1y3 ::CC5x1y3(){ note_ctor("_ZN3ccc7CC5x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y3E, buf);
    ::ccc::CC5x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y3E);
    dp->::ccc::CC5x1y3::~CC5x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y3E(Test__ZN3ccc7CC5x1y3E, "_ZN3ccc7CC5x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y3C1Ev();
extern void _ZN3ccc7CC5x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y3E[] = {
  NSPAIR(_ZN3ccc7CC5x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y3E[];
extern void _ZN3ccc7CC5x1y33pqrEv();
extern void _ZN3ccc7CC5x1y33efgEv();
extern void _ZN3ccc7CC5x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33abcEv,_ZThn4_N3ccc7CC5x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33pqrEv,_ZThn4_N3ccc7CC5x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y33efgEv,_ZThn4_N3ccc7CC5x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y33abcEv,_ZThn4_N3ccc7CC5x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y33pqrEv,_ZThn4_N3ccc7CC5x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y33efgEv,_ZThn4_N3ccc7CC5x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y3E[];
Class_Descriptor cd__ZN3ccc7CC5x1y3E = {  "_ZN3ccc7CC5x1y3E", // class name
  bases__ZN3ccc7CC5x1y3E, 2,
  &(vtc__ZN3ccc7CC5x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y4  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC5x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y43efgEv
  ~CC5x1y4(); // tgen
  CC5x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y4E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y43pqrEv");}
void  ccc::CC5x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y43abcEv");}
void  ccc::CC5x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y43efgEv");}
ccc::CC5x1y4 ::~CC5x1y4(){ note_dtor("_ZN3ccc7CC5x1y4E", this);} // tgen
ccc::CC5x1y4 ::CC5x1y4(){ note_ctor("_ZN3ccc7CC5x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y4E, buf);
    ::ccc::CC5x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y4E);
    dp->::ccc::CC5x1y4::~CC5x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y4E(Test__ZN3ccc7CC5x1y4E, "_ZN3ccc7CC5x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y4C1Ev();
extern void _ZN3ccc7CC5x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y4E[] = {
  NSPAIR(_ZN3ccc7CC5x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y4E[];
extern void _ZN3ccc7CC5x1y43pqrEv();
extern void _ZN3ccc7CC5x1y43efgEv();
extern void _ZN3ccc7CC5x1y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43abcEv,_ZThn4_N3ccc7CC5x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43pqrEv,_ZThn4_N3ccc7CC5x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y43efgEv,_ZThn4_N3ccc7CC5x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y43abcEv,_ZThn4_N3ccc7CC5x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y43pqrEv,_ZThn4_N3ccc7CC5x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y43efgEv,_ZThn4_N3ccc7CC5x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y4E[];
Class_Descriptor cd__ZN3ccc7CC5x1y4E = {  "_ZN3ccc7CC5x1y4E", // class name
  bases__ZN3ccc7CC5x1y4E, 2,
  &(vtc__ZN3ccc7CC5x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y5  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC5x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y53abcEv
  ~CC5x1y5(); // tgen
  CC5x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y5E) C1{ BC2{ v1 v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y53pqrEv");}
void  ccc::CC5x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y53efgEv");}
void  ccc::CC5x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y53abcEv");}
ccc::CC5x1y5 ::~CC5x1y5(){ note_dtor("_ZN3ccc7CC5x1y5E", this);} // tgen
ccc::CC5x1y5 ::CC5x1y5(){ note_ctor("_ZN3ccc7CC5x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y5E, buf);
    ::ccc::CC5x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y5E);
    dp->::ccc::CC5x1y5::~CC5x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y5E(Test__ZN3ccc7CC5x1y5E, "_ZN3ccc7CC5x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y5C1Ev();
extern void _ZN3ccc7CC5x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y5E[] = {
  NSPAIR(_ZN3ccc7CC5x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y5E[];
extern void _ZN3ccc7CC5x1y53pqrEv();
extern void _ZN3ccc7CC5x1y53efgEv();
extern void _ZN3ccc7CC5x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53abcEv,_ZThn4_N3ccc7CC5x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53pqrEv,_ZThn4_N3ccc7CC5x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y53efgEv,_ZThn4_N3ccc7CC5x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y53abcEv,_ZThn4_N3ccc7CC5x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y53pqrEv,_ZThn4_N3ccc7CC5x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y53efgEv,_ZThn4_N3ccc7CC5x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y5E[];
Class_Descriptor cd__ZN3ccc7CC5x1y5E = {  "_ZN3ccc7CC5x1y5E", // class name
  bases__ZN3ccc7CC5x1y5E, 2,
  &(vtc__ZN3ccc7CC5x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y6  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x1y63efgEv
  ~CC5x1y6(); // tgen
  CC5x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y6E) C1{ BC2{ v3 v2 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y63abcEv");}
void  ccc::CC5x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y63efgEv");}
ccc::CC5x1y6 ::~CC5x1y6(){ note_dtor("_ZN3ccc7CC5x1y6E", this);} // tgen
ccc::CC5x1y6 ::CC5x1y6(){ note_ctor("_ZN3ccc7CC5x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y6E, buf);
    ::ccc::CC5x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y6E);
    dp->::ccc::CC5x1y6::~CC5x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y6E(Test__ZN3ccc7CC5x1y6E, "_ZN3ccc7CC5x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y6C1Ev();
extern void _ZN3ccc7CC5x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y6E[] = {
  NSPAIR(_ZN3ccc7CC5x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x1y63efgEv();
extern void _ZN3ccc7CC5x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y63abcEv,_ZThn4_N3ccc7CC5x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y63efgEv,_ZThn4_N3ccc7CC5x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y63abcEv,_ZThn4_N3ccc7CC5x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y63efgEv,_ZThn4_N3ccc7CC5x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y6E[];
Class_Descriptor cd__ZN3ccc7CC5x1y6E = {  "_ZN3ccc7CC5x1y6E", // class name
  bases__ZN3ccc7CC5x1y6E, 2,
  &(vtc__ZN3ccc7CC5x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y7  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC5x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y73pqrEv
  ~CC5x1y7(); // tgen
  CC5x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y7E) C1{ BC2{ v2 v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y73abcEv");}
void  ccc::CC5x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y73pqrEv");}
ccc::CC5x1y7 ::~CC5x1y7(){ note_dtor("_ZN3ccc7CC5x1y7E", this);} // tgen
ccc::CC5x1y7 ::CC5x1y7(){ note_ctor("_ZN3ccc7CC5x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y7E, buf);
    ::ccc::CC5x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y7E);
    dp->::ccc::CC5x1y7::~CC5x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y7E(Test__ZN3ccc7CC5x1y7E, "_ZN3ccc7CC5x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y7C1Ev();
extern void _ZN3ccc7CC5x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y7E[] = {
  NSPAIR(_ZN3ccc7CC5x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y7E[];
extern void _ZN3ccc7CC5x1y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y73abcEv,_ZThn4_N3ccc7CC5x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y73pqrEv,_ZThn4_N3ccc7CC5x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y73abcEv,_ZThn4_N3ccc7CC5x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y73pqrEv,_ZThn4_N3ccc7CC5x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y7E[];
Class_Descriptor cd__ZN3ccc7CC5x1y7E = {  "_ZN3ccc7CC5x1y7E", // class name
  bases__ZN3ccc7CC5x1y7E, 2,
  &(vtc__ZN3ccc7CC5x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y8  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x1y83abcEv
  ~CC5x1y8(); // tgen
  CC5x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y8E) C1{ BC2{ v3 v1 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y83efgEv");}
void  ccc::CC5x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x1y83abcEv");}
ccc::CC5x1y8 ::~CC5x1y8(){ note_dtor("_ZN3ccc7CC5x1y8E", this);} // tgen
ccc::CC5x1y8 ::CC5x1y8(){ note_ctor("_ZN3ccc7CC5x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y8E, buf);
    ::ccc::CC5x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y8E);
    dp->::ccc::CC5x1y8::~CC5x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y8E(Test__ZN3ccc7CC5x1y8E, "_ZN3ccc7CC5x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y8C1Ev();
extern void _ZN3ccc7CC5x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y8E[] = {
  NSPAIR(_ZN3ccc7CC5x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x1y83efgEv();
extern void _ZN3ccc7CC5x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y83abcEv,_ZThn4_N3ccc7CC5x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y83efgEv,_ZThn4_N3ccc7CC5x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y83abcEv,_ZThn4_N3ccc7CC5x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y83efgEv,_ZThn4_N3ccc7CC5x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y8E[];
Class_Descriptor cd__ZN3ccc7CC5x1y8E = {  "_ZN3ccc7CC5x1y8E", // class name
  bases__ZN3ccc7CC5x1y8E, 2,
  &(vtc__ZN3ccc7CC5x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y9  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC5x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x1y93pqrEv
  ~CC5x1y9(); // tgen
  CC5x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x1y9E) C1{ BC2{ v2 v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x1y93efgEv");}
void  ccc::CC5x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x1y93pqrEv");}
ccc::CC5x1y9 ::~CC5x1y9(){ note_dtor("_ZN3ccc7CC5x1y9E", this);} // tgen
ccc::CC5x1y9 ::CC5x1y9(){ note_ctor("_ZN3ccc7CC5x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x1y9E, buf);
    ::ccc::CC5x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x1y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7CC5x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x1y9E);
    dp->::ccc::CC5x1y9::~CC5x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x1y9E(Test__ZN3ccc7CC5x1y9E, "_ZN3ccc7CC5x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x1y9C1Ev();
extern void _ZN3ccc7CC5x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x1y9E[] = {
  NSPAIR(_ZN3ccc7CC5x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC5x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y9E[];
extern void _ZN3ccc7CC5x1y93pqrEv();
extern void _ZN3ccc7CC5x1y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y93pqrEv,_ZThn4_N3ccc7CC5x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x1y93efgEv,_ZThn4_N3ccc7CC5x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y93pqrEv,_ZThn4_N3ccc7CC5x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x1y93efgEv,_ZThn4_N3ccc7CC5x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x1y9E[];
Class_Descriptor cd__ZN3ccc7CC5x1y9E = {  "_ZN3ccc7CC5x1y9E", // class name
  bases__ZN3ccc7CC5x1y9E, 2,
  &(vtc__ZN3ccc7CC5x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y10  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x1y103abcEv
  ~CC5x1y10(); // tgen
  CC5x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y10E) C1{ BC2{ v1 v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y103pqrEv");}
void  ccc::CC5x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x1y103abcEv");}
ccc::CC5x1y10 ::~CC5x1y10(){ note_dtor("_ZN3ccc8CC5x1y10E", this);} // tgen
ccc::CC5x1y10 ::CC5x1y10(){ note_ctor("_ZN3ccc8CC5x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y10E, buf);
    ::ccc::CC5x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y10E);
    dp->::ccc::CC5x1y10::~CC5x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y10E(Test__ZN3ccc8CC5x1y10E, "_ZN3ccc8CC5x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y10C1Ev();
extern void _ZN3ccc8CC5x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y10E[] = {
  NSPAIR(_ZN3ccc8CC5x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y10E[];
extern void _ZN3ccc8CC5x1y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y103abcEv,_ZThn4_N3ccc8CC5x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y103pqrEv,_ZThn4_N3ccc8CC5x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y103abcEv,_ZThn4_N3ccc8CC5x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y103pqrEv,_ZThn4_N3ccc8CC5x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y10E[];
Class_Descriptor cd__ZN3ccc8CC5x1y10E = {  "_ZN3ccc8CC5x1y10E", // class name
  bases__ZN3ccc8CC5x1y10E, 2,
  &(vtc__ZN3ccc8CC5x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y11  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x1y113efgEv
  ~CC5x1y11(); // tgen
  CC5x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y11E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y113pqrEv");}
void  ccc::CC5x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x1y113efgEv");}
ccc::CC5x1y11 ::~CC5x1y11(){ note_dtor("_ZN3ccc8CC5x1y11E", this);} // tgen
ccc::CC5x1y11 ::CC5x1y11(){ note_ctor("_ZN3ccc8CC5x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y11E, buf);
    ::ccc::CC5x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y11E);
    dp->::ccc::CC5x1y11::~CC5x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y11E(Test__ZN3ccc8CC5x1y11E, "_ZN3ccc8CC5x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y11C1Ev();
extern void _ZN3ccc8CC5x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y11E[] = {
  NSPAIR(_ZN3ccc8CC5x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y11E[];
extern void _ZN3ccc8CC5x1y113pqrEv();
extern void _ZN3ccc8CC5x1y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y113pqrEv,_ZThn4_N3ccc8CC5x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y113efgEv,_ZThn4_N3ccc8CC5x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y113pqrEv,_ZThn4_N3ccc8CC5x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y113efgEv,_ZThn4_N3ccc8CC5x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y11E[];
Class_Descriptor cd__ZN3ccc8CC5x1y11E = {  "_ZN3ccc8CC5x1y11E", // class name
  bases__ZN3ccc8CC5x1y11E, 2,
  &(vtc__ZN3ccc8CC5x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y12  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC5x1y123abcEv
  ~CC5x1y12(); // tgen
  CC5x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y12E) C1{ BC2{ v2 v3 v1} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x1y123abcEv");}
ccc::CC5x1y12 ::~CC5x1y12(){ note_dtor("_ZN3ccc8CC5x1y12E", this);} // tgen
ccc::CC5x1y12 ::CC5x1y12(){ note_ctor("_ZN3ccc8CC5x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y12E, buf);
    ::ccc::CC5x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y12E);
    dp->::ccc::CC5x1y12::~CC5x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y12E(Test__ZN3ccc8CC5x1y12E, "_ZN3ccc8CC5x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y12C1Ev();
extern void _ZN3ccc8CC5x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y12E[] = {
  NSPAIR(_ZN3ccc8CC5x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y123abcEv,_ZThn4_N3ccc8CC5x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y123abcEv,_ZThn4_N3ccc8CC5x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y12E[];
Class_Descriptor cd__ZN3ccc8CC5x1y12E = {  "_ZN3ccc8CC5x1y12E", // class name
  bases__ZN3ccc8CC5x1y12E, 2,
  &(vtc__ZN3ccc8CC5x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y13  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC5x1y133efgEv
  ~CC5x1y13(); // tgen
  CC5x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y13E) C1{ BC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x1y133efgEv");}
ccc::CC5x1y13 ::~CC5x1y13(){ note_dtor("_ZN3ccc8CC5x1y13E", this);} // tgen
ccc::CC5x1y13 ::CC5x1y13(){ note_ctor("_ZN3ccc8CC5x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y13E, buf);
    ::ccc::CC5x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y13E);
    dp->::ccc::CC5x1y13::~CC5x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y13E(Test__ZN3ccc8CC5x1y13E, "_ZN3ccc8CC5x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y13C1Ev();
extern void _ZN3ccc8CC5x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y13E[] = {
  NSPAIR(_ZN3ccc8CC5x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x1y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y133efgEv,_ZThn4_N3ccc8CC5x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y133efgEv,_ZThn4_N3ccc8CC5x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y13E[];
Class_Descriptor cd__ZN3ccc8CC5x1y13E = {  "_ZN3ccc8CC5x1y13E", // class name
  bases__ZN3ccc8CC5x1y13E, 2,
  &(vtc__ZN3ccc8CC5x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y14  : ::ccc::AA5 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC5x1y143pqrEv
  ~CC5x1y14(); // tgen
  CC5x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x1y143pqrEv");}
ccc::CC5x1y14 ::~CC5x1y14(){ note_dtor("_ZN3ccc8CC5x1y14E", this);} // tgen
ccc::CC5x1y14 ::CC5x1y14(){ note_ctor("_ZN3ccc8CC5x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y14E, buf);
    ::ccc::CC5x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y14E);
    dp->::ccc::CC5x1y14::~CC5x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y14E(Test__ZN3ccc8CC5x1y14E, "_ZN3ccc8CC5x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y14C1Ev();
extern void _ZN3ccc8CC5x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y14E[] = {
  NSPAIR(_ZN3ccc8CC5x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y14E[];
extern void _ZN3ccc8CC5x1y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x1y143pqrEv,_ZThn4_N3ccc8CC5x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x1y143pqrEv,_ZThn4_N3ccc8CC5x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y14E[];
Class_Descriptor cd__ZN3ccc8CC5x1y14E = {  "_ZN3ccc8CC5x1y14E", // class name
  bases__ZN3ccc8CC5x1y14E, 2,
  &(vtc__ZN3ccc8CC5x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x1y15  : ::ccc::AA5 , ::ccc::BB1 {
  ~CC5x1y15(); // tgen
  CC5x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x1y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x1y15 ::~CC5x1y15(){ note_dtor("_ZN3ccc8CC5x1y15E", this);} // tgen
ccc::CC5x1y15 ::CC5x1y15(){ note_ctor("_ZN3ccc8CC5x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x1y15E, buf);
    ::ccc::CC5x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x1y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC5x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x1y15E);
    dp->::ccc::CC5x1y15::~CC5x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x1y15E(Test__ZN3ccc8CC5x1y15E, "_ZN3ccc8CC5x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x1y15C1Ev();
extern void _ZN3ccc8CC5x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x1y15E[] = {
  NSPAIR(_ZN3ccc8CC5x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC5x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x1y15E[];
Class_Descriptor cd__ZN3ccc8CC5x1y15E = {  "_ZN3ccc8CC5x1y15E", // class name
  bases__ZN3ccc8CC5x1y15E, 2,
  &(vtc__ZN3ccc8CC5x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x1y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y0  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y03pqrEv
  ~CC5x2y0(); // tgen
  CC5x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y0E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y03abcEv");}
void  ccc::CC5x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y03efgEv");}
void  ccc::CC5x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y03pqrEv");}
ccc::CC5x2y0 ::~CC5x2y0(){ note_dtor("_ZN3ccc7CC5x2y0E", this);} // tgen
ccc::CC5x2y0 ::CC5x2y0(){ note_ctor("_ZN3ccc7CC5x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y0E, buf);
    ::ccc::CC5x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y0E);
    dp->::ccc::CC5x2y0::~CC5x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y0E(Test__ZN3ccc7CC5x2y0E, "_ZN3ccc7CC5x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y0C1Ev();
extern void _ZN3ccc7CC5x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y0E[] = {
  NSPAIR(_ZN3ccc7CC5x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y0E[];
extern void _ZN3ccc7CC5x2y03pqrEv();
extern void _ZN3ccc7CC5x2y03efgEv();
extern void _ZN3ccc7CC5x2y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03efgEv,_ZThn4_N3ccc7CC5x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03abcEv,_ZThn4_N3ccc7CC5x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y03pqrEv,_ZThn4_N3ccc7CC5x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y03efgEv,_ZThn4_N3ccc7CC5x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y03abcEv,_ZThn4_N3ccc7CC5x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y03pqrEv,_ZThn4_N3ccc7CC5x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y0E[];
Class_Descriptor cd__ZN3ccc7CC5x2y0E = {  "_ZN3ccc7CC5x2y0E", // class name
  bases__ZN3ccc7CC5x2y0E, 2,
  &(vtc__ZN3ccc7CC5x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y1  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x2y13efgEv
  ~CC5x2y1(); // tgen
  CC5x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y1E) C1{ BC2{ v2 v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y13abcEv");}
void  ccc::CC5x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y13pqrEv");}
void  ccc::CC5x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y13efgEv");}
ccc::CC5x2y1 ::~CC5x2y1(){ note_dtor("_ZN3ccc7CC5x2y1E", this);} // tgen
ccc::CC5x2y1 ::CC5x2y1(){ note_ctor("_ZN3ccc7CC5x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y1E, buf);
    ::ccc::CC5x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y1E);
    dp->::ccc::CC5x2y1::~CC5x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y1E(Test__ZN3ccc7CC5x2y1E, "_ZN3ccc7CC5x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y1C1Ev();
extern void _ZN3ccc7CC5x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y1E[] = {
  NSPAIR(_ZN3ccc7CC5x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y1E[];
extern void _ZN3ccc7CC5x2y13pqrEv();
extern void _ZN3ccc7CC5x2y13efgEv();
extern void _ZN3ccc7CC5x2y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13efgEv,_ZThn4_N3ccc7CC5x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13abcEv,_ZThn4_N3ccc7CC5x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y13pqrEv,_ZThn4_N3ccc7CC5x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y13efgEv,_ZThn4_N3ccc7CC5x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y13abcEv,_ZThn4_N3ccc7CC5x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y13pqrEv,_ZThn4_N3ccc7CC5x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y1E[];
Class_Descriptor cd__ZN3ccc7CC5x2y1E = {  "_ZN3ccc7CC5x2y1E", // class name
  bases__ZN3ccc7CC5x2y1E, 2,
  &(vtc__ZN3ccc7CC5x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y2  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y23pqrEv
  ~CC5x2y2(); // tgen
  CC5x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y2E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y23efgEv");}
void  ccc::CC5x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y23abcEv");}
void  ccc::CC5x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y23pqrEv");}
ccc::CC5x2y2 ::~CC5x2y2(){ note_dtor("_ZN3ccc7CC5x2y2E", this);} // tgen
ccc::CC5x2y2 ::CC5x2y2(){ note_ctor("_ZN3ccc7CC5x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y2E, buf);
    ::ccc::CC5x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y2E);
    dp->::ccc::CC5x2y2::~CC5x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y2E(Test__ZN3ccc7CC5x2y2E, "_ZN3ccc7CC5x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y2C1Ev();
extern void _ZN3ccc7CC5x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y2E[] = {
  NSPAIR(_ZN3ccc7CC5x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y2E[];
extern void _ZN3ccc7CC5x2y23pqrEv();
extern void _ZN3ccc7CC5x2y23efgEv();
extern void _ZN3ccc7CC5x2y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23efgEv,_ZThn4_N3ccc7CC5x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23abcEv,_ZThn4_N3ccc7CC5x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y23pqrEv,_ZThn4_N3ccc7CC5x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y23efgEv,_ZThn4_N3ccc7CC5x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y23abcEv,_ZThn4_N3ccc7CC5x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y23pqrEv,_ZThn4_N3ccc7CC5x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y2E[];
Class_Descriptor cd__ZN3ccc7CC5x2y2E = {  "_ZN3ccc7CC5x2y2E", // class name
  bases__ZN3ccc7CC5x2y2E, 2,
  &(vtc__ZN3ccc7CC5x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y3  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x2y33abcEv
  ~CC5x2y3(); // tgen
  CC5x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y3E) C1{ BC2{ v2 v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y33efgEv");}
void  ccc::CC5x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y33pqrEv");}
void  ccc::CC5x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y33abcEv");}
ccc::CC5x2y3 ::~CC5x2y3(){ note_dtor("_ZN3ccc7CC5x2y3E", this);} // tgen
ccc::CC5x2y3 ::CC5x2y3(){ note_ctor("_ZN3ccc7CC5x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y3E, buf);
    ::ccc::CC5x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y3E);
    dp->::ccc::CC5x2y3::~CC5x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y3E(Test__ZN3ccc7CC5x2y3E, "_ZN3ccc7CC5x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y3C1Ev();
extern void _ZN3ccc7CC5x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y3E[] = {
  NSPAIR(_ZN3ccc7CC5x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y3E[];
extern void _ZN3ccc7CC5x2y33pqrEv();
extern void _ZN3ccc7CC5x2y33efgEv();
extern void _ZN3ccc7CC5x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33efgEv,_ZThn4_N3ccc7CC5x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33abcEv,_ZThn4_N3ccc7CC5x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y33pqrEv,_ZThn4_N3ccc7CC5x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y33efgEv,_ZThn4_N3ccc7CC5x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y33abcEv,_ZThn4_N3ccc7CC5x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y33pqrEv,_ZThn4_N3ccc7CC5x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y3E[];
Class_Descriptor cd__ZN3ccc7CC5x2y3E = {  "_ZN3ccc7CC5x2y3E", // class name
  bases__ZN3ccc7CC5x2y3E, 2,
  &(vtc__ZN3ccc7CC5x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y4  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC5x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y43efgEv
  ~CC5x2y4(); // tgen
  CC5x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y4E) C1{ BC2{ v1 v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y43pqrEv");}
void  ccc::CC5x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y43abcEv");}
void  ccc::CC5x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y43efgEv");}
ccc::CC5x2y4 ::~CC5x2y4(){ note_dtor("_ZN3ccc7CC5x2y4E", this);} // tgen
ccc::CC5x2y4 ::CC5x2y4(){ note_ctor("_ZN3ccc7CC5x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y4E, buf);
    ::ccc::CC5x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y4E);
    dp->::ccc::CC5x2y4::~CC5x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y4E(Test__ZN3ccc7CC5x2y4E, "_ZN3ccc7CC5x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y4C1Ev();
extern void _ZN3ccc7CC5x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y4E[] = {
  NSPAIR(_ZN3ccc7CC5x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y4E[];
extern void _ZN3ccc7CC5x2y43pqrEv();
extern void _ZN3ccc7CC5x2y43efgEv();
extern void _ZN3ccc7CC5x2y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43efgEv,_ZThn4_N3ccc7CC5x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43abcEv,_ZThn4_N3ccc7CC5x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y43pqrEv,_ZThn4_N3ccc7CC5x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y43efgEv,_ZThn4_N3ccc7CC5x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y43abcEv,_ZThn4_N3ccc7CC5x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y43pqrEv,_ZThn4_N3ccc7CC5x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y4E[];
Class_Descriptor cd__ZN3ccc7CC5x2y4E = {  "_ZN3ccc7CC5x2y4E", // class name
  bases__ZN3ccc7CC5x2y4E, 2,
  &(vtc__ZN3ccc7CC5x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y5  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC5x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y53abcEv
  ~CC5x2y5(); // tgen
  CC5x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y5E) C1{ BC2{ v1 v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y53pqrEv");}
void  ccc::CC5x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y53efgEv");}
void  ccc::CC5x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y53abcEv");}
ccc::CC5x2y5 ::~CC5x2y5(){ note_dtor("_ZN3ccc7CC5x2y5E", this);} // tgen
ccc::CC5x2y5 ::CC5x2y5(){ note_ctor("_ZN3ccc7CC5x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y5E, buf);
    ::ccc::CC5x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y5E);
    dp->::ccc::CC5x2y5::~CC5x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y5E(Test__ZN3ccc7CC5x2y5E, "_ZN3ccc7CC5x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y5C1Ev();
extern void _ZN3ccc7CC5x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y5E[] = {
  NSPAIR(_ZN3ccc7CC5x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y5E[];
extern void _ZN3ccc7CC5x2y53pqrEv();
extern void _ZN3ccc7CC5x2y53efgEv();
extern void _ZN3ccc7CC5x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53efgEv,_ZThn4_N3ccc7CC5x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53abcEv,_ZThn4_N3ccc7CC5x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y53pqrEv,_ZThn4_N3ccc7CC5x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y53efgEv,_ZThn4_N3ccc7CC5x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y53abcEv,_ZThn4_N3ccc7CC5x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y53pqrEv,_ZThn4_N3ccc7CC5x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y5E[];
Class_Descriptor cd__ZN3ccc7CC5x2y5E = {  "_ZN3ccc7CC5x2y5E", // class name
  bases__ZN3ccc7CC5x2y5E, 2,
  &(vtc__ZN3ccc7CC5x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y6  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x2y63efgEv
  ~CC5x2y6(); // tgen
  CC5x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y6E) C1{ BC2{ v3 v2 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y63abcEv");}
void  ccc::CC5x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y63efgEv");}
ccc::CC5x2y6 ::~CC5x2y6(){ note_dtor("_ZN3ccc7CC5x2y6E", this);} // tgen
ccc::CC5x2y6 ::CC5x2y6(){ note_ctor("_ZN3ccc7CC5x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y6E, buf);
    ::ccc::CC5x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y6E);
    dp->::ccc::CC5x2y6::~CC5x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y6E(Test__ZN3ccc7CC5x2y6E, "_ZN3ccc7CC5x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y6C1Ev();
extern void _ZN3ccc7CC5x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y6E[] = {
  NSPAIR(_ZN3ccc7CC5x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x2y63efgEv();
extern void _ZN3ccc7CC5x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y63efgEv,_ZThn4_N3ccc7CC5x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y63abcEv,_ZThn4_N3ccc7CC5x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y63efgEv,_ZThn4_N3ccc7CC5x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y63abcEv,_ZThn4_N3ccc7CC5x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y6E[];
Class_Descriptor cd__ZN3ccc7CC5x2y6E = {  "_ZN3ccc7CC5x2y6E", // class name
  bases__ZN3ccc7CC5x2y6E, 2,
  &(vtc__ZN3ccc7CC5x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y7  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC5x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y73pqrEv
  ~CC5x2y7(); // tgen
  CC5x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y7E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y73abcEv");}
void  ccc::CC5x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y73pqrEv");}
ccc::CC5x2y7 ::~CC5x2y7(){ note_dtor("_ZN3ccc7CC5x2y7E", this);} // tgen
ccc::CC5x2y7 ::CC5x2y7(){ note_ctor("_ZN3ccc7CC5x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y7E, buf);
    ::ccc::CC5x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y7E);
    dp->::ccc::CC5x2y7::~CC5x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y7E(Test__ZN3ccc7CC5x2y7E, "_ZN3ccc7CC5x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y7C1Ev();
extern void _ZN3ccc7CC5x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y7E[] = {
  NSPAIR(_ZN3ccc7CC5x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y7E[];
extern void _ZN3ccc7CC5x2y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y73abcEv,_ZThn4_N3ccc7CC5x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y73pqrEv,_ZThn4_N3ccc7CC5x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y73abcEv,_ZThn4_N3ccc7CC5x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y73pqrEv,_ZThn4_N3ccc7CC5x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y7E[];
Class_Descriptor cd__ZN3ccc7CC5x2y7E = {  "_ZN3ccc7CC5x2y7E", // class name
  bases__ZN3ccc7CC5x2y7E, 2,
  &(vtc__ZN3ccc7CC5x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y8  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x2y83abcEv
  ~CC5x2y8(); // tgen
  CC5x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y8E) C1{ BC2{ v3 v1 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y83efgEv");}
void  ccc::CC5x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x2y83abcEv");}
ccc::CC5x2y8 ::~CC5x2y8(){ note_dtor("_ZN3ccc7CC5x2y8E", this);} // tgen
ccc::CC5x2y8 ::CC5x2y8(){ note_ctor("_ZN3ccc7CC5x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y8E, buf);
    ::ccc::CC5x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y8E);
    dp->::ccc::CC5x2y8::~CC5x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y8E(Test__ZN3ccc7CC5x2y8E, "_ZN3ccc7CC5x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y8C1Ev();
extern void _ZN3ccc7CC5x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y8E[] = {
  NSPAIR(_ZN3ccc7CC5x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x2y83efgEv();
extern void _ZN3ccc7CC5x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y83efgEv,_ZThn4_N3ccc7CC5x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y83abcEv,_ZThn4_N3ccc7CC5x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y83efgEv,_ZThn4_N3ccc7CC5x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y83abcEv,_ZThn4_N3ccc7CC5x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y8E[];
Class_Descriptor cd__ZN3ccc7CC5x2y8E = {  "_ZN3ccc7CC5x2y8E", // class name
  bases__ZN3ccc7CC5x2y8E, 2,
  &(vtc__ZN3ccc7CC5x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y9  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC5x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x2y93pqrEv
  ~CC5x2y9(); // tgen
  CC5x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x2y9E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x2y93efgEv");}
void  ccc::CC5x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x2y93pqrEv");}
ccc::CC5x2y9 ::~CC5x2y9(){ note_dtor("_ZN3ccc7CC5x2y9E", this);} // tgen
ccc::CC5x2y9 ::CC5x2y9(){ note_ctor("_ZN3ccc7CC5x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x2y9E, buf);
    ::ccc::CC5x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x2y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7CC5x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x2y9E);
    dp->::ccc::CC5x2y9::~CC5x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x2y9E(Test__ZN3ccc7CC5x2y9E, "_ZN3ccc7CC5x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x2y9C1Ev();
extern void _ZN3ccc7CC5x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x2y9E[] = {
  NSPAIR(_ZN3ccc7CC5x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC5x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y9E[];
extern void _ZN3ccc7CC5x2y93pqrEv();
extern void _ZN3ccc7CC5x2y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y93efgEv,_ZThn4_N3ccc7CC5x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x2y93pqrEv,_ZThn4_N3ccc7CC5x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y93efgEv,_ZThn4_N3ccc7CC5x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x2y93pqrEv,_ZThn4_N3ccc7CC5x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x2y9E[];
Class_Descriptor cd__ZN3ccc7CC5x2y9E = {  "_ZN3ccc7CC5x2y9E", // class name
  bases__ZN3ccc7CC5x2y9E, 2,
  &(vtc__ZN3ccc7CC5x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y10  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x2y103abcEv
  ~CC5x2y10(); // tgen
  CC5x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y10E) C1{ BC2{ v1 v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y103pqrEv");}
void  ccc::CC5x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x2y103abcEv");}
ccc::CC5x2y10 ::~CC5x2y10(){ note_dtor("_ZN3ccc8CC5x2y10E", this);} // tgen
ccc::CC5x2y10 ::CC5x2y10(){ note_ctor("_ZN3ccc8CC5x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y10E, buf);
    ::ccc::CC5x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y10E);
    dp->::ccc::CC5x2y10::~CC5x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y10E(Test__ZN3ccc8CC5x2y10E, "_ZN3ccc8CC5x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y10C1Ev();
extern void _ZN3ccc8CC5x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y10E[] = {
  NSPAIR(_ZN3ccc8CC5x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y10E[];
extern void _ZN3ccc8CC5x2y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y103abcEv,_ZThn4_N3ccc8CC5x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y103pqrEv,_ZThn4_N3ccc8CC5x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y103abcEv,_ZThn4_N3ccc8CC5x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y103pqrEv,_ZThn4_N3ccc8CC5x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y10E[];
Class_Descriptor cd__ZN3ccc8CC5x2y10E = {  "_ZN3ccc8CC5x2y10E", // class name
  bases__ZN3ccc8CC5x2y10E, 2,
  &(vtc__ZN3ccc8CC5x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y11  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x2y113efgEv
  ~CC5x2y11(); // tgen
  CC5x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y11E) C1{ BC2{ v1 v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y113pqrEv");}
void  ccc::CC5x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x2y113efgEv");}
ccc::CC5x2y11 ::~CC5x2y11(){ note_dtor("_ZN3ccc8CC5x2y11E", this);} // tgen
ccc::CC5x2y11 ::CC5x2y11(){ note_ctor("_ZN3ccc8CC5x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y11E, buf);
    ::ccc::CC5x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y11E);
    dp->::ccc::CC5x2y11::~CC5x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y11E(Test__ZN3ccc8CC5x2y11E, "_ZN3ccc8CC5x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y11C1Ev();
extern void _ZN3ccc8CC5x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y11E[] = {
  NSPAIR(_ZN3ccc8CC5x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y11E[];
extern void _ZN3ccc8CC5x2y113pqrEv();
extern void _ZN3ccc8CC5x2y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y113efgEv,_ZThn4_N3ccc8CC5x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y113pqrEv,_ZThn4_N3ccc8CC5x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y113efgEv,_ZThn4_N3ccc8CC5x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y113pqrEv,_ZThn4_N3ccc8CC5x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y11E[];
Class_Descriptor cd__ZN3ccc8CC5x2y11E = {  "_ZN3ccc8CC5x2y11E", // class name
  bases__ZN3ccc8CC5x2y11E, 2,
  &(vtc__ZN3ccc8CC5x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y12  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC5x2y123abcEv
  ~CC5x2y12(); // tgen
  CC5x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y12E) C1{ BC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x2y123abcEv");}
ccc::CC5x2y12 ::~CC5x2y12(){ note_dtor("_ZN3ccc8CC5x2y12E", this);} // tgen
ccc::CC5x2y12 ::CC5x2y12(){ note_ctor("_ZN3ccc8CC5x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y12E, buf);
    ::ccc::CC5x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y12E);
    dp->::ccc::CC5x2y12::~CC5x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y12E(Test__ZN3ccc8CC5x2y12E, "_ZN3ccc8CC5x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y12C1Ev();
extern void _ZN3ccc8CC5x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y12E[] = {
  NSPAIR(_ZN3ccc8CC5x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y123abcEv,_ZThn4_N3ccc8CC5x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y123abcEv,_ZThn4_N3ccc8CC5x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y12E[];
Class_Descriptor cd__ZN3ccc8CC5x2y12E = {  "_ZN3ccc8CC5x2y12E", // class name
  bases__ZN3ccc8CC5x2y12E, 2,
  &(vtc__ZN3ccc8CC5x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y13  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC5x2y133efgEv
  ~CC5x2y13(); // tgen
  CC5x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y13E) C1{ BC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x2y133efgEv");}
ccc::CC5x2y13 ::~CC5x2y13(){ note_dtor("_ZN3ccc8CC5x2y13E", this);} // tgen
ccc::CC5x2y13 ::CC5x2y13(){ note_ctor("_ZN3ccc8CC5x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y13E, buf);
    ::ccc::CC5x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y13E);
    dp->::ccc::CC5x2y13::~CC5x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y13E(Test__ZN3ccc8CC5x2y13E, "_ZN3ccc8CC5x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y13C1Ev();
extern void _ZN3ccc8CC5x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y13E[] = {
  NSPAIR(_ZN3ccc8CC5x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x2y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y133efgEv,_ZThn4_N3ccc8CC5x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y133efgEv,_ZThn4_N3ccc8CC5x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y13E[];
Class_Descriptor cd__ZN3ccc8CC5x2y13E = {  "_ZN3ccc8CC5x2y13E", // class name
  bases__ZN3ccc8CC5x2y13E, 2,
  &(vtc__ZN3ccc8CC5x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y14  : ::ccc::AA5 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC5x2y143pqrEv
  ~CC5x2y14(); // tgen
  CC5x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y14E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x2y143pqrEv");}
ccc::CC5x2y14 ::~CC5x2y14(){ note_dtor("_ZN3ccc8CC5x2y14E", this);} // tgen
ccc::CC5x2y14 ::CC5x2y14(){ note_ctor("_ZN3ccc8CC5x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y14E, buf);
    ::ccc::CC5x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y14E);
    dp->::ccc::CC5x2y14::~CC5x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y14E(Test__ZN3ccc8CC5x2y14E, "_ZN3ccc8CC5x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y14C1Ev();
extern void _ZN3ccc8CC5x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y14E[] = {
  NSPAIR(_ZN3ccc8CC5x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y14E[];
extern void _ZN3ccc8CC5x2y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x2y143pqrEv,_ZThn4_N3ccc8CC5x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x2y143pqrEv,_ZThn4_N3ccc8CC5x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y14E[];
Class_Descriptor cd__ZN3ccc8CC5x2y14E = {  "_ZN3ccc8CC5x2y14E", // class name
  bases__ZN3ccc8CC5x2y14E, 2,
  &(vtc__ZN3ccc8CC5x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x2y15  : ::ccc::AA5 , ::ccc::BB2 {
  ~CC5x2y15(); // tgen
  CC5x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x2y15E) C1{ BC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x2y15 ::~CC5x2y15(){ note_dtor("_ZN3ccc8CC5x2y15E", this);} // tgen
ccc::CC5x2y15 ::CC5x2y15(){ note_ctor("_ZN3ccc8CC5x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x2y15E, buf);
    ::ccc::CC5x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x2y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC5x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x2y15E);
    dp->::ccc::CC5x2y15::~CC5x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x2y15E(Test__ZN3ccc8CC5x2y15E, "_ZN3ccc8CC5x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x2y15C1Ev();
extern void _ZN3ccc8CC5x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x2y15E[] = {
  NSPAIR(_ZN3ccc8CC5x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC5x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x2y15E[];
Class_Descriptor cd__ZN3ccc8CC5x2y15E = {  "_ZN3ccc8CC5x2y15E", // class name
  bases__ZN3ccc8CC5x2y15E, 2,
  &(vtc__ZN3ccc8CC5x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x2y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y0  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y03pqrEv
  ~CC5x3y0(); // tgen
  CC5x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y0E) C1{ BC2{ v3 v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y03abcEv");}
void  ccc::CC5x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y03efgEv");}
void  ccc::CC5x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y03pqrEv");}
ccc::CC5x3y0 ::~CC5x3y0(){ note_dtor("_ZN3ccc7CC5x3y0E", this);} // tgen
ccc::CC5x3y0 ::CC5x3y0(){ note_ctor("_ZN3ccc7CC5x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y0E, buf);
    ::ccc::CC5x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC5x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y0E);
    dp->::ccc::CC5x3y0::~CC5x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y0E(Test__ZN3ccc7CC5x3y0E, "_ZN3ccc7CC5x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y0C1Ev();
extern void _ZN3ccc7CC5x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y0E[] = {
  NSPAIR(_ZN3ccc7CC5x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC5x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y0E[];
extern void _ZN3ccc7CC5x3y03pqrEv();
extern void _ZN3ccc7CC5x3y03efgEv();
extern void _ZN3ccc7CC5x3y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03efgEv,_ZThn4_N3ccc7CC5x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03pqrEv,_ZThn4_N3ccc7CC5x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y03abcEv,_ZThn4_N3ccc7CC5x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y03efgEv,_ZThn4_N3ccc7CC5x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y03pqrEv,_ZThn4_N3ccc7CC5x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y03abcEv,_ZThn4_N3ccc7CC5x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y0E[];
Class_Descriptor cd__ZN3ccc7CC5x3y0E = {  "_ZN3ccc7CC5x3y0E", // class name
  bases__ZN3ccc7CC5x3y0E, 2,
  &(vtc__ZN3ccc7CC5x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y1  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x3y13efgEv
  ~CC5x3y1(); // tgen
  CC5x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y1E) C1{ BC2{ v2 v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y13abcEv");}
void  ccc::CC5x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y13pqrEv");}
void  ccc::CC5x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y13efgEv");}
ccc::CC5x3y1 ::~CC5x3y1(){ note_dtor("_ZN3ccc7CC5x3y1E", this);} // tgen
ccc::CC5x3y1 ::CC5x3y1(){ note_ctor("_ZN3ccc7CC5x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y1E, buf);
    ::ccc::CC5x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7CC5x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7CC5x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y1E);
    dp->::ccc::CC5x3y1::~CC5x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y1E(Test__ZN3ccc7CC5x3y1E, "_ZN3ccc7CC5x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y1C1Ev();
extern void _ZN3ccc7CC5x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y1E[] = {
  NSPAIR(_ZN3ccc7CC5x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC5x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y1E[];
extern void _ZN3ccc7CC5x3y13pqrEv();
extern void _ZN3ccc7CC5x3y13efgEv();
extern void _ZN3ccc7CC5x3y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13efgEv,_ZThn4_N3ccc7CC5x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13pqrEv,_ZThn4_N3ccc7CC5x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y13abcEv,_ZThn4_N3ccc7CC5x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y13efgEv,_ZThn4_N3ccc7CC5x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y13pqrEv,_ZThn4_N3ccc7CC5x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y13abcEv,_ZThn4_N3ccc7CC5x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y1E[];
Class_Descriptor cd__ZN3ccc7CC5x3y1E = {  "_ZN3ccc7CC5x3y1E", // class name
  bases__ZN3ccc7CC5x3y1E, 2,
  &(vtc__ZN3ccc7CC5x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y2  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y23pqrEv
  ~CC5x3y2(); // tgen
  CC5x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y2E[];
extern void _ZN3ccc7CC5x3y23pqrEv();
extern void _ZN3ccc7CC5x3y23efgEv();
extern void _ZN3ccc7CC5x3y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23efgEv,_ZThn4_N3ccc7CC5x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23pqrEv,_ZThn4_N3ccc7CC5x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23abcEv,_ZThn4_N3ccc7CC5x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y23efgEv,_ZThn4_N3ccc7CC5x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y23pqrEv,_ZThn4_N3ccc7CC5x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y23abcEv,_ZThn4_N3ccc7CC5x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y2E[];
Class_Descriptor cd__ZN3ccc7CC5x3y2E = {  "_ZN3ccc7CC5x3y2E", // class name
  bases__ZN3ccc7CC5x3y2E, 2,
  &(vtc__ZN3ccc7CC5x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y3  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x3y33abcEv
  ~CC5x3y3(); // tgen
  CC5x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y3E[];
extern void _ZN3ccc7CC5x3y33pqrEv();
extern void _ZN3ccc7CC5x3y33efgEv();
extern void _ZN3ccc7CC5x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33efgEv,_ZThn4_N3ccc7CC5x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33pqrEv,_ZThn4_N3ccc7CC5x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33abcEv,_ZThn4_N3ccc7CC5x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y33efgEv,_ZThn4_N3ccc7CC5x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y33pqrEv,_ZThn4_N3ccc7CC5x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y33abcEv,_ZThn4_N3ccc7CC5x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y3E[];
Class_Descriptor cd__ZN3ccc7CC5x3y3E = {  "_ZN3ccc7CC5x3y3E", // class name
  bases__ZN3ccc7CC5x3y3E, 2,
  &(vtc__ZN3ccc7CC5x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y4  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC5x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y43efgEv
  ~CC5x3y4(); // tgen
  CC5x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y4E[];
extern void _ZN3ccc7CC5x3y43pqrEv();
extern void _ZN3ccc7CC5x3y43efgEv();
extern void _ZN3ccc7CC5x3y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43efgEv,_ZThn4_N3ccc7CC5x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43pqrEv,_ZThn4_N3ccc7CC5x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43abcEv,_ZThn4_N3ccc7CC5x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y43efgEv,_ZThn4_N3ccc7CC5x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y43pqrEv,_ZThn4_N3ccc7CC5x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y43abcEv,_ZThn4_N3ccc7CC5x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y4E[];
Class_Descriptor cd__ZN3ccc7CC5x3y4E = {  "_ZN3ccc7CC5x3y4E", // class name
  bases__ZN3ccc7CC5x3y4E, 2,
  &(vtc__ZN3ccc7CC5x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y5  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC5x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y53abcEv
  ~CC5x3y5(); // tgen
  CC5x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y5E[];
extern void _ZN3ccc7CC5x3y53pqrEv();
extern void _ZN3ccc7CC5x3y53efgEv();
extern void _ZN3ccc7CC5x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53efgEv,_ZThn4_N3ccc7CC5x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53pqrEv,_ZThn4_N3ccc7CC5x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53abcEv,_ZThn4_N3ccc7CC5x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y53efgEv,_ZThn4_N3ccc7CC5x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y53pqrEv,_ZThn4_N3ccc7CC5x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y53abcEv,_ZThn4_N3ccc7CC5x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y5E[];
Class_Descriptor cd__ZN3ccc7CC5x3y5E = {  "_ZN3ccc7CC5x3y5E", // class name
  bases__ZN3ccc7CC5x3y5E, 2,
  &(vtc__ZN3ccc7CC5x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y6  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y63efgEv
  ~CC5x3y6(); // tgen
  CC5x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x3y63efgEv();
extern void _ZN3ccc7CC5x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y63efgEv,_ZThn4_N3ccc7CC5x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y63abcEv,_ZThn4_N3ccc7CC5x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y63efgEv,_ZThn4_N3ccc7CC5x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y63abcEv,_ZThn4_N3ccc7CC5x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y6E[];
Class_Descriptor cd__ZN3ccc7CC5x3y6E = {  "_ZN3ccc7CC5x3y6E", // class name
  bases__ZN3ccc7CC5x3y6E, 2,
  &(vtc__ZN3ccc7CC5x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y7  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y73pqrEv
  ~CC5x3y7(); // tgen
  CC5x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y7E[];
extern void _ZN3ccc7CC5x3y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y73pqrEv,_ZThn4_N3ccc7CC5x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y73abcEv,_ZThn4_N3ccc7CC5x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y73pqrEv,_ZThn4_N3ccc7CC5x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y73abcEv,_ZThn4_N3ccc7CC5x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y7E[];
Class_Descriptor cd__ZN3ccc7CC5x3y7E = {  "_ZN3ccc7CC5x3y7E", // class name
  bases__ZN3ccc7CC5x3y7E, 2,
  &(vtc__ZN3ccc7CC5x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y8  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y83abcEv
  ~CC5x3y8(); // tgen
  CC5x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x3y83efgEv();
extern void _ZN3ccc7CC5x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y83efgEv,_ZThn4_N3ccc7CC5x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y83abcEv,_ZThn4_N3ccc7CC5x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y83efgEv,_ZThn4_N3ccc7CC5x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y83abcEv,_ZThn4_N3ccc7CC5x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y8E[];
Class_Descriptor cd__ZN3ccc7CC5x3y8E = {  "_ZN3ccc7CC5x3y8E", // class name
  bases__ZN3ccc7CC5x3y8E, 2,
  &(vtc__ZN3ccc7CC5x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y9  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y93pqrEv
  ~CC5x3y9(); // tgen
  CC5x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y9E[];
extern void _ZN3ccc7CC5x3y93pqrEv();
extern void _ZN3ccc7CC5x3y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y93efgEv,_ZThn4_N3ccc7CC5x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y93pqrEv,_ZThn4_N3ccc7CC5x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y93efgEv,_ZThn4_N3ccc7CC5x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x3y93pqrEv,_ZThn4_N3ccc7CC5x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y9E[];
Class_Descriptor cd__ZN3ccc7CC5x3y9E = {  "_ZN3ccc7CC5x3y9E", // class name
  bases__ZN3ccc7CC5x3y9E, 2,
  &(vtc__ZN3ccc7CC5x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y10  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x3y103abcEv
  ~CC5x3y10(); // tgen
  CC5x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y10E[];
extern void _ZN3ccc8CC5x3y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y103pqrEv,_ZThn4_N3ccc8CC5x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y103abcEv,_ZThn4_N3ccc8CC5x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y103pqrEv,_ZThn4_N3ccc8CC5x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y103abcEv,_ZThn4_N3ccc8CC5x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y10E[];
Class_Descriptor cd__ZN3ccc8CC5x3y10E = {  "_ZN3ccc8CC5x3y10E", // class name
  bases__ZN3ccc8CC5x3y10E, 2,
  &(vtc__ZN3ccc8CC5x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y11  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x3y113efgEv
  ~CC5x3y11(); // tgen
  CC5x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y11E[];
extern void _ZN3ccc8CC5x3y113pqrEv();
extern void _ZN3ccc8CC5x3y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y113efgEv,_ZThn4_N3ccc8CC5x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y113pqrEv,_ZThn4_N3ccc8CC5x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y113efgEv,_ZThn4_N3ccc8CC5x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y113pqrEv,_ZThn4_N3ccc8CC5x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y11E[];
Class_Descriptor cd__ZN3ccc8CC5x3y11E = {  "_ZN3ccc8CC5x3y11E", // class name
  bases__ZN3ccc8CC5x3y11E, 2,
  &(vtc__ZN3ccc8CC5x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y12  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC5x3y123abcEv
  ~CC5x3y12(); // tgen
  CC5x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y123abcEv,_ZThn4_N3ccc8CC5x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y123abcEv,_ZThn4_N3ccc8CC5x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y12E[];
Class_Descriptor cd__ZN3ccc8CC5x3y12E = {  "_ZN3ccc8CC5x3y12E", // class name
  bases__ZN3ccc8CC5x3y12E, 2,
  &(vtc__ZN3ccc8CC5x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y13  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC5x3y133efgEv
  ~CC5x3y13(); // tgen
  CC5x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x3y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y133efgEv,_ZThn4_N3ccc8CC5x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y133efgEv,_ZThn4_N3ccc8CC5x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y13E[];
Class_Descriptor cd__ZN3ccc8CC5x3y13E = {  "_ZN3ccc8CC5x3y13E", // class name
  bases__ZN3ccc8CC5x3y13E, 2,
  &(vtc__ZN3ccc8CC5x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y14  : ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y143pqrEv
  ~CC5x3y14(); // tgen
  CC5x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y14E[];
extern void _ZN3ccc8CC5x3y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y143pqrEv,_ZThn4_N3ccc8CC5x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x3y143pqrEv,_ZThn4_N3ccc8CC5x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y14E[];
Class_Descriptor cd__ZN3ccc8CC5x3y14E = {  "_ZN3ccc8CC5x3y14E", // class name
  bases__ZN3ccc8CC5x3y14E, 2,
  &(vtc__ZN3ccc8CC5x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x3y15  : ::ccc::AA5 , ::ccc::BB3 {
  ~CC5x3y15(); // tgen
  CC5x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y15E[];
Class_Descriptor cd__ZN3ccc8CC5x3y15E = {  "_ZN3ccc8CC5x3y15E", // class name
  bases__ZN3ccc8CC5x3y15E, 2,
  &(vtc__ZN3ccc8CC5x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y0  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y03pqrEv
  ~CC5x4y0(); // tgen
  CC5x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y0E[];
extern void _ZN3ccc7CC5x4y03pqrEv();
extern void _ZN3ccc7CC5x4y03efgEv();
extern void _ZN3ccc7CC5x4y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03pqrEv,_ZThn4_N3ccc7CC5x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03abcEv,_ZThn4_N3ccc7CC5x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03efgEv,_ZThn4_N3ccc7CC5x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y03pqrEv,_ZThn4_N3ccc7CC5x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y03abcEv,_ZThn4_N3ccc7CC5x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y03efgEv,_ZThn4_N3ccc7CC5x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y0E[];
Class_Descriptor cd__ZN3ccc7CC5x4y0E = {  "_ZN3ccc7CC5x4y0E", // class name
  bases__ZN3ccc7CC5x4y0E, 2,
  &(vtc__ZN3ccc7CC5x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y1  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x4y13efgEv
  ~CC5x4y1(); // tgen
  CC5x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y1E[];
extern void _ZN3ccc7CC5x4y13pqrEv();
extern void _ZN3ccc7CC5x4y13efgEv();
extern void _ZN3ccc7CC5x4y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13pqrEv,_ZThn4_N3ccc7CC5x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13abcEv,_ZThn4_N3ccc7CC5x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13efgEv,_ZThn4_N3ccc7CC5x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y13pqrEv,_ZThn4_N3ccc7CC5x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y13abcEv,_ZThn4_N3ccc7CC5x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y13efgEv,_ZThn4_N3ccc7CC5x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y1E[];
Class_Descriptor cd__ZN3ccc7CC5x4y1E = {  "_ZN3ccc7CC5x4y1E", // class name
  bases__ZN3ccc7CC5x4y1E, 2,
  &(vtc__ZN3ccc7CC5x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y2  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y23pqrEv
  ~CC5x4y2(); // tgen
  CC5x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y2E[];
extern void _ZN3ccc7CC5x4y23pqrEv();
extern void _ZN3ccc7CC5x4y23efgEv();
extern void _ZN3ccc7CC5x4y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23pqrEv,_ZThn4_N3ccc7CC5x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23abcEv,_ZThn4_N3ccc7CC5x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23efgEv,_ZThn4_N3ccc7CC5x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y23pqrEv,_ZThn4_N3ccc7CC5x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y23abcEv,_ZThn4_N3ccc7CC5x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y23efgEv,_ZThn4_N3ccc7CC5x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y2E[];
Class_Descriptor cd__ZN3ccc7CC5x4y2E = {  "_ZN3ccc7CC5x4y2E", // class name
  bases__ZN3ccc7CC5x4y2E, 2,
  &(vtc__ZN3ccc7CC5x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y3  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x4y33abcEv
  ~CC5x4y3(); // tgen
  CC5x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y3E[];
extern void _ZN3ccc7CC5x4y33pqrEv();
extern void _ZN3ccc7CC5x4y33efgEv();
extern void _ZN3ccc7CC5x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33pqrEv,_ZThn4_N3ccc7CC5x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33abcEv,_ZThn4_N3ccc7CC5x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33efgEv,_ZThn4_N3ccc7CC5x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y33pqrEv,_ZThn4_N3ccc7CC5x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y33abcEv,_ZThn4_N3ccc7CC5x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y33efgEv,_ZThn4_N3ccc7CC5x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y3E[];
Class_Descriptor cd__ZN3ccc7CC5x4y3E = {  "_ZN3ccc7CC5x4y3E", // class name
  bases__ZN3ccc7CC5x4y3E, 2,
  &(vtc__ZN3ccc7CC5x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y4  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC5x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y43efgEv
  ~CC5x4y4(); // tgen
  CC5x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y4E[];
extern void _ZN3ccc7CC5x4y43pqrEv();
extern void _ZN3ccc7CC5x4y43efgEv();
extern void _ZN3ccc7CC5x4y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43pqrEv,_ZThn4_N3ccc7CC5x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43abcEv,_ZThn4_N3ccc7CC5x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43efgEv,_ZThn4_N3ccc7CC5x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y43pqrEv,_ZThn4_N3ccc7CC5x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y43abcEv,_ZThn4_N3ccc7CC5x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y43efgEv,_ZThn4_N3ccc7CC5x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y4E[];
Class_Descriptor cd__ZN3ccc7CC5x4y4E = {  "_ZN3ccc7CC5x4y4E", // class name
  bases__ZN3ccc7CC5x4y4E, 2,
  &(vtc__ZN3ccc7CC5x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y5  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC5x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y53abcEv
  ~CC5x4y5(); // tgen
  CC5x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y5E[];
extern void _ZN3ccc7CC5x4y53pqrEv();
extern void _ZN3ccc7CC5x4y53efgEv();
extern void _ZN3ccc7CC5x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53pqrEv,_ZThn4_N3ccc7CC5x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53abcEv,_ZThn4_N3ccc7CC5x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53efgEv,_ZThn4_N3ccc7CC5x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y53pqrEv,_ZThn4_N3ccc7CC5x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y53abcEv,_ZThn4_N3ccc7CC5x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y53efgEv,_ZThn4_N3ccc7CC5x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y5E[];
Class_Descriptor cd__ZN3ccc7CC5x4y5E = {  "_ZN3ccc7CC5x4y5E", // class name
  bases__ZN3ccc7CC5x4y5E, 2,
  &(vtc__ZN3ccc7CC5x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y6  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y63efgEv
  ~CC5x4y6(); // tgen
  CC5x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x4y63efgEv();
extern void _ZN3ccc7CC5x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y63abcEv,_ZThn4_N3ccc7CC5x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y63efgEv,_ZThn4_N3ccc7CC5x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y63abcEv,_ZThn4_N3ccc7CC5x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y63efgEv,_ZThn4_N3ccc7CC5x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y6E[];
Class_Descriptor cd__ZN3ccc7CC5x4y6E = {  "_ZN3ccc7CC5x4y6E", // class name
  bases__ZN3ccc7CC5x4y6E, 2,
  &(vtc__ZN3ccc7CC5x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y7  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y73pqrEv
  ~CC5x4y7(); // tgen
  CC5x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y7E[];
extern void _ZN3ccc7CC5x4y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y73pqrEv,_ZThn4_N3ccc7CC5x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y73abcEv,_ZThn4_N3ccc7CC5x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y73pqrEv,_ZThn4_N3ccc7CC5x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y73abcEv,_ZThn4_N3ccc7CC5x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y7E[];
Class_Descriptor cd__ZN3ccc7CC5x4y7E = {  "_ZN3ccc7CC5x4y7E", // class name
  bases__ZN3ccc7CC5x4y7E, 2,
  &(vtc__ZN3ccc7CC5x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y8  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y83abcEv
  ~CC5x4y8(); // tgen
  CC5x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x4y83efgEv();
extern void _ZN3ccc7CC5x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y83abcEv,_ZThn4_N3ccc7CC5x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y83efgEv,_ZThn4_N3ccc7CC5x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y83abcEv,_ZThn4_N3ccc7CC5x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y83efgEv,_ZThn4_N3ccc7CC5x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y8E[];
Class_Descriptor cd__ZN3ccc7CC5x4y8E = {  "_ZN3ccc7CC5x4y8E", // class name
  bases__ZN3ccc7CC5x4y8E, 2,
  &(vtc__ZN3ccc7CC5x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y9  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y93pqrEv
  ~CC5x4y9(); // tgen
  CC5x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y9E[];
extern void _ZN3ccc7CC5x4y93pqrEv();
extern void _ZN3ccc7CC5x4y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y93pqrEv,_ZThn4_N3ccc7CC5x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y93efgEv,_ZThn4_N3ccc7CC5x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y93pqrEv,_ZThn4_N3ccc7CC5x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x4y93efgEv,_ZThn4_N3ccc7CC5x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y9E[];
Class_Descriptor cd__ZN3ccc7CC5x4y9E = {  "_ZN3ccc7CC5x4y9E", // class name
  bases__ZN3ccc7CC5x4y9E, 2,
  &(vtc__ZN3ccc7CC5x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y10  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x4y103abcEv
  ~CC5x4y10(); // tgen
  CC5x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y10E[];
extern void _ZN3ccc8CC5x4y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y103pqrEv,_ZThn4_N3ccc8CC5x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y103abcEv,_ZThn4_N3ccc8CC5x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y103pqrEv,_ZThn4_N3ccc8CC5x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y103abcEv,_ZThn4_N3ccc8CC5x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y10E[];
Class_Descriptor cd__ZN3ccc8CC5x4y10E = {  "_ZN3ccc8CC5x4y10E", // class name
  bases__ZN3ccc8CC5x4y10E, 2,
  &(vtc__ZN3ccc8CC5x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y11  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x4y113efgEv
  ~CC5x4y11(); // tgen
  CC5x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y11E[];
extern void _ZN3ccc8CC5x4y113pqrEv();
extern void _ZN3ccc8CC5x4y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y113pqrEv,_ZThn4_N3ccc8CC5x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y113efgEv,_ZThn4_N3ccc8CC5x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y113pqrEv,_ZThn4_N3ccc8CC5x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y113efgEv,_ZThn4_N3ccc8CC5x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y11E[];
Class_Descriptor cd__ZN3ccc8CC5x4y11E = {  "_ZN3ccc8CC5x4y11E", // class name
  bases__ZN3ccc8CC5x4y11E, 2,
  &(vtc__ZN3ccc8CC5x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y12  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC5x4y123abcEv
  ~CC5x4y12(); // tgen
  CC5x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y123abcEv,_ZThn4_N3ccc8CC5x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y123abcEv,_ZThn4_N3ccc8CC5x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y12E[];
Class_Descriptor cd__ZN3ccc8CC5x4y12E = {  "_ZN3ccc8CC5x4y12E", // class name
  bases__ZN3ccc8CC5x4y12E, 2,
  &(vtc__ZN3ccc8CC5x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y13  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC5x4y133efgEv
  ~CC5x4y13(); // tgen
  CC5x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x4y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y133efgEv,_ZThn4_N3ccc8CC5x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y133efgEv,_ZThn4_N3ccc8CC5x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y13E[];
Class_Descriptor cd__ZN3ccc8CC5x4y13E = {  "_ZN3ccc8CC5x4y13E", // class name
  bases__ZN3ccc8CC5x4y13E, 2,
  &(vtc__ZN3ccc8CC5x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y14  : ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y143pqrEv
  ~CC5x4y14(); // tgen
  CC5x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y14E[];
extern void _ZN3ccc8CC5x4y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y143pqrEv,_ZThn4_N3ccc8CC5x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x4y143pqrEv,_ZThn4_N3ccc8CC5x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y14E[];
Class_Descriptor cd__ZN3ccc8CC5x4y14E = {  "_ZN3ccc8CC5x4y14E", // class name
  bases__ZN3ccc8CC5x4y14E, 2,
  &(vtc__ZN3ccc8CC5x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x4y15  : ::ccc::AA5 , ::ccc::BB4 {
  ~CC5x4y15(); // tgen
  CC5x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y15E[];
Class_Descriptor cd__ZN3ccc8CC5x4y15E = {  "_ZN3ccc8CC5x4y15E", // class name
  bases__ZN3ccc8CC5x4y15E, 2,
  &(vtc__ZN3ccc8CC5x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y0  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y03pqrEv
  ~CC5x5y0(); // tgen
  CC5x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y0E[];
extern void _ZN3ccc7CC5x5y03pqrEv();
extern void _ZN3ccc7CC5x5y03efgEv();
extern void _ZN3ccc7CC5x5y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03pqrEv,_ZThn4_N3ccc7CC5x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03efgEv,_ZThn4_N3ccc7CC5x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03abcEv,_ZThn4_N3ccc7CC5x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y03pqrEv,_ZThn4_N3ccc7CC5x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y03efgEv,_ZThn4_N3ccc7CC5x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y03abcEv,_ZThn4_N3ccc7CC5x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y0E[];
Class_Descriptor cd__ZN3ccc7CC5x5y0E = {  "_ZN3ccc7CC5x5y0E", // class name
  bases__ZN3ccc7CC5x5y0E, 2,
  &(vtc__ZN3ccc7CC5x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y1  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x5y13efgEv
  ~CC5x5y1(); // tgen
  CC5x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y1E[];
extern void _ZN3ccc7CC5x5y13pqrEv();
extern void _ZN3ccc7CC5x5y13efgEv();
extern void _ZN3ccc7CC5x5y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13pqrEv,_ZThn4_N3ccc7CC5x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13efgEv,_ZThn4_N3ccc7CC5x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13abcEv,_ZThn4_N3ccc7CC5x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y13pqrEv,_ZThn4_N3ccc7CC5x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y13efgEv,_ZThn4_N3ccc7CC5x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y13abcEv,_ZThn4_N3ccc7CC5x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y1E[];
Class_Descriptor cd__ZN3ccc7CC5x5y1E = {  "_ZN3ccc7CC5x5y1E", // class name
  bases__ZN3ccc7CC5x5y1E, 2,
  &(vtc__ZN3ccc7CC5x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y2  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y23pqrEv
  ~CC5x5y2(); // tgen
  CC5x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y2E[];
extern void _ZN3ccc7CC5x5y23pqrEv();
extern void _ZN3ccc7CC5x5y23efgEv();
extern void _ZN3ccc7CC5x5y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23pqrEv,_ZThn4_N3ccc7CC5x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23efgEv,_ZThn4_N3ccc7CC5x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23abcEv,_ZThn4_N3ccc7CC5x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y23pqrEv,_ZThn4_N3ccc7CC5x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y23efgEv,_ZThn4_N3ccc7CC5x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y23abcEv,_ZThn4_N3ccc7CC5x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y2E[];
Class_Descriptor cd__ZN3ccc7CC5x5y2E = {  "_ZN3ccc7CC5x5y2E", // class name
  bases__ZN3ccc7CC5x5y2E, 2,
  &(vtc__ZN3ccc7CC5x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y3  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x5y33abcEv
  ~CC5x5y3(); // tgen
  CC5x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y3E[];
extern void _ZN3ccc7CC5x5y33pqrEv();
extern void _ZN3ccc7CC5x5y33efgEv();
extern void _ZN3ccc7CC5x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33pqrEv,_ZThn4_N3ccc7CC5x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33efgEv,_ZThn4_N3ccc7CC5x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33abcEv,_ZThn4_N3ccc7CC5x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y33pqrEv,_ZThn4_N3ccc7CC5x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y33efgEv,_ZThn4_N3ccc7CC5x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y33abcEv,_ZThn4_N3ccc7CC5x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y3E[];
Class_Descriptor cd__ZN3ccc7CC5x5y3E = {  "_ZN3ccc7CC5x5y3E", // class name
  bases__ZN3ccc7CC5x5y3E, 2,
  &(vtc__ZN3ccc7CC5x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y4  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC5x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y43efgEv
  ~CC5x5y4(); // tgen
  CC5x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y4E[];
extern void _ZN3ccc7CC5x5y43pqrEv();
extern void _ZN3ccc7CC5x5y43efgEv();
extern void _ZN3ccc7CC5x5y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43pqrEv,_ZThn4_N3ccc7CC5x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43efgEv,_ZThn4_N3ccc7CC5x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43abcEv,_ZThn4_N3ccc7CC5x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y43pqrEv,_ZThn4_N3ccc7CC5x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y43efgEv,_ZThn4_N3ccc7CC5x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y43abcEv,_ZThn4_N3ccc7CC5x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y4E[];
Class_Descriptor cd__ZN3ccc7CC5x5y4E = {  "_ZN3ccc7CC5x5y4E", // class name
  bases__ZN3ccc7CC5x5y4E, 2,
  &(vtc__ZN3ccc7CC5x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y5  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC5x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y53abcEv
  ~CC5x5y5(); // tgen
  CC5x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y5E[];
extern void _ZN3ccc7CC5x5y53pqrEv();
extern void _ZN3ccc7CC5x5y53efgEv();
extern void _ZN3ccc7CC5x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53pqrEv,_ZThn4_N3ccc7CC5x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53efgEv,_ZThn4_N3ccc7CC5x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53abcEv,_ZThn4_N3ccc7CC5x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y53pqrEv,_ZThn4_N3ccc7CC5x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y53efgEv,_ZThn4_N3ccc7CC5x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y53abcEv,_ZThn4_N3ccc7CC5x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y5E[];
Class_Descriptor cd__ZN3ccc7CC5x5y5E = {  "_ZN3ccc7CC5x5y5E", // class name
  bases__ZN3ccc7CC5x5y5E, 2,
  &(vtc__ZN3ccc7CC5x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y6  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y63efgEv
  ~CC5x5y6(); // tgen
  CC5x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x5y63efgEv();
extern void _ZN3ccc7CC5x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y63efgEv,_ZThn4_N3ccc7CC5x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y63abcEv,_ZThn4_N3ccc7CC5x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y63efgEv,_ZThn4_N3ccc7CC5x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y63abcEv,_ZThn4_N3ccc7CC5x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y6E[];
Class_Descriptor cd__ZN3ccc7CC5x5y6E = {  "_ZN3ccc7CC5x5y6E", // class name
  bases__ZN3ccc7CC5x5y6E, 2,
  &(vtc__ZN3ccc7CC5x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y7  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y73pqrEv
  ~CC5x5y7(); // tgen
  CC5x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y7E[];
extern void _ZN3ccc7CC5x5y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y73pqrEv,_ZThn4_N3ccc7CC5x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y73abcEv,_ZThn4_N3ccc7CC5x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y73pqrEv,_ZThn4_N3ccc7CC5x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y73abcEv,_ZThn4_N3ccc7CC5x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y7E[];
Class_Descriptor cd__ZN3ccc7CC5x5y7E = {  "_ZN3ccc7CC5x5y7E", // class name
  bases__ZN3ccc7CC5x5y7E, 2,
  &(vtc__ZN3ccc7CC5x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y8  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y83abcEv
  ~CC5x5y8(); // tgen
  CC5x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x5y83efgEv();
extern void _ZN3ccc7CC5x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y83efgEv,_ZThn4_N3ccc7CC5x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y83abcEv,_ZThn4_N3ccc7CC5x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y83efgEv,_ZThn4_N3ccc7CC5x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y83abcEv,_ZThn4_N3ccc7CC5x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y8E[];
Class_Descriptor cd__ZN3ccc7CC5x5y8E = {  "_ZN3ccc7CC5x5y8E", // class name
  bases__ZN3ccc7CC5x5y8E, 2,
  &(vtc__ZN3ccc7CC5x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y9  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y93pqrEv
  ~CC5x5y9(); // tgen
  CC5x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y9E[];
extern void _ZN3ccc7CC5x5y93pqrEv();
extern void _ZN3ccc7CC5x5y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y93pqrEv,_ZThn4_N3ccc7CC5x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y93efgEv,_ZThn4_N3ccc7CC5x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y93pqrEv,_ZThn4_N3ccc7CC5x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x5y93efgEv,_ZThn4_N3ccc7CC5x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y9E[];
Class_Descriptor cd__ZN3ccc7CC5x5y9E = {  "_ZN3ccc7CC5x5y9E", // class name
  bases__ZN3ccc7CC5x5y9E, 2,
  &(vtc__ZN3ccc7CC5x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y10  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x5y103abcEv
  ~CC5x5y10(); // tgen
  CC5x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y10E[];
extern void _ZN3ccc8CC5x5y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y103pqrEv,_ZThn4_N3ccc8CC5x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y103abcEv,_ZThn4_N3ccc8CC5x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y103pqrEv,_ZThn4_N3ccc8CC5x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y103abcEv,_ZThn4_N3ccc8CC5x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y10E[];
Class_Descriptor cd__ZN3ccc8CC5x5y10E = {  "_ZN3ccc8CC5x5y10E", // class name
  bases__ZN3ccc8CC5x5y10E, 2,
  &(vtc__ZN3ccc8CC5x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y11  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x5y113efgEv
  ~CC5x5y11(); // tgen
  CC5x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y11E[];
extern void _ZN3ccc8CC5x5y113pqrEv();
extern void _ZN3ccc8CC5x5y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y113pqrEv,_ZThn4_N3ccc8CC5x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y113efgEv,_ZThn4_N3ccc8CC5x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y113pqrEv,_ZThn4_N3ccc8CC5x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y113efgEv,_ZThn4_N3ccc8CC5x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y11E[];
Class_Descriptor cd__ZN3ccc8CC5x5y11E = {  "_ZN3ccc8CC5x5y11E", // class name
  bases__ZN3ccc8CC5x5y11E, 2,
  &(vtc__ZN3ccc8CC5x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y12  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC5x5y123abcEv
  ~CC5x5y12(); // tgen
  CC5x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y123abcEv,_ZThn4_N3ccc8CC5x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y123abcEv,_ZThn4_N3ccc8CC5x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y12E[];
Class_Descriptor cd__ZN3ccc8CC5x5y12E = {  "_ZN3ccc8CC5x5y12E", // class name
  bases__ZN3ccc8CC5x5y12E, 2,
  &(vtc__ZN3ccc8CC5x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y13  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC5x5y133efgEv
  ~CC5x5y13(); // tgen
  CC5x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x5y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y133efgEv,_ZThn4_N3ccc8CC5x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y133efgEv,_ZThn4_N3ccc8CC5x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y13E[];
Class_Descriptor cd__ZN3ccc8CC5x5y13E = {  "_ZN3ccc8CC5x5y13E", // class name
  bases__ZN3ccc8CC5x5y13E, 2,
  &(vtc__ZN3ccc8CC5x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y14  : ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y143pqrEv
  ~CC5x5y14(); // tgen
  CC5x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y14E[];
extern void _ZN3ccc8CC5x5y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y143pqrEv,_ZThn4_N3ccc8CC5x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x5y143pqrEv,_ZThn4_N3ccc8CC5x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y14E[];
Class_Descriptor cd__ZN3ccc8CC5x5y14E = {  "_ZN3ccc8CC5x5y14E", // class name
  bases__ZN3ccc8CC5x5y14E, 2,
  &(vtc__ZN3ccc8CC5x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x5y15  : ::ccc::AA5 , ::ccc::BB5 {
  ~CC5x5y15(); // tgen
  CC5x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y15E[];
Class_Descriptor cd__ZN3ccc8CC5x5y15E = {  "_ZN3ccc8CC5x5y15E", // class name
  bases__ZN3ccc8CC5x5y15E, 2,
  &(vtc__ZN3ccc8CC5x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y15E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y0  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y03pqrEv
  ~CC5x6y0(); // tgen
  CC5x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y0E[];
extern void _ZN3ccc7CC5x6y03pqrEv();
extern void _ZN3ccc7CC5x6y03efgEv();
extern void _ZN3ccc7CC5x6y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y03abcEv,_ZThn4_N3ccc7CC5x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y03efgEv,_ZThn4_N3ccc7CC5x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y03abcEv,_ZThn4_N3ccc7CC5x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y03efgEv,_ZThn4_N3ccc7CC5x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y0E[];
Class_Descriptor cd__ZN3ccc7CC5x6y0E = {  "_ZN3ccc7CC5x6y0E", // class name
  bases__ZN3ccc7CC5x6y0E, 2,
  &(vtc__ZN3ccc7CC5x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y1  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x6y13efgEv
  ~CC5x6y1(); // tgen
  CC5x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y1E[];
extern void _ZN3ccc7CC5x6y13pqrEv();
extern void _ZN3ccc7CC5x6y13efgEv();
extern void _ZN3ccc7CC5x6y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y13abcEv,_ZThn4_N3ccc7CC5x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y13efgEv,_ZThn4_N3ccc7CC5x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y13abcEv,_ZThn4_N3ccc7CC5x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y13efgEv,_ZThn4_N3ccc7CC5x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y1E[];
Class_Descriptor cd__ZN3ccc7CC5x6y1E = {  "_ZN3ccc7CC5x6y1E", // class name
  bases__ZN3ccc7CC5x6y1E, 2,
  &(vtc__ZN3ccc7CC5x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y2  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y23pqrEv
  ~CC5x6y2(); // tgen
  CC5x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y2E[];
extern void _ZN3ccc7CC5x6y23pqrEv();
extern void _ZN3ccc7CC5x6y23efgEv();
extern void _ZN3ccc7CC5x6y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y23abcEv,_ZThn4_N3ccc7CC5x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y23efgEv,_ZThn4_N3ccc7CC5x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y23abcEv,_ZThn4_N3ccc7CC5x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y23efgEv,_ZThn4_N3ccc7CC5x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y2E[];
Class_Descriptor cd__ZN3ccc7CC5x6y2E = {  "_ZN3ccc7CC5x6y2E", // class name
  bases__ZN3ccc7CC5x6y2E, 2,
  &(vtc__ZN3ccc7CC5x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y3  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x6y33abcEv
  ~CC5x6y3(); // tgen
  CC5x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y3E[];
extern void _ZN3ccc7CC5x6y33pqrEv();
extern void _ZN3ccc7CC5x6y33efgEv();
extern void _ZN3ccc7CC5x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y33abcEv,_ZThn4_N3ccc7CC5x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y33efgEv,_ZThn4_N3ccc7CC5x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y33abcEv,_ZThn4_N3ccc7CC5x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y33efgEv,_ZThn4_N3ccc7CC5x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y3E[];
Class_Descriptor cd__ZN3ccc7CC5x6y3E = {  "_ZN3ccc7CC5x6y3E", // class name
  bases__ZN3ccc7CC5x6y3E, 2,
  &(vtc__ZN3ccc7CC5x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y4  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC5x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y43efgEv
  ~CC5x6y4(); // tgen
  CC5x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y4E[];
extern void _ZN3ccc7CC5x6y43pqrEv();
extern void _ZN3ccc7CC5x6y43efgEv();
extern void _ZN3ccc7CC5x6y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y43abcEv,_ZThn4_N3ccc7CC5x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y43efgEv,_ZThn4_N3ccc7CC5x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y43abcEv,_ZThn4_N3ccc7CC5x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y43efgEv,_ZThn4_N3ccc7CC5x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y4E[];
Class_Descriptor cd__ZN3ccc7CC5x6y4E = {  "_ZN3ccc7CC5x6y4E", // class name
  bases__ZN3ccc7CC5x6y4E, 2,
  &(vtc__ZN3ccc7CC5x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y5  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC5x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y53abcEv
  ~CC5x6y5(); // tgen
  CC5x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y5E[];
extern void _ZN3ccc7CC5x6y53pqrEv();
extern void _ZN3ccc7CC5x6y53efgEv();
extern void _ZN3ccc7CC5x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y53abcEv,_ZThn4_N3ccc7CC5x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y53efgEv,_ZThn4_N3ccc7CC5x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y53abcEv,_ZThn4_N3ccc7CC5x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y53efgEv,_ZThn4_N3ccc7CC5x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y5E[];
Class_Descriptor cd__ZN3ccc7CC5x6y5E = {  "_ZN3ccc7CC5x6y5E", // class name
  bases__ZN3ccc7CC5x6y5E, 2,
  &(vtc__ZN3ccc7CC5x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y6  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y63efgEv
  ~CC5x6y6(); // tgen
  CC5x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x6y63efgEv();
extern void _ZN3ccc7CC5x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y63abcEv,_ZThn4_N3ccc7CC5x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y63efgEv,_ZThn4_N3ccc7CC5x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y63abcEv,_ZThn4_N3ccc7CC5x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y63efgEv,_ZThn4_N3ccc7CC5x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y6E[];
Class_Descriptor cd__ZN3ccc7CC5x6y6E = {  "_ZN3ccc7CC5x6y6E", // class name
  bases__ZN3ccc7CC5x6y6E, 2,
  &(vtc__ZN3ccc7CC5x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y7  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y73pqrEv
  ~CC5x6y7(); // tgen
  CC5x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y7E[];
extern void _ZN3ccc7CC5x6y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y73abcEv,_ZThn4_N3ccc7CC5x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y73abcEv,_ZThn4_N3ccc7CC5x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y7E[];
Class_Descriptor cd__ZN3ccc7CC5x6y7E = {  "_ZN3ccc7CC5x6y7E", // class name
  bases__ZN3ccc7CC5x6y7E, 2,
  &(vtc__ZN3ccc7CC5x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y8  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y83abcEv
  ~CC5x6y8(); // tgen
  CC5x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x6y83efgEv();
extern void _ZN3ccc7CC5x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y83abcEv,_ZThn4_N3ccc7CC5x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y83efgEv,_ZThn4_N3ccc7CC5x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y83abcEv,_ZThn4_N3ccc7CC5x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y83efgEv,_ZThn4_N3ccc7CC5x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y8E[];
Class_Descriptor cd__ZN3ccc7CC5x6y8E = {  "_ZN3ccc7CC5x6y8E", // class name
  bases__ZN3ccc7CC5x6y8E, 2,
  &(vtc__ZN3ccc7CC5x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y9  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y93pqrEv
  ~CC5x6y9(); // tgen
  CC5x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y9E[];
extern void _ZN3ccc7CC5x6y93pqrEv();
extern void _ZN3ccc7CC5x6y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y93efgEv,_ZThn4_N3ccc7CC5x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x6y93efgEv,_ZThn4_N3ccc7CC5x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y9E[];
Class_Descriptor cd__ZN3ccc7CC5x6y9E = {  "_ZN3ccc7CC5x6y9E", // class name
  bases__ZN3ccc7CC5x6y9E, 2,
  &(vtc__ZN3ccc7CC5x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y10  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x6y103abcEv
  ~CC5x6y10(); // tgen
  CC5x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y10E[];
extern void _ZN3ccc8CC5x6y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y103abcEv,_ZThn4_N3ccc8CC5x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x6y103abcEv,_ZThn4_N3ccc8CC5x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y10E[];
Class_Descriptor cd__ZN3ccc8CC5x6y10E = {  "_ZN3ccc8CC5x6y10E", // class name
  bases__ZN3ccc8CC5x6y10E, 2,
  &(vtc__ZN3ccc8CC5x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y11  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x6y113efgEv
  ~CC5x6y11(); // tgen
  CC5x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y11E[];
extern void _ZN3ccc8CC5x6y113pqrEv();
extern void _ZN3ccc8CC5x6y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y113efgEv,_ZThn4_N3ccc8CC5x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x6y113efgEv,_ZThn4_N3ccc8CC5x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y11E[];
Class_Descriptor cd__ZN3ccc8CC5x6y11E = {  "_ZN3ccc8CC5x6y11E", // class name
  bases__ZN3ccc8CC5x6y11E, 2,
  &(vtc__ZN3ccc8CC5x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y12  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC5x6y123abcEv
  ~CC5x6y12(); // tgen
  CC5x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y123abcEv,_ZThn4_N3ccc8CC5x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x6y123abcEv,_ZThn4_N3ccc8CC5x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y12E[];
Class_Descriptor cd__ZN3ccc8CC5x6y12E = {  "_ZN3ccc8CC5x6y12E", // class name
  bases__ZN3ccc8CC5x6y12E, 2,
  &(vtc__ZN3ccc8CC5x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y13  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC5x6y133efgEv
  ~CC5x6y13(); // tgen
  CC5x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x6y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y133efgEv,_ZThn4_N3ccc8CC5x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x6y133efgEv,_ZThn4_N3ccc8CC5x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y13E[];
Class_Descriptor cd__ZN3ccc8CC5x6y13E = {  "_ZN3ccc8CC5x6y13E", // class name
  bases__ZN3ccc8CC5x6y13E, 2,
  &(vtc__ZN3ccc8CC5x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y14  : ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y143pqrEv
  ~CC5x6y14(); // tgen
  CC5x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y14E[];
extern void _ZN3ccc8CC5x6y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y14E[];
Class_Descriptor cd__ZN3ccc8CC5x6y14E = {  "_ZN3ccc8CC5x6y14E", // class name
  bases__ZN3ccc8CC5x6y14E, 2,
  &(vtc__ZN3ccc8CC5x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x6y15  : ::ccc::AA5 , ::ccc::BB6 {
  ~CC5x6y15(); // tgen
  CC5x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y15E[];
Class_Descriptor cd__ZN3ccc8CC5x6y15E = {  "_ZN3ccc8CC5x6y15E", // class name
  bases__ZN3ccc8CC5x6y15E, 2,
  &(vtc__ZN3ccc8CC5x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y0  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y03pqrEv
  ~CC5x7y0(); // tgen
  CC5x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y0E[];
extern void _ZN3ccc7CC5x7y03pqrEv();
extern void _ZN3ccc7CC5x7y03efgEv();
extern void _ZN3ccc7CC5x7y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y03abcEv,_ZThn4_N3ccc7CC5x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y03pqrEv,_ZThn4_N3ccc7CC5x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y03abcEv,_ZThn4_N3ccc7CC5x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y03pqrEv,_ZThn4_N3ccc7CC5x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y0E[];
Class_Descriptor cd__ZN3ccc7CC5x7y0E = {  "_ZN3ccc7CC5x7y0E", // class name
  bases__ZN3ccc7CC5x7y0E, 2,
  &(vtc__ZN3ccc7CC5x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y1  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x7y13efgEv
  ~CC5x7y1(); // tgen
  CC5x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y1E[];
extern void _ZN3ccc7CC5x7y13pqrEv();
extern void _ZN3ccc7CC5x7y13efgEv();
extern void _ZN3ccc7CC5x7y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y13abcEv,_ZThn4_N3ccc7CC5x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y13pqrEv,_ZThn4_N3ccc7CC5x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y13abcEv,_ZThn4_N3ccc7CC5x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y13pqrEv,_ZThn4_N3ccc7CC5x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y1E[];
Class_Descriptor cd__ZN3ccc7CC5x7y1E = {  "_ZN3ccc7CC5x7y1E", // class name
  bases__ZN3ccc7CC5x7y1E, 2,
  &(vtc__ZN3ccc7CC5x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y2  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y23pqrEv
  ~CC5x7y2(); // tgen
  CC5x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y2E[];
extern void _ZN3ccc7CC5x7y23pqrEv();
extern void _ZN3ccc7CC5x7y23efgEv();
extern void _ZN3ccc7CC5x7y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y23abcEv,_ZThn4_N3ccc7CC5x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y23pqrEv,_ZThn4_N3ccc7CC5x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y23abcEv,_ZThn4_N3ccc7CC5x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y23pqrEv,_ZThn4_N3ccc7CC5x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y2E[];
Class_Descriptor cd__ZN3ccc7CC5x7y2E = {  "_ZN3ccc7CC5x7y2E", // class name
  bases__ZN3ccc7CC5x7y2E, 2,
  &(vtc__ZN3ccc7CC5x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y3  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x7y33abcEv
  ~CC5x7y3(); // tgen
  CC5x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y3E[];
extern void _ZN3ccc7CC5x7y33pqrEv();
extern void _ZN3ccc7CC5x7y33efgEv();
extern void _ZN3ccc7CC5x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y33abcEv,_ZThn4_N3ccc7CC5x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y33pqrEv,_ZThn4_N3ccc7CC5x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y33abcEv,_ZThn4_N3ccc7CC5x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y33pqrEv,_ZThn4_N3ccc7CC5x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y3E[];
Class_Descriptor cd__ZN3ccc7CC5x7y3E = {  "_ZN3ccc7CC5x7y3E", // class name
  bases__ZN3ccc7CC5x7y3E, 2,
  &(vtc__ZN3ccc7CC5x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y4  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC5x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y43efgEv
  ~CC5x7y4(); // tgen
  CC5x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y4E[];
extern void _ZN3ccc7CC5x7y43pqrEv();
extern void _ZN3ccc7CC5x7y43efgEv();
extern void _ZN3ccc7CC5x7y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y43abcEv,_ZThn4_N3ccc7CC5x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y43pqrEv,_ZThn4_N3ccc7CC5x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y43abcEv,_ZThn4_N3ccc7CC5x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y43pqrEv,_ZThn4_N3ccc7CC5x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y4E[];
Class_Descriptor cd__ZN3ccc7CC5x7y4E = {  "_ZN3ccc7CC5x7y4E", // class name
  bases__ZN3ccc7CC5x7y4E, 2,
  &(vtc__ZN3ccc7CC5x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y5  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC5x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y53abcEv
  ~CC5x7y5(); // tgen
  CC5x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y5E[];
extern void _ZN3ccc7CC5x7y53pqrEv();
extern void _ZN3ccc7CC5x7y53efgEv();
extern void _ZN3ccc7CC5x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y53abcEv,_ZThn4_N3ccc7CC5x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y53pqrEv,_ZThn4_N3ccc7CC5x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y53abcEv,_ZThn4_N3ccc7CC5x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y53pqrEv,_ZThn4_N3ccc7CC5x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y5E[];
Class_Descriptor cd__ZN3ccc7CC5x7y5E = {  "_ZN3ccc7CC5x7y5E", // class name
  bases__ZN3ccc7CC5x7y5E, 2,
  &(vtc__ZN3ccc7CC5x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y6  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y63efgEv
  ~CC5x7y6(); // tgen
  CC5x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x7y63efgEv();
extern void _ZN3ccc7CC5x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y63abcEv,_ZThn4_N3ccc7CC5x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y63abcEv,_ZThn4_N3ccc7CC5x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y6E[];
Class_Descriptor cd__ZN3ccc7CC5x7y6E = {  "_ZN3ccc7CC5x7y6E", // class name
  bases__ZN3ccc7CC5x7y6E, 2,
  &(vtc__ZN3ccc7CC5x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y7  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y73pqrEv
  ~CC5x7y7(); // tgen
  CC5x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y7E[];
extern void _ZN3ccc7CC5x7y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y73abcEv,_ZThn4_N3ccc7CC5x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y73pqrEv,_ZThn4_N3ccc7CC5x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y73abcEv,_ZThn4_N3ccc7CC5x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y73pqrEv,_ZThn4_N3ccc7CC5x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y7E[];
Class_Descriptor cd__ZN3ccc7CC5x7y7E = {  "_ZN3ccc7CC5x7y7E", // class name
  bases__ZN3ccc7CC5x7y7E, 2,
  &(vtc__ZN3ccc7CC5x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y8  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y83abcEv
  ~CC5x7y8(); // tgen
  CC5x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x7y83efgEv();
extern void _ZN3ccc7CC5x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y83abcEv,_ZThn4_N3ccc7CC5x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y83abcEv,_ZThn4_N3ccc7CC5x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y8E[];
Class_Descriptor cd__ZN3ccc7CC5x7y8E = {  "_ZN3ccc7CC5x7y8E", // class name
  bases__ZN3ccc7CC5x7y8E, 2,
  &(vtc__ZN3ccc7CC5x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y9  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y93pqrEv
  ~CC5x7y9(); // tgen
  CC5x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y9E[];
extern void _ZN3ccc7CC5x7y93pqrEv();
extern void _ZN3ccc7CC5x7y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y93pqrEv,_ZThn4_N3ccc7CC5x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x7y93pqrEv,_ZThn4_N3ccc7CC5x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y9E[];
Class_Descriptor cd__ZN3ccc7CC5x7y9E = {  "_ZN3ccc7CC5x7y9E", // class name
  bases__ZN3ccc7CC5x7y9E, 2,
  &(vtc__ZN3ccc7CC5x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y10  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x7y103abcEv
  ~CC5x7y10(); // tgen
  CC5x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y10E[];
extern void _ZN3ccc8CC5x7y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y103abcEv,_ZThn4_N3ccc8CC5x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y103pqrEv,_ZThn4_N3ccc8CC5x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x7y103abcEv,_ZThn4_N3ccc8CC5x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x7y103pqrEv,_ZThn4_N3ccc8CC5x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y10E[];
Class_Descriptor cd__ZN3ccc8CC5x7y10E = {  "_ZN3ccc8CC5x7y10E", // class name
  bases__ZN3ccc8CC5x7y10E, 2,
  &(vtc__ZN3ccc8CC5x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y11  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x7y113efgEv
  ~CC5x7y11(); // tgen
  CC5x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y11E[];
extern void _ZN3ccc8CC5x7y113pqrEv();
extern void _ZN3ccc8CC5x7y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y113pqrEv,_ZThn4_N3ccc8CC5x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x7y113pqrEv,_ZThn4_N3ccc8CC5x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y11E[];
Class_Descriptor cd__ZN3ccc8CC5x7y11E = {  "_ZN3ccc8CC5x7y11E", // class name
  bases__ZN3ccc8CC5x7y11E, 2,
  &(vtc__ZN3ccc8CC5x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y12  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC5x7y123abcEv
  ~CC5x7y12(); // tgen
  CC5x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y123abcEv,_ZThn4_N3ccc8CC5x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x7y123abcEv,_ZThn4_N3ccc8CC5x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y12E[];
Class_Descriptor cd__ZN3ccc8CC5x7y12E = {  "_ZN3ccc8CC5x7y12E", // class name
  bases__ZN3ccc8CC5x7y12E, 2,
  &(vtc__ZN3ccc8CC5x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y13  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC5x7y133efgEv
  ~CC5x7y13(); // tgen
  CC5x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x7y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y13E[];
Class_Descriptor cd__ZN3ccc8CC5x7y13E = {  "_ZN3ccc8CC5x7y13E", // class name
  bases__ZN3ccc8CC5x7y13E, 2,
  &(vtc__ZN3ccc8CC5x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y14  : ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y143pqrEv
  ~CC5x7y14(); // tgen
  CC5x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y14E[];
extern void _ZN3ccc8CC5x7y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y143pqrEv,_ZThn4_N3ccc8CC5x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x7y143pqrEv,_ZThn4_N3ccc8CC5x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y14E[];
Class_Descriptor cd__ZN3ccc8CC5x7y14E = {  "_ZN3ccc8CC5x7y14E", // class name
  bases__ZN3ccc8CC5x7y14E, 2,
  &(vtc__ZN3ccc8CC5x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x7y15  : ::ccc::AA5 , ::ccc::BB7 {
  ~CC5x7y15(); // tgen
  CC5x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y15E[];
Class_Descriptor cd__ZN3ccc8CC5x7y15E = {  "_ZN3ccc8CC5x7y15E", // class name
  bases__ZN3ccc8CC5x7y15E, 2,
  &(vtc__ZN3ccc8CC5x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y0  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y03pqrEv
  ~CC5x8y0(); // tgen
  CC5x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y0E[];
extern void _ZN3ccc7CC5x8y03pqrEv();
extern void _ZN3ccc7CC5x8y03efgEv();
extern void _ZN3ccc7CC5x8y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y03efgEv,_ZThn4_N3ccc7CC5x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y03abcEv,_ZThn4_N3ccc7CC5x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y03efgEv,_ZThn4_N3ccc7CC5x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y03abcEv,_ZThn4_N3ccc7CC5x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y0E[];
Class_Descriptor cd__ZN3ccc7CC5x8y0E = {  "_ZN3ccc7CC5x8y0E", // class name
  bases__ZN3ccc7CC5x8y0E, 2,
  &(vtc__ZN3ccc7CC5x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y1  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x8y13efgEv
  ~CC5x8y1(); // tgen
  CC5x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y1E[];
extern void _ZN3ccc7CC5x8y13pqrEv();
extern void _ZN3ccc7CC5x8y13efgEv();
extern void _ZN3ccc7CC5x8y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y13efgEv,_ZThn4_N3ccc7CC5x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y13abcEv,_ZThn4_N3ccc7CC5x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y13efgEv,_ZThn4_N3ccc7CC5x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y13abcEv,_ZThn4_N3ccc7CC5x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y1E[];
Class_Descriptor cd__ZN3ccc7CC5x8y1E = {  "_ZN3ccc7CC5x8y1E", // class name
  bases__ZN3ccc7CC5x8y1E, 2,
  &(vtc__ZN3ccc7CC5x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y2  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y23pqrEv
  ~CC5x8y2(); // tgen
  CC5x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y2E[];
extern void _ZN3ccc7CC5x8y23pqrEv();
extern void _ZN3ccc7CC5x8y23efgEv();
extern void _ZN3ccc7CC5x8y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y23efgEv,_ZThn4_N3ccc7CC5x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y23abcEv,_ZThn4_N3ccc7CC5x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y23efgEv,_ZThn4_N3ccc7CC5x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y23abcEv,_ZThn4_N3ccc7CC5x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y2E[];
Class_Descriptor cd__ZN3ccc7CC5x8y2E = {  "_ZN3ccc7CC5x8y2E", // class name
  bases__ZN3ccc7CC5x8y2E, 2,
  &(vtc__ZN3ccc7CC5x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y3  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x8y33abcEv
  ~CC5x8y3(); // tgen
  CC5x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y3E[];
extern void _ZN3ccc7CC5x8y33pqrEv();
extern void _ZN3ccc7CC5x8y33efgEv();
extern void _ZN3ccc7CC5x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y33efgEv,_ZThn4_N3ccc7CC5x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y33abcEv,_ZThn4_N3ccc7CC5x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y33efgEv,_ZThn4_N3ccc7CC5x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y33abcEv,_ZThn4_N3ccc7CC5x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y3E[];
Class_Descriptor cd__ZN3ccc7CC5x8y3E = {  "_ZN3ccc7CC5x8y3E", // class name
  bases__ZN3ccc7CC5x8y3E, 2,
  &(vtc__ZN3ccc7CC5x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y4  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC5x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y43efgEv
  ~CC5x8y4(); // tgen
  CC5x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y4E[];
extern void _ZN3ccc7CC5x8y43pqrEv();
extern void _ZN3ccc7CC5x8y43efgEv();
extern void _ZN3ccc7CC5x8y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y43efgEv,_ZThn4_N3ccc7CC5x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y43abcEv,_ZThn4_N3ccc7CC5x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y43efgEv,_ZThn4_N3ccc7CC5x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y43abcEv,_ZThn4_N3ccc7CC5x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y4E[];
Class_Descriptor cd__ZN3ccc7CC5x8y4E = {  "_ZN3ccc7CC5x8y4E", // class name
  bases__ZN3ccc7CC5x8y4E, 2,
  &(vtc__ZN3ccc7CC5x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y5  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC5x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y53abcEv
  ~CC5x8y5(); // tgen
  CC5x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y5E[];
extern void _ZN3ccc7CC5x8y53pqrEv();
extern void _ZN3ccc7CC5x8y53efgEv();
extern void _ZN3ccc7CC5x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y53efgEv,_ZThn4_N3ccc7CC5x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y53abcEv,_ZThn4_N3ccc7CC5x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y53efgEv,_ZThn4_N3ccc7CC5x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y53abcEv,_ZThn4_N3ccc7CC5x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y5E[];
Class_Descriptor cd__ZN3ccc7CC5x8y5E = {  "_ZN3ccc7CC5x8y5E", // class name
  bases__ZN3ccc7CC5x8y5E, 2,
  &(vtc__ZN3ccc7CC5x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y6  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y63efgEv
  ~CC5x8y6(); // tgen
  CC5x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x8y63efgEv();
extern void _ZN3ccc7CC5x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y63efgEv,_ZThn4_N3ccc7CC5x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y63abcEv,_ZThn4_N3ccc7CC5x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y63efgEv,_ZThn4_N3ccc7CC5x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y63abcEv,_ZThn4_N3ccc7CC5x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y6E[];
Class_Descriptor cd__ZN3ccc7CC5x8y6E = {  "_ZN3ccc7CC5x8y6E", // class name
  bases__ZN3ccc7CC5x8y6E, 2,
  &(vtc__ZN3ccc7CC5x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y7  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y73pqrEv
  ~CC5x8y7(); // tgen
  CC5x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y7E[];
extern void _ZN3ccc7CC5x8y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y73abcEv,_ZThn4_N3ccc7CC5x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y73abcEv,_ZThn4_N3ccc7CC5x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y7E[];
Class_Descriptor cd__ZN3ccc7CC5x8y7E = {  "_ZN3ccc7CC5x8y7E", // class name
  bases__ZN3ccc7CC5x8y7E, 2,
  &(vtc__ZN3ccc7CC5x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y8  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y83abcEv
  ~CC5x8y8(); // tgen
  CC5x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x8y83efgEv();
extern void _ZN3ccc7CC5x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y83efgEv,_ZThn4_N3ccc7CC5x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y83abcEv,_ZThn4_N3ccc7CC5x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y83efgEv,_ZThn4_N3ccc7CC5x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y83abcEv,_ZThn4_N3ccc7CC5x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y8E[];
Class_Descriptor cd__ZN3ccc7CC5x8y8E = {  "_ZN3ccc7CC5x8y8E", // class name
  bases__ZN3ccc7CC5x8y8E, 2,
  &(vtc__ZN3ccc7CC5x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y9  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y93pqrEv
  ~CC5x8y9(); // tgen
  CC5x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y9E[];
extern void _ZN3ccc7CC5x8y93pqrEv();
extern void _ZN3ccc7CC5x8y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y93efgEv,_ZThn4_N3ccc7CC5x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x8y93efgEv,_ZThn4_N3ccc7CC5x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y9E[];
Class_Descriptor cd__ZN3ccc7CC5x8y9E = {  "_ZN3ccc7CC5x8y9E", // class name
  bases__ZN3ccc7CC5x8y9E, 2,
  &(vtc__ZN3ccc7CC5x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y10  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x8y103abcEv
  ~CC5x8y10(); // tgen
  CC5x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y10E[];
extern void _ZN3ccc8CC5x8y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y103abcEv,_ZThn4_N3ccc8CC5x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x8y103abcEv,_ZThn4_N3ccc8CC5x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y10E[];
Class_Descriptor cd__ZN3ccc8CC5x8y10E = {  "_ZN3ccc8CC5x8y10E", // class name
  bases__ZN3ccc8CC5x8y10E, 2,
  &(vtc__ZN3ccc8CC5x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y11  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x8y113efgEv
  ~CC5x8y11(); // tgen
  CC5x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y11E[];
extern void _ZN3ccc8CC5x8y113pqrEv();
extern void _ZN3ccc8CC5x8y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y113efgEv,_ZThn4_N3ccc8CC5x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x8y113efgEv,_ZThn4_N3ccc8CC5x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y11E[];
Class_Descriptor cd__ZN3ccc8CC5x8y11E = {  "_ZN3ccc8CC5x8y11E", // class name
  bases__ZN3ccc8CC5x8y11E, 2,
  &(vtc__ZN3ccc8CC5x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y12  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC5x8y123abcEv
  ~CC5x8y12(); // tgen
  CC5x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y123abcEv,_ZThn4_N3ccc8CC5x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x8y123abcEv,_ZThn4_N3ccc8CC5x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y12E[];
Class_Descriptor cd__ZN3ccc8CC5x8y12E = {  "_ZN3ccc8CC5x8y12E", // class name
  bases__ZN3ccc8CC5x8y12E, 2,
  &(vtc__ZN3ccc8CC5x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y13  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC5x8y133efgEv
  ~CC5x8y13(); // tgen
  CC5x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x8y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y133efgEv,_ZThn4_N3ccc8CC5x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x8y133efgEv,_ZThn4_N3ccc8CC5x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y13E[];
Class_Descriptor cd__ZN3ccc8CC5x8y13E = {  "_ZN3ccc8CC5x8y13E", // class name
  bases__ZN3ccc8CC5x8y13E, 2,
  &(vtc__ZN3ccc8CC5x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y14  : ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y143pqrEv
  ~CC5x8y14(); // tgen
  CC5x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y14E[];
extern void _ZN3ccc8CC5x8y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y14E[];
Class_Descriptor cd__ZN3ccc8CC5x8y14E = {  "_ZN3ccc8CC5x8y14E", // class name
  bases__ZN3ccc8CC5x8y14E, 2,
  &(vtc__ZN3ccc8CC5x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x8y15  : ::ccc::AA5 , ::ccc::BB8 {
  ~CC5x8y15(); // tgen
  CC5x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y15E[];
Class_Descriptor cd__ZN3ccc8CC5x8y15E = {  "_ZN3ccc8CC5x8y15E", // class name
  bases__ZN3ccc8CC5x8y15E, 2,
  &(vtc__ZN3ccc8CC5x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y0  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y03pqrEv
  ~CC5x9y0(); // tgen
  CC5x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y0E[];
extern void _ZN3ccc7CC5x9y03pqrEv();
extern void _ZN3ccc7CC5x9y03efgEv();
extern void _ZN3ccc7CC5x9y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y03efgEv,_ZThn4_N3ccc7CC5x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y03pqrEv,_ZThn4_N3ccc7CC5x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y03efgEv,_ZThn4_N3ccc7CC5x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y03pqrEv,_ZThn4_N3ccc7CC5x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y0E[];
Class_Descriptor cd__ZN3ccc7CC5x9y0E = {  "_ZN3ccc7CC5x9y0E", // class name
  bases__ZN3ccc7CC5x9y0E, 2,
  &(vtc__ZN3ccc7CC5x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y1  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x9y13efgEv
  ~CC5x9y1(); // tgen
  CC5x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y1E[];
extern void _ZN3ccc7CC5x9y13pqrEv();
extern void _ZN3ccc7CC5x9y13efgEv();
extern void _ZN3ccc7CC5x9y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y13efgEv,_ZThn4_N3ccc7CC5x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y13pqrEv,_ZThn4_N3ccc7CC5x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y13efgEv,_ZThn4_N3ccc7CC5x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y13pqrEv,_ZThn4_N3ccc7CC5x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y1E[];
Class_Descriptor cd__ZN3ccc7CC5x9y1E = {  "_ZN3ccc7CC5x9y1E", // class name
  bases__ZN3ccc7CC5x9y1E, 2,
  &(vtc__ZN3ccc7CC5x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y2  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y23pqrEv
  ~CC5x9y2(); // tgen
  CC5x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y2E[];
extern void _ZN3ccc7CC5x9y23pqrEv();
extern void _ZN3ccc7CC5x9y23efgEv();
extern void _ZN3ccc7CC5x9y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y23efgEv,_ZThn4_N3ccc7CC5x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y23pqrEv,_ZThn4_N3ccc7CC5x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y23efgEv,_ZThn4_N3ccc7CC5x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y23pqrEv,_ZThn4_N3ccc7CC5x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y2E[];
Class_Descriptor cd__ZN3ccc7CC5x9y2E = {  "_ZN3ccc7CC5x9y2E", // class name
  bases__ZN3ccc7CC5x9y2E, 2,
  &(vtc__ZN3ccc7CC5x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y3  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x9y33abcEv
  ~CC5x9y3(); // tgen
  CC5x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y3E[];
extern void _ZN3ccc7CC5x9y33pqrEv();
extern void _ZN3ccc7CC5x9y33efgEv();
extern void _ZN3ccc7CC5x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y33efgEv,_ZThn4_N3ccc7CC5x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y33pqrEv,_ZThn4_N3ccc7CC5x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y33efgEv,_ZThn4_N3ccc7CC5x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y33pqrEv,_ZThn4_N3ccc7CC5x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y3E[];
Class_Descriptor cd__ZN3ccc7CC5x9y3E = {  "_ZN3ccc7CC5x9y3E", // class name
  bases__ZN3ccc7CC5x9y3E, 2,
  &(vtc__ZN3ccc7CC5x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y4  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC5x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y43efgEv
  ~CC5x9y4(); // tgen
  CC5x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y4E[];
extern void _ZN3ccc7CC5x9y43pqrEv();
extern void _ZN3ccc7CC5x9y43efgEv();
extern void _ZN3ccc7CC5x9y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y43efgEv,_ZThn4_N3ccc7CC5x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y43pqrEv,_ZThn4_N3ccc7CC5x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y43efgEv,_ZThn4_N3ccc7CC5x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y43pqrEv,_ZThn4_N3ccc7CC5x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y4E[];
Class_Descriptor cd__ZN3ccc7CC5x9y4E = {  "_ZN3ccc7CC5x9y4E", // class name
  bases__ZN3ccc7CC5x9y4E, 2,
  &(vtc__ZN3ccc7CC5x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y5  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC5x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y53abcEv
  ~CC5x9y5(); // tgen
  CC5x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y5E[];
extern void _ZN3ccc7CC5x9y53pqrEv();
extern void _ZN3ccc7CC5x9y53efgEv();
extern void _ZN3ccc7CC5x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y53efgEv,_ZThn4_N3ccc7CC5x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y53pqrEv,_ZThn4_N3ccc7CC5x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y53efgEv,_ZThn4_N3ccc7CC5x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y53pqrEv,_ZThn4_N3ccc7CC5x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y5E[];
Class_Descriptor cd__ZN3ccc7CC5x9y5E = {  "_ZN3ccc7CC5x9y5E", // class name
  bases__ZN3ccc7CC5x9y5E, 2,
  &(vtc__ZN3ccc7CC5x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y6  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y63efgEv
  ~CC5x9y6(); // tgen
  CC5x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x9y63efgEv();
extern void _ZN3ccc7CC5x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y63efgEv,_ZThn4_N3ccc7CC5x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y63efgEv,_ZThn4_N3ccc7CC5x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y6E[];
Class_Descriptor cd__ZN3ccc7CC5x9y6E = {  "_ZN3ccc7CC5x9y6E", // class name
  bases__ZN3ccc7CC5x9y6E, 2,
  &(vtc__ZN3ccc7CC5x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y7  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y73pqrEv
  ~CC5x9y7(); // tgen
  CC5x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y7E[];
extern void _ZN3ccc7CC5x9y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7CC5x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y73pqrEv,_ZThn4_N3ccc7CC5x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y73pqrEv,_ZThn4_N3ccc7CC5x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y7E[];
Class_Descriptor cd__ZN3ccc7CC5x9y7E = {  "_ZN3ccc7CC5x9y7E", // class name
  bases__ZN3ccc7CC5x9y7E, 2,
  &(vtc__ZN3ccc7CC5x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y8  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y83abcEv
  ~CC5x9y8(); // tgen
  CC5x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7CC5x9y83efgEv();
extern void _ZN3ccc7CC5x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y83efgEv,_ZThn4_N3ccc7CC5x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y83efgEv,_ZThn4_N3ccc7CC5x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y8E[];
Class_Descriptor cd__ZN3ccc7CC5x9y8E = {  "_ZN3ccc7CC5x9y8E", // class name
  bases__ZN3ccc7CC5x9y8E, 2,
  &(vtc__ZN3ccc7CC5x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y9  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y93pqrEv
  ~CC5x9y9(); // tgen
  CC5x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC5x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y9E[];
extern void _ZN3ccc7CC5x9y93pqrEv();
extern void _ZN3ccc7CC5x9y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y93efgEv,_ZThn4_N3ccc7CC5x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y93pqrEv,_ZThn4_N3ccc7CC5x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y93efgEv,_ZThn4_N3ccc7CC5x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC5x9y93pqrEv,_ZThn4_N3ccc7CC5x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y9E[];
Class_Descriptor cd__ZN3ccc7CC5x9y9E = {  "_ZN3ccc7CC5x9y9E", // class name
  bases__ZN3ccc7CC5x9y9E, 2,
  &(vtc__ZN3ccc7CC5x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y10  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x9y103abcEv
  ~CC5x9y10(); // tgen
  CC5x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y10E[];
extern void _ZN3ccc8CC5x9y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y103pqrEv,_ZThn4_N3ccc8CC5x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x9y103pqrEv,_ZThn4_N3ccc8CC5x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y10E[];
Class_Descriptor cd__ZN3ccc8CC5x9y10E = {  "_ZN3ccc8CC5x9y10E", // class name
  bases__ZN3ccc8CC5x9y10E, 2,
  &(vtc__ZN3ccc8CC5x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y11  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x9y113efgEv
  ~CC5x9y11(); // tgen
  CC5x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y11E[];
extern void _ZN3ccc8CC5x9y113pqrEv();
extern void _ZN3ccc8CC5x9y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y113efgEv,_ZThn4_N3ccc8CC5x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y113pqrEv,_ZThn4_N3ccc8CC5x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x9y113efgEv,_ZThn4_N3ccc8CC5x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x9y113pqrEv,_ZThn4_N3ccc8CC5x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y11E[];
Class_Descriptor cd__ZN3ccc8CC5x9y11E = {  "_ZN3ccc8CC5x9y11E", // class name
  bases__ZN3ccc8CC5x9y11E, 2,
  &(vtc__ZN3ccc8CC5x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y12  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC5x9y123abcEv
  ~CC5x9y12(); // tgen
  CC5x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y12E[];
Class_Descriptor cd__ZN3ccc8CC5x9y12E = {  "_ZN3ccc8CC5x9y12E", // class name
  bases__ZN3ccc8CC5x9y12E, 2,
  &(vtc__ZN3ccc8CC5x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y13  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC5x9y133efgEv
  ~CC5x9y13(); // tgen
  CC5x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x9y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y133efgEv,_ZThn4_N3ccc8CC5x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x9y133efgEv,_ZThn4_N3ccc8CC5x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y13E[];
Class_Descriptor cd__ZN3ccc8CC5x9y13E = {  "_ZN3ccc8CC5x9y13E", // class name
  bases__ZN3ccc8CC5x9y13E, 2,
  &(vtc__ZN3ccc8CC5x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y14  : ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y143pqrEv
  ~CC5x9y14(); // tgen
  CC5x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y14E[];
extern void _ZN3ccc8CC5x9y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y143pqrEv,_ZThn4_N3ccc8CC5x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x9y143pqrEv,_ZThn4_N3ccc8CC5x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y14E[];
Class_Descriptor cd__ZN3ccc8CC5x9y14E = {  "_ZN3ccc8CC5x9y14E", // class name
  bases__ZN3ccc8CC5x9y14E, 2,
  &(vtc__ZN3ccc8CC5x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x9y15  : ::ccc::AA5 , ::ccc::BB9 {
  ~CC5x9y15(); // tgen
  CC5x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y15E[];
Class_Descriptor cd__ZN3ccc8CC5x9y15E = {  "_ZN3ccc8CC5x9y15E", // class name
  bases__ZN3ccc8CC5x9y15E, 2,
  &(vtc__ZN3ccc8CC5x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y0  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y03pqrEv
  ~CC5x10y0(); // tgen
  CC5x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y0E[];
extern void _ZN3ccc8CC5x10y03pqrEv();
extern void _ZN3ccc8CC5x10y03efgEv();
extern void _ZN3ccc8CC5x10y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y03pqrEv,_ZThn4_N3ccc8CC5x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y03abcEv,_ZThn4_N3ccc8CC5x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y03pqrEv,_ZThn4_N3ccc8CC5x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y03abcEv,_ZThn4_N3ccc8CC5x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y0E[];
Class_Descriptor cd__ZN3ccc8CC5x10y0E = {  "_ZN3ccc8CC5x10y0E", // class name
  bases__ZN3ccc8CC5x10y0E, 2,
  &(vtc__ZN3ccc8CC5x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y1  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x10y13efgEv
  ~CC5x10y1(); // tgen
  CC5x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y1E[];
extern void _ZN3ccc8CC5x10y13pqrEv();
extern void _ZN3ccc8CC5x10y13efgEv();
extern void _ZN3ccc8CC5x10y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y13pqrEv,_ZThn4_N3ccc8CC5x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y13abcEv,_ZThn4_N3ccc8CC5x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y13pqrEv,_ZThn4_N3ccc8CC5x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y13abcEv,_ZThn4_N3ccc8CC5x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y1E[];
Class_Descriptor cd__ZN3ccc8CC5x10y1E = {  "_ZN3ccc8CC5x10y1E", // class name
  bases__ZN3ccc8CC5x10y1E, 2,
  &(vtc__ZN3ccc8CC5x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y2  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y23pqrEv
  ~CC5x10y2(); // tgen
  CC5x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y2E[];
extern void _ZN3ccc8CC5x10y23pqrEv();
extern void _ZN3ccc8CC5x10y23efgEv();
extern void _ZN3ccc8CC5x10y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y23pqrEv,_ZThn4_N3ccc8CC5x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y23abcEv,_ZThn4_N3ccc8CC5x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y23pqrEv,_ZThn4_N3ccc8CC5x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y23abcEv,_ZThn4_N3ccc8CC5x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y2E[];
Class_Descriptor cd__ZN3ccc8CC5x10y2E = {  "_ZN3ccc8CC5x10y2E", // class name
  bases__ZN3ccc8CC5x10y2E, 2,
  &(vtc__ZN3ccc8CC5x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y3  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x10y33abcEv
  ~CC5x10y3(); // tgen
  CC5x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y3E[];
extern void _ZN3ccc8CC5x10y33pqrEv();
extern void _ZN3ccc8CC5x10y33efgEv();
extern void _ZN3ccc8CC5x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y33pqrEv,_ZThn4_N3ccc8CC5x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y33abcEv,_ZThn4_N3ccc8CC5x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y33pqrEv,_ZThn4_N3ccc8CC5x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y33abcEv,_ZThn4_N3ccc8CC5x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y3E[];
Class_Descriptor cd__ZN3ccc8CC5x10y3E = {  "_ZN3ccc8CC5x10y3E", // class name
  bases__ZN3ccc8CC5x10y3E, 2,
  &(vtc__ZN3ccc8CC5x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y4  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC5x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y43efgEv
  ~CC5x10y4(); // tgen
  CC5x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y4E[];
extern void _ZN3ccc8CC5x10y43pqrEv();
extern void _ZN3ccc8CC5x10y43efgEv();
extern void _ZN3ccc8CC5x10y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y43pqrEv,_ZThn4_N3ccc8CC5x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y43abcEv,_ZThn4_N3ccc8CC5x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y43pqrEv,_ZThn4_N3ccc8CC5x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y43abcEv,_ZThn4_N3ccc8CC5x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y4E[];
Class_Descriptor cd__ZN3ccc8CC5x10y4E = {  "_ZN3ccc8CC5x10y4E", // class name
  bases__ZN3ccc8CC5x10y4E, 2,
  &(vtc__ZN3ccc8CC5x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y5  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC5x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y53abcEv
  ~CC5x10y5(); // tgen
  CC5x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y5E[];
extern void _ZN3ccc8CC5x10y53pqrEv();
extern void _ZN3ccc8CC5x10y53efgEv();
extern void _ZN3ccc8CC5x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y53pqrEv,_ZThn4_N3ccc8CC5x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y53abcEv,_ZThn4_N3ccc8CC5x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y53pqrEv,_ZThn4_N3ccc8CC5x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y53abcEv,_ZThn4_N3ccc8CC5x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y5E[];
Class_Descriptor cd__ZN3ccc8CC5x10y5E = {  "_ZN3ccc8CC5x10y5E", // class name
  bases__ZN3ccc8CC5x10y5E, 2,
  &(vtc__ZN3ccc8CC5x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y6  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y63efgEv
  ~CC5x10y6(); // tgen
  CC5x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x10y63efgEv();
extern void _ZN3ccc8CC5x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y63abcEv,_ZThn4_N3ccc8CC5x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y63abcEv,_ZThn4_N3ccc8CC5x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y6E[];
Class_Descriptor cd__ZN3ccc8CC5x10y6E = {  "_ZN3ccc8CC5x10y6E", // class name
  bases__ZN3ccc8CC5x10y6E, 2,
  &(vtc__ZN3ccc8CC5x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y7  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y73pqrEv
  ~CC5x10y7(); // tgen
  CC5x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y7E[];
extern void _ZN3ccc8CC5x10y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y73pqrEv,_ZThn4_N3ccc8CC5x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y73abcEv,_ZThn4_N3ccc8CC5x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y73pqrEv,_ZThn4_N3ccc8CC5x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y73abcEv,_ZThn4_N3ccc8CC5x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y7E[];
Class_Descriptor cd__ZN3ccc8CC5x10y7E = {  "_ZN3ccc8CC5x10y7E", // class name
  bases__ZN3ccc8CC5x10y7E, 2,
  &(vtc__ZN3ccc8CC5x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y8  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y83abcEv
  ~CC5x10y8(); // tgen
  CC5x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x10y83efgEv();
extern void _ZN3ccc8CC5x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y83abcEv,_ZThn4_N3ccc8CC5x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y83abcEv,_ZThn4_N3ccc8CC5x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y8E[];
Class_Descriptor cd__ZN3ccc8CC5x10y8E = {  "_ZN3ccc8CC5x10y8E", // class name
  bases__ZN3ccc8CC5x10y8E, 2,
  &(vtc__ZN3ccc8CC5x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y9  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y93pqrEv
  ~CC5x10y9(); // tgen
  CC5x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y9E[];
extern void _ZN3ccc8CC5x10y93pqrEv();
extern void _ZN3ccc8CC5x10y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y93pqrEv,_ZThn4_N3ccc8CC5x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x10y93pqrEv,_ZThn4_N3ccc8CC5x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y9E[];
Class_Descriptor cd__ZN3ccc8CC5x10y9E = {  "_ZN3ccc8CC5x10y9E", // class name
  bases__ZN3ccc8CC5x10y9E, 2,
  &(vtc__ZN3ccc8CC5x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y10  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x10y103abcEv
  ~CC5x10y10(); // tgen
  CC5x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y10E[];
extern void _ZN3ccc9CC5x10y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y103pqrEv,_ZThn4_N3ccc9CC5x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y103abcEv,_ZThn4_N3ccc9CC5x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x10y103pqrEv,_ZThn4_N3ccc9CC5x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x10y103abcEv,_ZThn4_N3ccc9CC5x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y10E[];
Class_Descriptor cd__ZN3ccc9CC5x10y10E = {  "_ZN3ccc9CC5x10y10E", // class name
  bases__ZN3ccc9CC5x10y10E, 2,
  &(vtc__ZN3ccc9CC5x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y11  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x10y113efgEv
  ~CC5x10y11(); // tgen
  CC5x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y11E[];
extern void _ZN3ccc9CC5x10y113pqrEv();
extern void _ZN3ccc9CC5x10y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y113pqrEv,_ZThn4_N3ccc9CC5x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x10y113pqrEv,_ZThn4_N3ccc9CC5x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y11E[];
Class_Descriptor cd__ZN3ccc9CC5x10y11E = {  "_ZN3ccc9CC5x10y11E", // class name
  bases__ZN3ccc9CC5x10y11E, 2,
  &(vtc__ZN3ccc9CC5x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y12  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC5x10y123abcEv
  ~CC5x10y12(); // tgen
  CC5x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y123abcEv,_ZThn4_N3ccc9CC5x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x10y123abcEv,_ZThn4_N3ccc9CC5x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y12E[];
Class_Descriptor cd__ZN3ccc9CC5x10y12E = {  "_ZN3ccc9CC5x10y12E", // class name
  bases__ZN3ccc9CC5x10y12E, 2,
  &(vtc__ZN3ccc9CC5x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y13  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC5x10y133efgEv
  ~CC5x10y13(); // tgen
  CC5x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x10y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y13E[];
Class_Descriptor cd__ZN3ccc9CC5x10y13E = {  "_ZN3ccc9CC5x10y13E", // class name
  bases__ZN3ccc9CC5x10y13E, 2,
  &(vtc__ZN3ccc9CC5x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y14  : ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y143pqrEv
  ~CC5x10y14(); // tgen
  CC5x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y14E[];
extern void _ZN3ccc9CC5x10y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y143pqrEv,_ZThn4_N3ccc9CC5x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x10y143pqrEv,_ZThn4_N3ccc9CC5x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y14E[];
Class_Descriptor cd__ZN3ccc9CC5x10y14E = {  "_ZN3ccc9CC5x10y14E", // class name
  bases__ZN3ccc9CC5x10y14E, 2,
  &(vtc__ZN3ccc9CC5x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x10y15  : ::ccc::AA5 , ::ccc::BB10 {
  ~CC5x10y15(); // tgen
  CC5x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y15E[];
Class_Descriptor cd__ZN3ccc9CC5x10y15E = {  "_ZN3ccc9CC5x10y15E", // class name
  bases__ZN3ccc9CC5x10y15E, 2,
  &(vtc__ZN3ccc9CC5x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y0  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y03pqrEv
  ~CC5x11y0(); // tgen
  CC5x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y0E[];
extern void _ZN3ccc8CC5x11y03pqrEv();
extern void _ZN3ccc8CC5x11y03efgEv();
extern void _ZN3ccc8CC5x11y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y03pqrEv,_ZThn4_N3ccc8CC5x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y03efgEv,_ZThn4_N3ccc8CC5x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y03pqrEv,_ZThn4_N3ccc8CC5x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y03efgEv,_ZThn4_N3ccc8CC5x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y0E[];
Class_Descriptor cd__ZN3ccc8CC5x11y0E = {  "_ZN3ccc8CC5x11y0E", // class name
  bases__ZN3ccc8CC5x11y0E, 2,
  &(vtc__ZN3ccc8CC5x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y1  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x11y13efgEv
  ~CC5x11y1(); // tgen
  CC5x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y1E[];
extern void _ZN3ccc8CC5x11y13pqrEv();
extern void _ZN3ccc8CC5x11y13efgEv();
extern void _ZN3ccc8CC5x11y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y13pqrEv,_ZThn4_N3ccc8CC5x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y13efgEv,_ZThn4_N3ccc8CC5x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y13pqrEv,_ZThn4_N3ccc8CC5x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y13efgEv,_ZThn4_N3ccc8CC5x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y1E[];
Class_Descriptor cd__ZN3ccc8CC5x11y1E = {  "_ZN3ccc8CC5x11y1E", // class name
  bases__ZN3ccc8CC5x11y1E, 2,
  &(vtc__ZN3ccc8CC5x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y2  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y23pqrEv
  ~CC5x11y2(); // tgen
  CC5x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y2E[];
extern void _ZN3ccc8CC5x11y23pqrEv();
extern void _ZN3ccc8CC5x11y23efgEv();
extern void _ZN3ccc8CC5x11y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y23pqrEv,_ZThn4_N3ccc8CC5x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y23efgEv,_ZThn4_N3ccc8CC5x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y23pqrEv,_ZThn4_N3ccc8CC5x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y23efgEv,_ZThn4_N3ccc8CC5x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y2E[];
Class_Descriptor cd__ZN3ccc8CC5x11y2E = {  "_ZN3ccc8CC5x11y2E", // class name
  bases__ZN3ccc8CC5x11y2E, 2,
  &(vtc__ZN3ccc8CC5x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y3  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x11y33abcEv
  ~CC5x11y3(); // tgen
  CC5x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y3E[];
extern void _ZN3ccc8CC5x11y33pqrEv();
extern void _ZN3ccc8CC5x11y33efgEv();
extern void _ZN3ccc8CC5x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y33pqrEv,_ZThn4_N3ccc8CC5x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y33efgEv,_ZThn4_N3ccc8CC5x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y33pqrEv,_ZThn4_N3ccc8CC5x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y33efgEv,_ZThn4_N3ccc8CC5x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y3E[];
Class_Descriptor cd__ZN3ccc8CC5x11y3E = {  "_ZN3ccc8CC5x11y3E", // class name
  bases__ZN3ccc8CC5x11y3E, 2,
  &(vtc__ZN3ccc8CC5x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y4  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC5x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y43efgEv
  ~CC5x11y4(); // tgen
  CC5x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y4E[];
extern void _ZN3ccc8CC5x11y43pqrEv();
extern void _ZN3ccc8CC5x11y43efgEv();
extern void _ZN3ccc8CC5x11y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y43pqrEv,_ZThn4_N3ccc8CC5x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y43efgEv,_ZThn4_N3ccc8CC5x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y43pqrEv,_ZThn4_N3ccc8CC5x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y43efgEv,_ZThn4_N3ccc8CC5x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y4E[];
Class_Descriptor cd__ZN3ccc8CC5x11y4E = {  "_ZN3ccc8CC5x11y4E", // class name
  bases__ZN3ccc8CC5x11y4E, 2,
  &(vtc__ZN3ccc8CC5x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y5  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC5x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y53abcEv
  ~CC5x11y5(); // tgen
  CC5x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y5E[];
extern void _ZN3ccc8CC5x11y53pqrEv();
extern void _ZN3ccc8CC5x11y53efgEv();
extern void _ZN3ccc8CC5x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y53pqrEv,_ZThn4_N3ccc8CC5x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y53efgEv,_ZThn4_N3ccc8CC5x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y53pqrEv,_ZThn4_N3ccc8CC5x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y53efgEv,_ZThn4_N3ccc8CC5x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y5E[];
Class_Descriptor cd__ZN3ccc8CC5x11y5E = {  "_ZN3ccc8CC5x11y5E", // class name
  bases__ZN3ccc8CC5x11y5E, 2,
  &(vtc__ZN3ccc8CC5x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y6  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y63efgEv
  ~CC5x11y6(); // tgen
  CC5x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x11y63efgEv();
extern void _ZN3ccc8CC5x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y63efgEv,_ZThn4_N3ccc8CC5x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y63efgEv,_ZThn4_N3ccc8CC5x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y6E[];
Class_Descriptor cd__ZN3ccc8CC5x11y6E = {  "_ZN3ccc8CC5x11y6E", // class name
  bases__ZN3ccc8CC5x11y6E, 2,
  &(vtc__ZN3ccc8CC5x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y7  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y73pqrEv
  ~CC5x11y7(); // tgen
  CC5x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y7E[];
extern void _ZN3ccc8CC5x11y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y73pqrEv,_ZThn4_N3ccc8CC5x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y73pqrEv,_ZThn4_N3ccc8CC5x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y7E[];
Class_Descriptor cd__ZN3ccc8CC5x11y7E = {  "_ZN3ccc8CC5x11y7E", // class name
  bases__ZN3ccc8CC5x11y7E, 2,
  &(vtc__ZN3ccc8CC5x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y8  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y83abcEv
  ~CC5x11y8(); // tgen
  CC5x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x11y83efgEv();
extern void _ZN3ccc8CC5x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y83efgEv,_ZThn4_N3ccc8CC5x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y83efgEv,_ZThn4_N3ccc8CC5x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y8E[];
Class_Descriptor cd__ZN3ccc8CC5x11y8E = {  "_ZN3ccc8CC5x11y8E", // class name
  bases__ZN3ccc8CC5x11y8E, 2,
  &(vtc__ZN3ccc8CC5x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y9  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y93pqrEv
  ~CC5x11y9(); // tgen
  CC5x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y9E[];
extern void _ZN3ccc8CC5x11y93pqrEv();
extern void _ZN3ccc8CC5x11y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y93pqrEv,_ZThn4_N3ccc8CC5x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y93efgEv,_ZThn4_N3ccc8CC5x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y93pqrEv,_ZThn4_N3ccc8CC5x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x11y93efgEv,_ZThn4_N3ccc8CC5x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y9E[];
Class_Descriptor cd__ZN3ccc8CC5x11y9E = {  "_ZN3ccc8CC5x11y9E", // class name
  bases__ZN3ccc8CC5x11y9E, 2,
  &(vtc__ZN3ccc8CC5x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y10  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x11y103abcEv
  ~CC5x11y10(); // tgen
  CC5x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y10E[];
extern void _ZN3ccc9CC5x11y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y103pqrEv,_ZThn4_N3ccc9CC5x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x11y103pqrEv,_ZThn4_N3ccc9CC5x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y10E[];
Class_Descriptor cd__ZN3ccc9CC5x11y10E = {  "_ZN3ccc9CC5x11y10E", // class name
  bases__ZN3ccc9CC5x11y10E, 2,
  &(vtc__ZN3ccc9CC5x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y11  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x11y113efgEv
  ~CC5x11y11(); // tgen
  CC5x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y11E[];
extern void _ZN3ccc9CC5x11y113pqrEv();
extern void _ZN3ccc9CC5x11y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y113pqrEv,_ZThn4_N3ccc9CC5x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y113efgEv,_ZThn4_N3ccc9CC5x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x11y113pqrEv,_ZThn4_N3ccc9CC5x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x11y113efgEv,_ZThn4_N3ccc9CC5x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y11E[];
Class_Descriptor cd__ZN3ccc9CC5x11y11E = {  "_ZN3ccc9CC5x11y11E", // class name
  bases__ZN3ccc9CC5x11y11E, 2,
  &(vtc__ZN3ccc9CC5x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y12  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC5x11y123abcEv
  ~CC5x11y12(); // tgen
  CC5x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y12E[];
Class_Descriptor cd__ZN3ccc9CC5x11y12E = {  "_ZN3ccc9CC5x11y12E", // class name
  bases__ZN3ccc9CC5x11y12E, 2,
  &(vtc__ZN3ccc9CC5x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y13  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC5x11y133efgEv
  ~CC5x11y13(); // tgen
  CC5x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x11y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y133efgEv,_ZThn4_N3ccc9CC5x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x11y133efgEv,_ZThn4_N3ccc9CC5x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y13E[];
Class_Descriptor cd__ZN3ccc9CC5x11y13E = {  "_ZN3ccc9CC5x11y13E", // class name
  bases__ZN3ccc9CC5x11y13E, 2,
  &(vtc__ZN3ccc9CC5x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y14  : ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y143pqrEv
  ~CC5x11y14(); // tgen
  CC5x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y14E[];
extern void _ZN3ccc9CC5x11y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y143pqrEv,_ZThn4_N3ccc9CC5x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x11y143pqrEv,_ZThn4_N3ccc9CC5x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y14E[];
Class_Descriptor cd__ZN3ccc9CC5x11y14E = {  "_ZN3ccc9CC5x11y14E", // class name
  bases__ZN3ccc9CC5x11y14E, 2,
  &(vtc__ZN3ccc9CC5x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x11y15  : ::ccc::AA5 , ::ccc::BB11 {
  ~CC5x11y15(); // tgen
  CC5x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y15E[];
Class_Descriptor cd__ZN3ccc9CC5x11y15E = {  "_ZN3ccc9CC5x11y15E", // class name
  bases__ZN3ccc9CC5x11y15E, 2,
  &(vtc__ZN3ccc9CC5x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y0  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y03pqrEv
  ~CC5x12y0(); // tgen
  CC5x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y0E[];
extern void _ZN3ccc8CC5x12y03pqrEv();
extern void _ZN3ccc8CC5x12y03efgEv();
extern void _ZN3ccc8CC5x12y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y03abcEv,_ZThn4_N3ccc8CC5x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y03abcEv,_ZThn4_N3ccc8CC5x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y0E[];
Class_Descriptor cd__ZN3ccc8CC5x12y0E = {  "_ZN3ccc8CC5x12y0E", // class name
  bases__ZN3ccc8CC5x12y0E, 2,
  &(vtc__ZN3ccc8CC5x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y1  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x12y13efgEv
  ~CC5x12y1(); // tgen
  CC5x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y1E[];
extern void _ZN3ccc8CC5x12y13pqrEv();
extern void _ZN3ccc8CC5x12y13efgEv();
extern void _ZN3ccc8CC5x12y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y13abcEv,_ZThn4_N3ccc8CC5x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y13abcEv,_ZThn4_N3ccc8CC5x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y1E[];
Class_Descriptor cd__ZN3ccc8CC5x12y1E = {  "_ZN3ccc8CC5x12y1E", // class name
  bases__ZN3ccc8CC5x12y1E, 2,
  &(vtc__ZN3ccc8CC5x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y2  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y23pqrEv
  ~CC5x12y2(); // tgen
  CC5x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y2E[];
extern void _ZN3ccc8CC5x12y23pqrEv();
extern void _ZN3ccc8CC5x12y23efgEv();
extern void _ZN3ccc8CC5x12y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y23abcEv,_ZThn4_N3ccc8CC5x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y23abcEv,_ZThn4_N3ccc8CC5x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y2E[];
Class_Descriptor cd__ZN3ccc8CC5x12y2E = {  "_ZN3ccc8CC5x12y2E", // class name
  bases__ZN3ccc8CC5x12y2E, 2,
  &(vtc__ZN3ccc8CC5x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y3  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x12y33abcEv
  ~CC5x12y3(); // tgen
  CC5x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y3E[];
extern void _ZN3ccc8CC5x12y33pqrEv();
extern void _ZN3ccc8CC5x12y33efgEv();
extern void _ZN3ccc8CC5x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y33abcEv,_ZThn4_N3ccc8CC5x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y33abcEv,_ZThn4_N3ccc8CC5x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y3E[];
Class_Descriptor cd__ZN3ccc8CC5x12y3E = {  "_ZN3ccc8CC5x12y3E", // class name
  bases__ZN3ccc8CC5x12y3E, 2,
  &(vtc__ZN3ccc8CC5x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y4  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC5x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y43efgEv
  ~CC5x12y4(); // tgen
  CC5x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y4E[];
extern void _ZN3ccc8CC5x12y43pqrEv();
extern void _ZN3ccc8CC5x12y43efgEv();
extern void _ZN3ccc8CC5x12y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y43abcEv,_ZThn4_N3ccc8CC5x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y43abcEv,_ZThn4_N3ccc8CC5x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y4E[];
Class_Descriptor cd__ZN3ccc8CC5x12y4E = {  "_ZN3ccc8CC5x12y4E", // class name
  bases__ZN3ccc8CC5x12y4E, 2,
  &(vtc__ZN3ccc8CC5x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y5  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC5x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y53abcEv
  ~CC5x12y5(); // tgen
  CC5x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y5E[];
extern void _ZN3ccc8CC5x12y53pqrEv();
extern void _ZN3ccc8CC5x12y53efgEv();
extern void _ZN3ccc8CC5x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y53abcEv,_ZThn4_N3ccc8CC5x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y53abcEv,_ZThn4_N3ccc8CC5x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y5E[];
Class_Descriptor cd__ZN3ccc8CC5x12y5E = {  "_ZN3ccc8CC5x12y5E", // class name
  bases__ZN3ccc8CC5x12y5E, 2,
  &(vtc__ZN3ccc8CC5x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y6  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y63efgEv
  ~CC5x12y6(); // tgen
  CC5x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x12y63efgEv();
extern void _ZN3ccc8CC5x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y63abcEv,_ZThn4_N3ccc8CC5x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y63abcEv,_ZThn4_N3ccc8CC5x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y6E[];
Class_Descriptor cd__ZN3ccc8CC5x12y6E = {  "_ZN3ccc8CC5x12y6E", // class name
  bases__ZN3ccc8CC5x12y6E, 2,
  &(vtc__ZN3ccc8CC5x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y7  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y73pqrEv
  ~CC5x12y7(); // tgen
  CC5x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y7E[];
extern void _ZN3ccc8CC5x12y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y73abcEv,_ZThn4_N3ccc8CC5x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y73abcEv,_ZThn4_N3ccc8CC5x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y7E[];
Class_Descriptor cd__ZN3ccc8CC5x12y7E = {  "_ZN3ccc8CC5x12y7E", // class name
  bases__ZN3ccc8CC5x12y7E, 2,
  &(vtc__ZN3ccc8CC5x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y8  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y83abcEv
  ~CC5x12y8(); // tgen
  CC5x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x12y83efgEv();
extern void _ZN3ccc8CC5x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y83abcEv,_ZThn4_N3ccc8CC5x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x12y83abcEv,_ZThn4_N3ccc8CC5x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y8E[];
Class_Descriptor cd__ZN3ccc8CC5x12y8E = {  "_ZN3ccc8CC5x12y8E", // class name
  bases__ZN3ccc8CC5x12y8E, 2,
  &(vtc__ZN3ccc8CC5x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y9  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y93pqrEv
  ~CC5x12y9(); // tgen
  CC5x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y9E[];
extern void _ZN3ccc8CC5x12y93pqrEv();
extern void _ZN3ccc8CC5x12y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y9E[];
Class_Descriptor cd__ZN3ccc8CC5x12y9E = {  "_ZN3ccc8CC5x12y9E", // class name
  bases__ZN3ccc8CC5x12y9E, 2,
  &(vtc__ZN3ccc8CC5x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y10  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x12y103abcEv
  ~CC5x12y10(); // tgen
  CC5x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y10E[];
extern void _ZN3ccc9CC5x12y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y103abcEv,_ZThn4_N3ccc9CC5x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x12y103abcEv,_ZThn4_N3ccc9CC5x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y10E[];
Class_Descriptor cd__ZN3ccc9CC5x12y10E = {  "_ZN3ccc9CC5x12y10E", // class name
  bases__ZN3ccc9CC5x12y10E, 2,
  &(vtc__ZN3ccc9CC5x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y11  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x12y113efgEv
  ~CC5x12y11(); // tgen
  CC5x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y11E[];
extern void _ZN3ccc9CC5x12y113pqrEv();
extern void _ZN3ccc9CC5x12y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y11E[];
Class_Descriptor cd__ZN3ccc9CC5x12y11E = {  "_ZN3ccc9CC5x12y11E", // class name
  bases__ZN3ccc9CC5x12y11E, 2,
  &(vtc__ZN3ccc9CC5x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y12  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC5x12y123abcEv
  ~CC5x12y12(); // tgen
  CC5x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y123abcEv,_ZThn4_N3ccc9CC5x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x12y123abcEv,_ZThn4_N3ccc9CC5x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y12E[];
Class_Descriptor cd__ZN3ccc9CC5x12y12E = {  "_ZN3ccc9CC5x12y12E", // class name
  bases__ZN3ccc9CC5x12y12E, 2,
  &(vtc__ZN3ccc9CC5x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y13  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC5x12y133efgEv
  ~CC5x12y13(); // tgen
  CC5x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x12y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y13E[];
Class_Descriptor cd__ZN3ccc9CC5x12y13E = {  "_ZN3ccc9CC5x12y13E", // class name
  bases__ZN3ccc9CC5x12y13E, 2,
  &(vtc__ZN3ccc9CC5x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y14  : ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y143pqrEv
  ~CC5x12y14(); // tgen
  CC5x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y14E[];
extern void _ZN3ccc9CC5x12y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y14E[];
Class_Descriptor cd__ZN3ccc9CC5x12y14E = {  "_ZN3ccc9CC5x12y14E", // class name
  bases__ZN3ccc9CC5x12y14E, 2,
  &(vtc__ZN3ccc9CC5x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x12y15  : ::ccc::AA5 , ::ccc::BB12 {
  ~CC5x12y15(); // tgen
  CC5x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y15E[];
Class_Descriptor cd__ZN3ccc9CC5x12y15E = {  "_ZN3ccc9CC5x12y15E", // class name
  bases__ZN3ccc9CC5x12y15E, 2,
  &(vtc__ZN3ccc9CC5x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y0  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y03pqrEv
  ~CC5x13y0(); // tgen
  CC5x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y0E[];
extern void _ZN3ccc8CC5x13y03pqrEv();
extern void _ZN3ccc8CC5x13y03efgEv();
extern void _ZN3ccc8CC5x13y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y03efgEv,_ZThn4_N3ccc8CC5x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y03efgEv,_ZThn4_N3ccc8CC5x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y0E[];
Class_Descriptor cd__ZN3ccc8CC5x13y0E = {  "_ZN3ccc8CC5x13y0E", // class name
  bases__ZN3ccc8CC5x13y0E, 2,
  &(vtc__ZN3ccc8CC5x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y1  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x13y13efgEv
  ~CC5x13y1(); // tgen
  CC5x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y1E[];
extern void _ZN3ccc8CC5x13y13pqrEv();
extern void _ZN3ccc8CC5x13y13efgEv();
extern void _ZN3ccc8CC5x13y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y13efgEv,_ZThn4_N3ccc8CC5x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y13efgEv,_ZThn4_N3ccc8CC5x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y1E[];
Class_Descriptor cd__ZN3ccc8CC5x13y1E = {  "_ZN3ccc8CC5x13y1E", // class name
  bases__ZN3ccc8CC5x13y1E, 2,
  &(vtc__ZN3ccc8CC5x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y2  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y23pqrEv
  ~CC5x13y2(); // tgen
  CC5x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y2E[];
extern void _ZN3ccc8CC5x13y23pqrEv();
extern void _ZN3ccc8CC5x13y23efgEv();
extern void _ZN3ccc8CC5x13y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y23efgEv,_ZThn4_N3ccc8CC5x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y23efgEv,_ZThn4_N3ccc8CC5x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y2E[];
Class_Descriptor cd__ZN3ccc8CC5x13y2E = {  "_ZN3ccc8CC5x13y2E", // class name
  bases__ZN3ccc8CC5x13y2E, 2,
  &(vtc__ZN3ccc8CC5x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y3  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x13y33abcEv
  ~CC5x13y3(); // tgen
  CC5x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y3E[];
extern void _ZN3ccc8CC5x13y33pqrEv();
extern void _ZN3ccc8CC5x13y33efgEv();
extern void _ZN3ccc8CC5x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y33efgEv,_ZThn4_N3ccc8CC5x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y33efgEv,_ZThn4_N3ccc8CC5x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y3E[];
Class_Descriptor cd__ZN3ccc8CC5x13y3E = {  "_ZN3ccc8CC5x13y3E", // class name
  bases__ZN3ccc8CC5x13y3E, 2,
  &(vtc__ZN3ccc8CC5x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y4  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC5x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y43efgEv
  ~CC5x13y4(); // tgen
  CC5x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y4E[];
extern void _ZN3ccc8CC5x13y43pqrEv();
extern void _ZN3ccc8CC5x13y43efgEv();
extern void _ZN3ccc8CC5x13y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y43efgEv,_ZThn4_N3ccc8CC5x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y43efgEv,_ZThn4_N3ccc8CC5x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y4E[];
Class_Descriptor cd__ZN3ccc8CC5x13y4E = {  "_ZN3ccc8CC5x13y4E", // class name
  bases__ZN3ccc8CC5x13y4E, 2,
  &(vtc__ZN3ccc8CC5x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y5  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC5x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y53abcEv
  ~CC5x13y5(); // tgen
  CC5x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y5E[];
extern void _ZN3ccc8CC5x13y53pqrEv();
extern void _ZN3ccc8CC5x13y53efgEv();
extern void _ZN3ccc8CC5x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y53efgEv,_ZThn4_N3ccc8CC5x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y53efgEv,_ZThn4_N3ccc8CC5x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y5E[];
Class_Descriptor cd__ZN3ccc8CC5x13y5E = {  "_ZN3ccc8CC5x13y5E", // class name
  bases__ZN3ccc8CC5x13y5E, 2,
  &(vtc__ZN3ccc8CC5x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y6  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y63efgEv
  ~CC5x13y6(); // tgen
  CC5x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x13y63efgEv();
extern void _ZN3ccc8CC5x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y63efgEv,_ZThn4_N3ccc8CC5x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y63efgEv,_ZThn4_N3ccc8CC5x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y6E[];
Class_Descriptor cd__ZN3ccc8CC5x13y6E = {  "_ZN3ccc8CC5x13y6E", // class name
  bases__ZN3ccc8CC5x13y6E, 2,
  &(vtc__ZN3ccc8CC5x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y7  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y73pqrEv
  ~CC5x13y7(); // tgen
  CC5x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y7E[];
extern void _ZN3ccc8CC5x13y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y7E[];
Class_Descriptor cd__ZN3ccc8CC5x13y7E = {  "_ZN3ccc8CC5x13y7E", // class name
  bases__ZN3ccc8CC5x13y7E, 2,
  &(vtc__ZN3ccc8CC5x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y8  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y83abcEv
  ~CC5x13y8(); // tgen
  CC5x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x13y83efgEv();
extern void _ZN3ccc8CC5x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y83efgEv,_ZThn4_N3ccc8CC5x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y83efgEv,_ZThn4_N3ccc8CC5x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y8E[];
Class_Descriptor cd__ZN3ccc8CC5x13y8E = {  "_ZN3ccc8CC5x13y8E", // class name
  bases__ZN3ccc8CC5x13y8E, 2,
  &(vtc__ZN3ccc8CC5x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y9  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y93pqrEv
  ~CC5x13y9(); // tgen
  CC5x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y9E[];
extern void _ZN3ccc8CC5x13y93pqrEv();
extern void _ZN3ccc8CC5x13y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y93efgEv,_ZThn4_N3ccc8CC5x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x13y93efgEv,_ZThn4_N3ccc8CC5x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y9E[];
Class_Descriptor cd__ZN3ccc8CC5x13y9E = {  "_ZN3ccc8CC5x13y9E", // class name
  bases__ZN3ccc8CC5x13y9E, 2,
  &(vtc__ZN3ccc8CC5x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y10  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x13y103abcEv
  ~CC5x13y10(); // tgen
  CC5x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y10E[];
extern void _ZN3ccc9CC5x13y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y10E[];
Class_Descriptor cd__ZN3ccc9CC5x13y10E = {  "_ZN3ccc9CC5x13y10E", // class name
  bases__ZN3ccc9CC5x13y10E, 2,
  &(vtc__ZN3ccc9CC5x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y11  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x13y113efgEv
  ~CC5x13y11(); // tgen
  CC5x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y11E[];
extern void _ZN3ccc9CC5x13y113pqrEv();
extern void _ZN3ccc9CC5x13y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y113efgEv,_ZThn4_N3ccc9CC5x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x13y113efgEv,_ZThn4_N3ccc9CC5x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y11E[];
Class_Descriptor cd__ZN3ccc9CC5x13y11E = {  "_ZN3ccc9CC5x13y11E", // class name
  bases__ZN3ccc9CC5x13y11E, 2,
  &(vtc__ZN3ccc9CC5x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y12  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC5x13y123abcEv
  ~CC5x13y12(); // tgen
  CC5x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y12E[];
Class_Descriptor cd__ZN3ccc9CC5x13y12E = {  "_ZN3ccc9CC5x13y12E", // class name
  bases__ZN3ccc9CC5x13y12E, 2,
  &(vtc__ZN3ccc9CC5x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y13  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC5x13y133efgEv
  ~CC5x13y13(); // tgen
  CC5x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x13y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y133efgEv,_ZThn4_N3ccc9CC5x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x13y133efgEv,_ZThn4_N3ccc9CC5x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y13E[];
Class_Descriptor cd__ZN3ccc9CC5x13y13E = {  "_ZN3ccc9CC5x13y13E", // class name
  bases__ZN3ccc9CC5x13y13E, 2,
  &(vtc__ZN3ccc9CC5x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y14  : ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y143pqrEv
  ~CC5x13y14(); // tgen
  CC5x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y14E[];
extern void _ZN3ccc9CC5x13y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y14E[];
Class_Descriptor cd__ZN3ccc9CC5x13y14E = {  "_ZN3ccc9CC5x13y14E", // class name
  bases__ZN3ccc9CC5x13y14E, 2,
  &(vtc__ZN3ccc9CC5x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x13y15  : ::ccc::AA5 , ::ccc::BB13 {
  ~CC5x13y15(); // tgen
  CC5x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y15E[];
Class_Descriptor cd__ZN3ccc9CC5x13y15E = {  "_ZN3ccc9CC5x13y15E", // class name
  bases__ZN3ccc9CC5x13y15E, 2,
  &(vtc__ZN3ccc9CC5x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y0  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y03pqrEv
  ~CC5x14y0(); // tgen
  CC5x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y0E[];
extern void _ZN3ccc8CC5x14y03pqrEv();
extern void _ZN3ccc8CC5x14y03efgEv();
extern void _ZN3ccc8CC5x14y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y03pqrEv,_ZThn4_N3ccc8CC5x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y03pqrEv,_ZThn4_N3ccc8CC5x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y0E[];
Class_Descriptor cd__ZN3ccc8CC5x14y0E = {  "_ZN3ccc8CC5x14y0E", // class name
  bases__ZN3ccc8CC5x14y0E, 2,
  &(vtc__ZN3ccc8CC5x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y1  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x14y13efgEv
  ~CC5x14y1(); // tgen
  CC5x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y1E[];
extern void _ZN3ccc8CC5x14y13pqrEv();
extern void _ZN3ccc8CC5x14y13efgEv();
extern void _ZN3ccc8CC5x14y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y13pqrEv,_ZThn4_N3ccc8CC5x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y13pqrEv,_ZThn4_N3ccc8CC5x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y1E[];
Class_Descriptor cd__ZN3ccc8CC5x14y1E = {  "_ZN3ccc8CC5x14y1E", // class name
  bases__ZN3ccc8CC5x14y1E, 2,
  &(vtc__ZN3ccc8CC5x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y2  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y23pqrEv
  ~CC5x14y2(); // tgen
  CC5x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y2E[];
extern void _ZN3ccc8CC5x14y23pqrEv();
extern void _ZN3ccc8CC5x14y23efgEv();
extern void _ZN3ccc8CC5x14y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y23pqrEv,_ZThn4_N3ccc8CC5x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y23pqrEv,_ZThn4_N3ccc8CC5x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y2E[];
Class_Descriptor cd__ZN3ccc8CC5x14y2E = {  "_ZN3ccc8CC5x14y2E", // class name
  bases__ZN3ccc8CC5x14y2E, 2,
  &(vtc__ZN3ccc8CC5x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y3  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x14y33abcEv
  ~CC5x14y3(); // tgen
  CC5x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y3E[];
extern void _ZN3ccc8CC5x14y33pqrEv();
extern void _ZN3ccc8CC5x14y33efgEv();
extern void _ZN3ccc8CC5x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y33pqrEv,_ZThn4_N3ccc8CC5x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y33pqrEv,_ZThn4_N3ccc8CC5x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y3E[];
Class_Descriptor cd__ZN3ccc8CC5x14y3E = {  "_ZN3ccc8CC5x14y3E", // class name
  bases__ZN3ccc8CC5x14y3E, 2,
  &(vtc__ZN3ccc8CC5x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y4  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC5x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y43efgEv
  ~CC5x14y4(); // tgen
  CC5x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y4E[];
extern void _ZN3ccc8CC5x14y43pqrEv();
extern void _ZN3ccc8CC5x14y43efgEv();
extern void _ZN3ccc8CC5x14y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y43pqrEv,_ZThn4_N3ccc8CC5x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y43pqrEv,_ZThn4_N3ccc8CC5x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y4E[];
Class_Descriptor cd__ZN3ccc8CC5x14y4E = {  "_ZN3ccc8CC5x14y4E", // class name
  bases__ZN3ccc8CC5x14y4E, 2,
  &(vtc__ZN3ccc8CC5x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y5  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC5x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y53abcEv
  ~CC5x14y5(); // tgen
  CC5x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y5E[];
extern void _ZN3ccc8CC5x14y53pqrEv();
extern void _ZN3ccc8CC5x14y53efgEv();
extern void _ZN3ccc8CC5x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y53pqrEv,_ZThn4_N3ccc8CC5x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y53pqrEv,_ZThn4_N3ccc8CC5x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y5E[];
Class_Descriptor cd__ZN3ccc8CC5x14y5E = {  "_ZN3ccc8CC5x14y5E", // class name
  bases__ZN3ccc8CC5x14y5E, 2,
  &(vtc__ZN3ccc8CC5x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y6  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y63efgEv
  ~CC5x14y6(); // tgen
  CC5x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x14y63efgEv();
extern void _ZN3ccc8CC5x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y6E[];
Class_Descriptor cd__ZN3ccc8CC5x14y6E = {  "_ZN3ccc8CC5x14y6E", // class name
  bases__ZN3ccc8CC5x14y6E, 2,
  &(vtc__ZN3ccc8CC5x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y7  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y73pqrEv
  ~CC5x14y7(); // tgen
  CC5x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y7E[];
extern void _ZN3ccc8CC5x14y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y73pqrEv,_ZThn4_N3ccc8CC5x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y73pqrEv,_ZThn4_N3ccc8CC5x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y7E[];
Class_Descriptor cd__ZN3ccc8CC5x14y7E = {  "_ZN3ccc8CC5x14y7E", // class name
  bases__ZN3ccc8CC5x14y7E, 2,
  &(vtc__ZN3ccc8CC5x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y8  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y83abcEv
  ~CC5x14y8(); // tgen
  CC5x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x14y83efgEv();
extern void _ZN3ccc8CC5x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y8E[];
Class_Descriptor cd__ZN3ccc8CC5x14y8E = {  "_ZN3ccc8CC5x14y8E", // class name
  bases__ZN3ccc8CC5x14y8E, 2,
  &(vtc__ZN3ccc8CC5x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y9  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y93pqrEv
  ~CC5x14y9(); // tgen
  CC5x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC5x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y9E[];
extern void _ZN3ccc8CC5x14y93pqrEv();
extern void _ZN3ccc8CC5x14y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y93pqrEv,_ZThn4_N3ccc8CC5x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC5x14y93pqrEv,_ZThn4_N3ccc8CC5x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y9E[];
Class_Descriptor cd__ZN3ccc8CC5x14y9E = {  "_ZN3ccc8CC5x14y9E", // class name
  bases__ZN3ccc8CC5x14y9E, 2,
  &(vtc__ZN3ccc8CC5x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y10  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x14y103abcEv
  ~CC5x14y10(); // tgen
  CC5x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y10E[];
extern void _ZN3ccc9CC5x14y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y103pqrEv,_ZThn4_N3ccc9CC5x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x14y103pqrEv,_ZThn4_N3ccc9CC5x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y10E[];
Class_Descriptor cd__ZN3ccc9CC5x14y10E = {  "_ZN3ccc9CC5x14y10E", // class name
  bases__ZN3ccc9CC5x14y10E, 2,
  &(vtc__ZN3ccc9CC5x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y11  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x14y113efgEv
  ~CC5x14y11(); // tgen
  CC5x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y11E[];
extern void _ZN3ccc9CC5x14y113pqrEv();
extern void _ZN3ccc9CC5x14y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y113pqrEv,_ZThn4_N3ccc9CC5x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x14y113pqrEv,_ZThn4_N3ccc9CC5x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y11E[];
Class_Descriptor cd__ZN3ccc9CC5x14y11E = {  "_ZN3ccc9CC5x14y11E", // class name
  bases__ZN3ccc9CC5x14y11E, 2,
  &(vtc__ZN3ccc9CC5x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y12  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC5x14y123abcEv
  ~CC5x14y12(); // tgen
  CC5x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y12E[];
Class_Descriptor cd__ZN3ccc9CC5x14y12E = {  "_ZN3ccc9CC5x14y12E", // class name
  bases__ZN3ccc9CC5x14y12E, 2,
  &(vtc__ZN3ccc9CC5x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y13  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC5x14y133efgEv
  ~CC5x14y13(); // tgen
  CC5x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x14y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y13E[];
Class_Descriptor cd__ZN3ccc9CC5x14y13E = {  "_ZN3ccc9CC5x14y13E", // class name
  bases__ZN3ccc9CC5x14y13E, 2,
  &(vtc__ZN3ccc9CC5x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y14  : ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y143pqrEv
  ~CC5x14y14(); // tgen
  CC5x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y14E[];
extern void _ZN3ccc9CC5x14y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y143pqrEv,_ZThn4_N3ccc9CC5x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC5x14y143pqrEv,_ZThn4_N3ccc9CC5x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y14E[];
Class_Descriptor cd__ZN3ccc9CC5x14y14E = {  "_ZN3ccc9CC5x14y14E", // class name
  bases__ZN3ccc9CC5x14y14E, 2,
  &(vtc__ZN3ccc9CC5x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x14y15  : ::ccc::AA5 , ::ccc::BB14 {
  ~CC5x14y15(); // tgen
  CC5x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC5x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y15E[];
Class_Descriptor cd__ZN3ccc9CC5x14y15E = {  "_ZN3ccc9CC5x14y15E", // class name
  bases__ZN3ccc9CC5x14y15E, 2,
  &(vtc__ZN3ccc9CC5x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y0  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y03pqrEv
  ~CC5x15y0(); // tgen
  CC5x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y0E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y0E[];
Class_Descriptor cd__ZN3ccc8CC5x15y0E = {  "_ZN3ccc8CC5x15y0E", // class name
  bases__ZN3ccc8CC5x15y0E, 2,
  &(vtc__ZN3ccc8CC5x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y1  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x15y13efgEv
  ~CC5x15y1(); // tgen
  CC5x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y1E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y1E[];
Class_Descriptor cd__ZN3ccc8CC5x15y1E = {  "_ZN3ccc8CC5x15y1E", // class name
  bases__ZN3ccc8CC5x15y1E, 2,
  &(vtc__ZN3ccc8CC5x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y2  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y23pqrEv
  ~CC5x15y2(); // tgen
  CC5x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y2E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y2E[];
Class_Descriptor cd__ZN3ccc8CC5x15y2E = {  "_ZN3ccc8CC5x15y2E", // class name
  bases__ZN3ccc8CC5x15y2E, 2,
  &(vtc__ZN3ccc8CC5x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y3  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x15y33abcEv
  ~CC5x15y3(); // tgen
  CC5x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y3E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y3E[];
Class_Descriptor cd__ZN3ccc8CC5x15y3E = {  "_ZN3ccc8CC5x15y3E", // class name
  bases__ZN3ccc8CC5x15y3E, 2,
  &(vtc__ZN3ccc8CC5x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y4  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC5x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y43efgEv
  ~CC5x15y4(); // tgen
  CC5x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y4E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y4E[];
Class_Descriptor cd__ZN3ccc8CC5x15y4E = {  "_ZN3ccc8CC5x15y4E", // class name
  bases__ZN3ccc8CC5x15y4E, 2,
  &(vtc__ZN3ccc8CC5x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y5  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC5x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y53abcEv
  ~CC5x15y5(); // tgen
  CC5x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y5E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y5E[];
Class_Descriptor cd__ZN3ccc8CC5x15y5E = {  "_ZN3ccc8CC5x15y5E", // class name
  bases__ZN3ccc8CC5x15y5E, 2,
  &(vtc__ZN3ccc8CC5x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y6  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y63efgEv
  ~CC5x15y6(); // tgen
  CC5x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y6E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y6E[];
Class_Descriptor cd__ZN3ccc8CC5x15y6E = {  "_ZN3ccc8CC5x15y6E", // class name
  bases__ZN3ccc8CC5x15y6E, 2,
  &(vtc__ZN3ccc8CC5x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y7  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y73pqrEv
  ~CC5x15y7(); // tgen
  CC5x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y7E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y7E[];
Class_Descriptor cd__ZN3ccc8CC5x15y7E = {  "_ZN3ccc8CC5x15y7E", // class name
  bases__ZN3ccc8CC5x15y7E, 2,
  &(vtc__ZN3ccc8CC5x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y8  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y83abcEv
  ~CC5x15y8(); // tgen
  CC5x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y8E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y8E[];
Class_Descriptor cd__ZN3ccc8CC5x15y8E = {  "_ZN3ccc8CC5x15y8E", // class name
  bases__ZN3ccc8CC5x15y8E, 2,
  &(vtc__ZN3ccc8CC5x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y9  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y93pqrEv
  ~CC5x15y9(); // tgen
  CC5x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y9E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y9E[];
Class_Descriptor cd__ZN3ccc8CC5x15y9E = {  "_ZN3ccc8CC5x15y9E", // class name
  bases__ZN3ccc8CC5x15y9E, 2,
  &(vtc__ZN3ccc8CC5x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y10  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x15y103abcEv
  ~CC5x15y10(); // tgen
  CC5x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y10E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y10E[];
Class_Descriptor cd__ZN3ccc9CC5x15y10E = {  "_ZN3ccc9CC5x15y10E", // class name
  bases__ZN3ccc9CC5x15y10E, 2,
  &(vtc__ZN3ccc9CC5x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y11  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x15y113efgEv
  ~CC5x15y11(); // tgen
  CC5x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y11E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y11E[];
Class_Descriptor cd__ZN3ccc9CC5x15y11E = {  "_ZN3ccc9CC5x15y11E", // class name
  bases__ZN3ccc9CC5x15y11E, 2,
  &(vtc__ZN3ccc9CC5x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y12  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC5x15y123abcEv
  ~CC5x15y12(); // tgen
  CC5x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y12E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y12E[];
Class_Descriptor cd__ZN3ccc9CC5x15y12E = {  "_ZN3ccc9CC5x15y12E", // class name
  bases__ZN3ccc9CC5x15y12E, 2,
  &(vtc__ZN3ccc9CC5x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y13  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC5x15y133efgEv
  ~CC5x15y13(); // tgen
  CC5x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y13E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y13E[];
Class_Descriptor cd__ZN3ccc9CC5x15y13E = {  "_ZN3ccc9CC5x15y13E", // class name
  bases__ZN3ccc9CC5x15y13E, 2,
  &(vtc__ZN3ccc9CC5x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y14  : ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y143pqrEv
  ~CC5x15y14(); // tgen
  CC5x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y14E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y14E[];
Class_Descriptor cd__ZN3ccc9CC5x15y14E = {  "_ZN3ccc9CC5x15y14E", // class name
  bases__ZN3ccc9CC5x15y14E, 2,
  &(vtc__ZN3ccc9CC5x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y15  : ::ccc::AA5 , ::ccc::BB15 {
  ~CC5x15y15(); // tgen
  CC5x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y15E) C1{ BC2{ 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
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y15E[];
Class_Descriptor cd__ZN3ccc9CC5x15y15E = {  "_ZN3ccc9CC5x15y15E", // class name
  bases__ZN3ccc9CC5x15y15E, 2,
  &(vtc__ZN3ccc9CC5x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y0  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y03pqrEv
  ~CC6x0y0(); // tgen
  CC6x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y0E[];
extern void _ZN3ccc7CC6x0y03abcEv();
extern void _ZN3ccc7CC6x0y03efgEv();
extern void _ZN3ccc7CC6x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y03abcEv,_ZThn4_N3ccc7CC6x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y03efgEv,_ZThn4_N3ccc7CC6x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y03pqrEv,_ZThn4_N3ccc7CC6x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y03abcEv,_ZThn4_N3ccc7CC6x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y03efgEv,_ZThn4_N3ccc7CC6x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y03pqrEv,_ZThn4_N3ccc7CC6x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y0E[];
Class_Descriptor cd__ZN3ccc7CC6x0y0E = {  "_ZN3ccc7CC6x0y0E", // class name
  bases__ZN3ccc7CC6x0y0E, 2,
  &(vtc__ZN3ccc7CC6x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y1  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x0y13efgEv
  ~CC6x0y1(); // tgen
  CC6x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y1E[];
extern void _ZN3ccc7CC6x0y13abcEv();
extern void _ZN3ccc7CC6x0y13efgEv();
extern void _ZN3ccc7CC6x0y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y13abcEv,_ZThn4_N3ccc7CC6x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y13efgEv,_ZThn4_N3ccc7CC6x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y13pqrEv,_ZThn4_N3ccc7CC6x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y13abcEv,_ZThn4_N3ccc7CC6x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y13efgEv,_ZThn4_N3ccc7CC6x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y13pqrEv,_ZThn4_N3ccc7CC6x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y1E[];
Class_Descriptor cd__ZN3ccc7CC6x0y1E = {  "_ZN3ccc7CC6x0y1E", // class name
  bases__ZN3ccc7CC6x0y1E, 2,
  &(vtc__ZN3ccc7CC6x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y2  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y23pqrEv
  ~CC6x0y2(); // tgen
  CC6x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y2E[];
extern void _ZN3ccc7CC6x0y23abcEv();
extern void _ZN3ccc7CC6x0y23efgEv();
extern void _ZN3ccc7CC6x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y23abcEv,_ZThn4_N3ccc7CC6x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y23efgEv,_ZThn4_N3ccc7CC6x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y23pqrEv,_ZThn4_N3ccc7CC6x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y23abcEv,_ZThn4_N3ccc7CC6x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y23efgEv,_ZThn4_N3ccc7CC6x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y23pqrEv,_ZThn4_N3ccc7CC6x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y2E[];
Class_Descriptor cd__ZN3ccc7CC6x0y2E = {  "_ZN3ccc7CC6x0y2E", // class name
  bases__ZN3ccc7CC6x0y2E, 2,
  &(vtc__ZN3ccc7CC6x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y3  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x0y33abcEv
  ~CC6x0y3(); // tgen
  CC6x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y3E[];
extern void _ZN3ccc7CC6x0y33abcEv();
extern void _ZN3ccc7CC6x0y33efgEv();
extern void _ZN3ccc7CC6x0y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y33abcEv,_ZThn4_N3ccc7CC6x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y33efgEv,_ZThn4_N3ccc7CC6x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y33pqrEv,_ZThn4_N3ccc7CC6x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y33abcEv,_ZThn4_N3ccc7CC6x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y33efgEv,_ZThn4_N3ccc7CC6x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y33pqrEv,_ZThn4_N3ccc7CC6x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y3E[];
Class_Descriptor cd__ZN3ccc7CC6x0y3E = {  "_ZN3ccc7CC6x0y3E", // class name
  bases__ZN3ccc7CC6x0y3E, 2,
  &(vtc__ZN3ccc7CC6x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y4  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC6x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y43efgEv
  ~CC6x0y4(); // tgen
  CC6x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y4E[];
extern void _ZN3ccc7CC6x0y43abcEv();
extern void _ZN3ccc7CC6x0y43efgEv();
extern void _ZN3ccc7CC6x0y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y43abcEv,_ZThn4_N3ccc7CC6x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y43efgEv,_ZThn4_N3ccc7CC6x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y43pqrEv,_ZThn4_N3ccc7CC6x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y43abcEv,_ZThn4_N3ccc7CC6x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y43efgEv,_ZThn4_N3ccc7CC6x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y43pqrEv,_ZThn4_N3ccc7CC6x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y4E[];
Class_Descriptor cd__ZN3ccc7CC6x0y4E = {  "_ZN3ccc7CC6x0y4E", // class name
  bases__ZN3ccc7CC6x0y4E, 2,
  &(vtc__ZN3ccc7CC6x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y5  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC6x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y53abcEv
  ~CC6x0y5(); // tgen
  CC6x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y5E[];
extern void _ZN3ccc7CC6x0y53abcEv();
extern void _ZN3ccc7CC6x0y53efgEv();
extern void _ZN3ccc7CC6x0y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y53abcEv,_ZThn4_N3ccc7CC6x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y53efgEv,_ZThn4_N3ccc7CC6x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y53pqrEv,_ZThn4_N3ccc7CC6x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y53abcEv,_ZThn4_N3ccc7CC6x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y53efgEv,_ZThn4_N3ccc7CC6x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y53pqrEv,_ZThn4_N3ccc7CC6x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y5E[];
Class_Descriptor cd__ZN3ccc7CC6x0y5E = {  "_ZN3ccc7CC6x0y5E", // class name
  bases__ZN3ccc7CC6x0y5E, 2,
  &(vtc__ZN3ccc7CC6x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y6  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y63efgEv
  ~CC6x0y6(); // tgen
  CC6x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y6E[];
extern void _ZN3ccc7CC6x0y63abcEv();
extern void _ZN3ccc7CC6x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y63abcEv,_ZThn4_N3ccc7CC6x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y63efgEv,_ZThn4_N3ccc7CC6x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y63abcEv,_ZThn4_N3ccc7CC6x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y63efgEv,_ZThn4_N3ccc7CC6x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y6E[];
Class_Descriptor cd__ZN3ccc7CC6x0y6E = {  "_ZN3ccc7CC6x0y6E", // class name
  bases__ZN3ccc7CC6x0y6E, 2,
  &(vtc__ZN3ccc7CC6x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y7  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y73pqrEv
  ~CC6x0y7(); // tgen
  CC6x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y7E[];
extern void _ZN3ccc7CC6x0y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y73abcEv,_ZThn4_N3ccc7CC6x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y73pqrEv,_ZThn4_N3ccc7CC6x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y73abcEv,_ZThn4_N3ccc7CC6x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y73pqrEv,_ZThn4_N3ccc7CC6x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y7E[];
Class_Descriptor cd__ZN3ccc7CC6x0y7E = {  "_ZN3ccc7CC6x0y7E", // class name
  bases__ZN3ccc7CC6x0y7E, 2,
  &(vtc__ZN3ccc7CC6x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y8  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y83abcEv
  ~CC6x0y8(); // tgen
  CC6x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y8E[];
extern void _ZN3ccc7CC6x0y83abcEv();
extern void _ZN3ccc7CC6x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y83abcEv,_ZThn4_N3ccc7CC6x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y83efgEv,_ZThn4_N3ccc7CC6x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y83abcEv,_ZThn4_N3ccc7CC6x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y83efgEv,_ZThn4_N3ccc7CC6x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y8E[];
Class_Descriptor cd__ZN3ccc7CC6x0y8E = {  "_ZN3ccc7CC6x0y8E", // class name
  bases__ZN3ccc7CC6x0y8E, 2,
  &(vtc__ZN3ccc7CC6x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y9  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y93pqrEv
  ~CC6x0y9(); // tgen
  CC6x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x0y93efgEv();
extern void _ZN3ccc7CC6x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y93efgEv,_ZThn4_N3ccc7CC6x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y93pqrEv,_ZThn4_N3ccc7CC6x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y93efgEv,_ZThn4_N3ccc7CC6x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x0y93pqrEv,_ZThn4_N3ccc7CC6x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y9E[];
Class_Descriptor cd__ZN3ccc7CC6x0y9E = {  "_ZN3ccc7CC6x0y9E", // class name
  bases__ZN3ccc7CC6x0y9E, 2,
  &(vtc__ZN3ccc7CC6x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y10  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x0y103abcEv
  ~CC6x0y10(); // tgen
  CC6x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y10E[];
extern void _ZN3ccc8CC6x0y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y103abcEv,_ZThn4_N3ccc8CC6x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y103pqrEv,_ZThn4_N3ccc8CC6x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y103abcEv,_ZThn4_N3ccc8CC6x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y103pqrEv,_ZThn4_N3ccc8CC6x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y10E[];
Class_Descriptor cd__ZN3ccc8CC6x0y10E = {  "_ZN3ccc8CC6x0y10E", // class name
  bases__ZN3ccc8CC6x0y10E, 2,
  &(vtc__ZN3ccc8CC6x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y11  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x0y113efgEv
  ~CC6x0y11(); // tgen
  CC6x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x0y113efgEv();
extern void _ZN3ccc8CC6x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y113efgEv,_ZThn4_N3ccc8CC6x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y113pqrEv,_ZThn4_N3ccc8CC6x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y113efgEv,_ZThn4_N3ccc8CC6x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y113pqrEv,_ZThn4_N3ccc8CC6x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y11E[];
Class_Descriptor cd__ZN3ccc8CC6x0y11E = {  "_ZN3ccc8CC6x0y11E", // class name
  bases__ZN3ccc8CC6x0y11E, 2,
  &(vtc__ZN3ccc8CC6x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y12  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC6x0y123abcEv
  ~CC6x0y12(); // tgen
  CC6x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y12E[];
extern void _ZN3ccc8CC6x0y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y123abcEv,_ZThn4_N3ccc8CC6x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y123abcEv,_ZThn4_N3ccc8CC6x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y12E[];
Class_Descriptor cd__ZN3ccc8CC6x0y12E = {  "_ZN3ccc8CC6x0y12E", // class name
  bases__ZN3ccc8CC6x0y12E, 2,
  &(vtc__ZN3ccc8CC6x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y13  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC6x0y133efgEv
  ~CC6x0y13(); // tgen
  CC6x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y133efgEv,_ZThn4_N3ccc8CC6x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y133efgEv,_ZThn4_N3ccc8CC6x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y13E[];
Class_Descriptor cd__ZN3ccc8CC6x0y13E = {  "_ZN3ccc8CC6x0y13E", // class name
  bases__ZN3ccc8CC6x0y13E, 2,
  &(vtc__ZN3ccc8CC6x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y14  : ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y143pqrEv
  ~CC6x0y14(); // tgen
  CC6x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y143pqrEv,_ZThn4_N3ccc8CC6x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x0y143pqrEv,_ZThn4_N3ccc8CC6x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y14E[];
Class_Descriptor cd__ZN3ccc8CC6x0y14E = {  "_ZN3ccc8CC6x0y14E", // class name
  bases__ZN3ccc8CC6x0y14E, 2,
  &(vtc__ZN3ccc8CC6x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y15  : ::ccc::AA6 , ::ccc::BB0 {
  ~CC6x0y15(); // tgen
  CC6x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y15E[];
Class_Descriptor cd__ZN3ccc8CC6x0y15E = {  "_ZN3ccc8CC6x0y15E", // class name
  bases__ZN3ccc8CC6x0y15E, 2,
  &(vtc__ZN3ccc8CC6x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y0  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y03pqrEv
  ~CC6x1y0(); // tgen
  CC6x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y0E[];
extern void _ZN3ccc7CC6x1y03abcEv();
extern void _ZN3ccc7CC6x1y03efgEv();
extern void _ZN3ccc7CC6x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y03abcEv,_ZThn4_N3ccc7CC6x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y03pqrEv,_ZThn4_N3ccc7CC6x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y03efgEv,_ZThn4_N3ccc7CC6x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y03abcEv,_ZThn4_N3ccc7CC6x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y03pqrEv,_ZThn4_N3ccc7CC6x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y03efgEv,_ZThn4_N3ccc7CC6x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y0E[];
Class_Descriptor cd__ZN3ccc7CC6x1y0E = {  "_ZN3ccc7CC6x1y0E", // class name
  bases__ZN3ccc7CC6x1y0E, 2,
  &(vtc__ZN3ccc7CC6x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y1  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x1y13efgEv
  ~CC6x1y1(); // tgen
  CC6x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y1E[];
extern void _ZN3ccc7CC6x1y13abcEv();
extern void _ZN3ccc7CC6x1y13efgEv();
extern void _ZN3ccc7CC6x1y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y13abcEv,_ZThn4_N3ccc7CC6x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y13pqrEv,_ZThn4_N3ccc7CC6x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y13efgEv,_ZThn4_N3ccc7CC6x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y13abcEv,_ZThn4_N3ccc7CC6x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y13pqrEv,_ZThn4_N3ccc7CC6x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y13efgEv,_ZThn4_N3ccc7CC6x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y1E[];
Class_Descriptor cd__ZN3ccc7CC6x1y1E = {  "_ZN3ccc7CC6x1y1E", // class name
  bases__ZN3ccc7CC6x1y1E, 2,
  &(vtc__ZN3ccc7CC6x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y2  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y23pqrEv
  ~CC6x1y2(); // tgen
  CC6x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y2E[];
extern void _ZN3ccc7CC6x1y23abcEv();
extern void _ZN3ccc7CC6x1y23efgEv();
extern void _ZN3ccc7CC6x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y23abcEv,_ZThn4_N3ccc7CC6x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y23pqrEv,_ZThn4_N3ccc7CC6x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y23efgEv,_ZThn4_N3ccc7CC6x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y23abcEv,_ZThn4_N3ccc7CC6x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y23pqrEv,_ZThn4_N3ccc7CC6x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y23efgEv,_ZThn4_N3ccc7CC6x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y2E[];
Class_Descriptor cd__ZN3ccc7CC6x1y2E = {  "_ZN3ccc7CC6x1y2E", // class name
  bases__ZN3ccc7CC6x1y2E, 2,
  &(vtc__ZN3ccc7CC6x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y3  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x1y33abcEv
  ~CC6x1y3(); // tgen
  CC6x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y3E[];
extern void _ZN3ccc7CC6x1y33abcEv();
extern void _ZN3ccc7CC6x1y33efgEv();
extern void _ZN3ccc7CC6x1y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y33abcEv,_ZThn4_N3ccc7CC6x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y33pqrEv,_ZThn4_N3ccc7CC6x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y33efgEv,_ZThn4_N3ccc7CC6x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y33abcEv,_ZThn4_N3ccc7CC6x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y33pqrEv,_ZThn4_N3ccc7CC6x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y33efgEv,_ZThn4_N3ccc7CC6x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y3E[];
Class_Descriptor cd__ZN3ccc7CC6x1y3E = {  "_ZN3ccc7CC6x1y3E", // class name
  bases__ZN3ccc7CC6x1y3E, 2,
  &(vtc__ZN3ccc7CC6x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y4  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC6x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y43efgEv
  ~CC6x1y4(); // tgen
  CC6x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y4E[];
extern void _ZN3ccc7CC6x1y43abcEv();
extern void _ZN3ccc7CC6x1y43efgEv();
extern void _ZN3ccc7CC6x1y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y43abcEv,_ZThn4_N3ccc7CC6x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y43pqrEv,_ZThn4_N3ccc7CC6x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y43efgEv,_ZThn4_N3ccc7CC6x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y43abcEv,_ZThn4_N3ccc7CC6x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y43pqrEv,_ZThn4_N3ccc7CC6x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y43efgEv,_ZThn4_N3ccc7CC6x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y4E[];
Class_Descriptor cd__ZN3ccc7CC6x1y4E = {  "_ZN3ccc7CC6x1y4E", // class name
  bases__ZN3ccc7CC6x1y4E, 2,
  &(vtc__ZN3ccc7CC6x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y5  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC6x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y53abcEv
  ~CC6x1y5(); // tgen
  CC6x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y5E[];
extern void _ZN3ccc7CC6x1y53abcEv();
extern void _ZN3ccc7CC6x1y53efgEv();
extern void _ZN3ccc7CC6x1y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y53abcEv,_ZThn4_N3ccc7CC6x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y53pqrEv,_ZThn4_N3ccc7CC6x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y53efgEv,_ZThn4_N3ccc7CC6x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y53abcEv,_ZThn4_N3ccc7CC6x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y53pqrEv,_ZThn4_N3ccc7CC6x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y53efgEv,_ZThn4_N3ccc7CC6x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y5E[];
Class_Descriptor cd__ZN3ccc7CC6x1y5E = {  "_ZN3ccc7CC6x1y5E", // class name
  bases__ZN3ccc7CC6x1y5E, 2,
  &(vtc__ZN3ccc7CC6x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y6  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y63efgEv
  ~CC6x1y6(); // tgen
  CC6x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y6E[];
extern void _ZN3ccc7CC6x1y63abcEv();
extern void _ZN3ccc7CC6x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y63abcEv,_ZThn4_N3ccc7CC6x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y63efgEv,_ZThn4_N3ccc7CC6x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y63abcEv,_ZThn4_N3ccc7CC6x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y63efgEv,_ZThn4_N3ccc7CC6x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y6E[];
Class_Descriptor cd__ZN3ccc7CC6x1y6E = {  "_ZN3ccc7CC6x1y6E", // class name
  bases__ZN3ccc7CC6x1y6E, 2,
  &(vtc__ZN3ccc7CC6x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y7  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y73pqrEv
  ~CC6x1y7(); // tgen
  CC6x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y7E[];
extern void _ZN3ccc7CC6x1y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y73abcEv,_ZThn4_N3ccc7CC6x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y73pqrEv,_ZThn4_N3ccc7CC6x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y73abcEv,_ZThn4_N3ccc7CC6x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y73pqrEv,_ZThn4_N3ccc7CC6x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y7E[];
Class_Descriptor cd__ZN3ccc7CC6x1y7E = {  "_ZN3ccc7CC6x1y7E", // class name
  bases__ZN3ccc7CC6x1y7E, 2,
  &(vtc__ZN3ccc7CC6x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y8  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y83abcEv
  ~CC6x1y8(); // tgen
  CC6x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y8E[];
extern void _ZN3ccc7CC6x1y83abcEv();
extern void _ZN3ccc7CC6x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y83abcEv,_ZThn4_N3ccc7CC6x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y83efgEv,_ZThn4_N3ccc7CC6x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y83abcEv,_ZThn4_N3ccc7CC6x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y83efgEv,_ZThn4_N3ccc7CC6x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y8E[];
Class_Descriptor cd__ZN3ccc7CC6x1y8E = {  "_ZN3ccc7CC6x1y8E", // class name
  bases__ZN3ccc7CC6x1y8E, 2,
  &(vtc__ZN3ccc7CC6x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y9  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y93pqrEv
  ~CC6x1y9(); // tgen
  CC6x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x1y93efgEv();
extern void _ZN3ccc7CC6x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y93pqrEv,_ZThn4_N3ccc7CC6x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y93efgEv,_ZThn4_N3ccc7CC6x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y93pqrEv,_ZThn4_N3ccc7CC6x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x1y93efgEv,_ZThn4_N3ccc7CC6x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y9E[];
Class_Descriptor cd__ZN3ccc7CC6x1y9E = {  "_ZN3ccc7CC6x1y9E", // class name
  bases__ZN3ccc7CC6x1y9E, 2,
  &(vtc__ZN3ccc7CC6x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y10  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x1y103abcEv
  ~CC6x1y10(); // tgen
  CC6x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y10E[];
extern void _ZN3ccc8CC6x1y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y103abcEv,_ZThn4_N3ccc8CC6x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y103pqrEv,_ZThn4_N3ccc8CC6x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y103abcEv,_ZThn4_N3ccc8CC6x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y103pqrEv,_ZThn4_N3ccc8CC6x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y10E[];
Class_Descriptor cd__ZN3ccc8CC6x1y10E = {  "_ZN3ccc8CC6x1y10E", // class name
  bases__ZN3ccc8CC6x1y10E, 2,
  &(vtc__ZN3ccc8CC6x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y11  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x1y113efgEv
  ~CC6x1y11(); // tgen
  CC6x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x1y113efgEv();
extern void _ZN3ccc8CC6x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y113pqrEv,_ZThn4_N3ccc8CC6x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y113efgEv,_ZThn4_N3ccc8CC6x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y113pqrEv,_ZThn4_N3ccc8CC6x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y113efgEv,_ZThn4_N3ccc8CC6x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y11E[];
Class_Descriptor cd__ZN3ccc8CC6x1y11E = {  "_ZN3ccc8CC6x1y11E", // class name
  bases__ZN3ccc8CC6x1y11E, 2,
  &(vtc__ZN3ccc8CC6x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y12  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC6x1y123abcEv
  ~CC6x1y12(); // tgen
  CC6x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y12E[];
extern void _ZN3ccc8CC6x1y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y123abcEv,_ZThn4_N3ccc8CC6x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y123abcEv,_ZThn4_N3ccc8CC6x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y12E[];
Class_Descriptor cd__ZN3ccc8CC6x1y12E = {  "_ZN3ccc8CC6x1y12E", // class name
  bases__ZN3ccc8CC6x1y12E, 2,
  &(vtc__ZN3ccc8CC6x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y13  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC6x1y133efgEv
  ~CC6x1y13(); // tgen
  CC6x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y133efgEv,_ZThn4_N3ccc8CC6x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y133efgEv,_ZThn4_N3ccc8CC6x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y13E[];
Class_Descriptor cd__ZN3ccc8CC6x1y13E = {  "_ZN3ccc8CC6x1y13E", // class name
  bases__ZN3ccc8CC6x1y13E, 2,
  &(vtc__ZN3ccc8CC6x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y14  : ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y143pqrEv
  ~CC6x1y14(); // tgen
  CC6x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y143pqrEv,_ZThn4_N3ccc8CC6x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x1y143pqrEv,_ZThn4_N3ccc8CC6x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y14E[];
Class_Descriptor cd__ZN3ccc8CC6x1y14E = {  "_ZN3ccc8CC6x1y14E", // class name
  bases__ZN3ccc8CC6x1y14E, 2,
  &(vtc__ZN3ccc8CC6x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x1y15  : ::ccc::AA6 , ::ccc::BB1 {
  ~CC6x1y15(); // tgen
  CC6x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y15E[];
Class_Descriptor cd__ZN3ccc8CC6x1y15E = {  "_ZN3ccc8CC6x1y15E", // class name
  bases__ZN3ccc8CC6x1y15E, 2,
  &(vtc__ZN3ccc8CC6x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y0  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y03pqrEv
  ~CC6x2y0(); // tgen
  CC6x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y0E[];
extern void _ZN3ccc7CC6x2y03abcEv();
extern void _ZN3ccc7CC6x2y03efgEv();
extern void _ZN3ccc7CC6x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y03efgEv,_ZThn4_N3ccc7CC6x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y03abcEv,_ZThn4_N3ccc7CC6x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y03pqrEv,_ZThn4_N3ccc7CC6x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y03efgEv,_ZThn4_N3ccc7CC6x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y03abcEv,_ZThn4_N3ccc7CC6x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y03pqrEv,_ZThn4_N3ccc7CC6x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y0E[];
Class_Descriptor cd__ZN3ccc7CC6x2y0E = {  "_ZN3ccc7CC6x2y0E", // class name
  bases__ZN3ccc7CC6x2y0E, 2,
  &(vtc__ZN3ccc7CC6x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y1  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x2y13efgEv
  ~CC6x2y1(); // tgen
  CC6x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y1E[];
extern void _ZN3ccc7CC6x2y13abcEv();
extern void _ZN3ccc7CC6x2y13efgEv();
extern void _ZN3ccc7CC6x2y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y13efgEv,_ZThn4_N3ccc7CC6x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y13abcEv,_ZThn4_N3ccc7CC6x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y13pqrEv,_ZThn4_N3ccc7CC6x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y13efgEv,_ZThn4_N3ccc7CC6x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y13abcEv,_ZThn4_N3ccc7CC6x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y13pqrEv,_ZThn4_N3ccc7CC6x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y1E[];
Class_Descriptor cd__ZN3ccc7CC6x2y1E = {  "_ZN3ccc7CC6x2y1E", // class name
  bases__ZN3ccc7CC6x2y1E, 2,
  &(vtc__ZN3ccc7CC6x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y2  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y23pqrEv
  ~CC6x2y2(); // tgen
  CC6x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y2E[];
extern void _ZN3ccc7CC6x2y23abcEv();
extern void _ZN3ccc7CC6x2y23efgEv();
extern void _ZN3ccc7CC6x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y23efgEv,_ZThn4_N3ccc7CC6x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y23abcEv,_ZThn4_N3ccc7CC6x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y23pqrEv,_ZThn4_N3ccc7CC6x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y23efgEv,_ZThn4_N3ccc7CC6x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y23abcEv,_ZThn4_N3ccc7CC6x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y23pqrEv,_ZThn4_N3ccc7CC6x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y2E[];
Class_Descriptor cd__ZN3ccc7CC6x2y2E = {  "_ZN3ccc7CC6x2y2E", // class name
  bases__ZN3ccc7CC6x2y2E, 2,
  &(vtc__ZN3ccc7CC6x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y3  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x2y33abcEv
  ~CC6x2y3(); // tgen
  CC6x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y3E[];
extern void _ZN3ccc7CC6x2y33abcEv();
extern void _ZN3ccc7CC6x2y33efgEv();
extern void _ZN3ccc7CC6x2y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y33efgEv,_ZThn4_N3ccc7CC6x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y33abcEv,_ZThn4_N3ccc7CC6x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y33pqrEv,_ZThn4_N3ccc7CC6x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y33efgEv,_ZThn4_N3ccc7CC6x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y33abcEv,_ZThn4_N3ccc7CC6x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y33pqrEv,_ZThn4_N3ccc7CC6x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y3E[];
Class_Descriptor cd__ZN3ccc7CC6x2y3E = {  "_ZN3ccc7CC6x2y3E", // class name
  bases__ZN3ccc7CC6x2y3E, 2,
  &(vtc__ZN3ccc7CC6x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y4  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC6x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y43efgEv
  ~CC6x2y4(); // tgen
  CC6x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y4E[];
extern void _ZN3ccc7CC6x2y43abcEv();
extern void _ZN3ccc7CC6x2y43efgEv();
extern void _ZN3ccc7CC6x2y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y43efgEv,_ZThn4_N3ccc7CC6x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y43abcEv,_ZThn4_N3ccc7CC6x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y43pqrEv,_ZThn4_N3ccc7CC6x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y43efgEv,_ZThn4_N3ccc7CC6x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y43abcEv,_ZThn4_N3ccc7CC6x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y43pqrEv,_ZThn4_N3ccc7CC6x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y4E[];
Class_Descriptor cd__ZN3ccc7CC6x2y4E = {  "_ZN3ccc7CC6x2y4E", // class name
  bases__ZN3ccc7CC6x2y4E, 2,
  &(vtc__ZN3ccc7CC6x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y5  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC6x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y53abcEv
  ~CC6x2y5(); // tgen
  CC6x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y5E[];
extern void _ZN3ccc7CC6x2y53abcEv();
extern void _ZN3ccc7CC6x2y53efgEv();
extern void _ZN3ccc7CC6x2y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y53efgEv,_ZThn4_N3ccc7CC6x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y53abcEv,_ZThn4_N3ccc7CC6x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y53pqrEv,_ZThn4_N3ccc7CC6x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y53efgEv,_ZThn4_N3ccc7CC6x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y53abcEv,_ZThn4_N3ccc7CC6x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y53pqrEv,_ZThn4_N3ccc7CC6x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y5E[];
Class_Descriptor cd__ZN3ccc7CC6x2y5E = {  "_ZN3ccc7CC6x2y5E", // class name
  bases__ZN3ccc7CC6x2y5E, 2,
  &(vtc__ZN3ccc7CC6x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y6  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y63efgEv
  ~CC6x2y6(); // tgen
  CC6x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y6E[];
extern void _ZN3ccc7CC6x2y63abcEv();
extern void _ZN3ccc7CC6x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y63efgEv,_ZThn4_N3ccc7CC6x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y63abcEv,_ZThn4_N3ccc7CC6x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y63efgEv,_ZThn4_N3ccc7CC6x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y63abcEv,_ZThn4_N3ccc7CC6x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y6E[];
Class_Descriptor cd__ZN3ccc7CC6x2y6E = {  "_ZN3ccc7CC6x2y6E", // class name
  bases__ZN3ccc7CC6x2y6E, 2,
  &(vtc__ZN3ccc7CC6x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y7  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y73pqrEv
  ~CC6x2y7(); // tgen
  CC6x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y7E[];
extern void _ZN3ccc7CC6x2y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y73abcEv,_ZThn4_N3ccc7CC6x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y73pqrEv,_ZThn4_N3ccc7CC6x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y73abcEv,_ZThn4_N3ccc7CC6x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y73pqrEv,_ZThn4_N3ccc7CC6x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y7E[];
Class_Descriptor cd__ZN3ccc7CC6x2y7E = {  "_ZN3ccc7CC6x2y7E", // class name
  bases__ZN3ccc7CC6x2y7E, 2,
  &(vtc__ZN3ccc7CC6x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y8  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y83abcEv
  ~CC6x2y8(); // tgen
  CC6x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y8E[];
extern void _ZN3ccc7CC6x2y83abcEv();
extern void _ZN3ccc7CC6x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y83efgEv,_ZThn4_N3ccc7CC6x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y83abcEv,_ZThn4_N3ccc7CC6x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y83efgEv,_ZThn4_N3ccc7CC6x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y83abcEv,_ZThn4_N3ccc7CC6x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y8E[];
Class_Descriptor cd__ZN3ccc7CC6x2y8E = {  "_ZN3ccc7CC6x2y8E", // class name
  bases__ZN3ccc7CC6x2y8E, 2,
  &(vtc__ZN3ccc7CC6x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y9  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y93pqrEv
  ~CC6x2y9(); // tgen
  CC6x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x2y93efgEv();
extern void _ZN3ccc7CC6x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y93efgEv,_ZThn4_N3ccc7CC6x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y93pqrEv,_ZThn4_N3ccc7CC6x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y93efgEv,_ZThn4_N3ccc7CC6x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x2y93pqrEv,_ZThn4_N3ccc7CC6x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y9E[];
Class_Descriptor cd__ZN3ccc7CC6x2y9E = {  "_ZN3ccc7CC6x2y9E", // class name
  bases__ZN3ccc7CC6x2y9E, 2,
  &(vtc__ZN3ccc7CC6x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y10  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x2y103abcEv
  ~CC6x2y10(); // tgen
  CC6x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y10E[];
extern void _ZN3ccc8CC6x2y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y103abcEv,_ZThn4_N3ccc8CC6x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y103pqrEv,_ZThn4_N3ccc8CC6x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y103abcEv,_ZThn4_N3ccc8CC6x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y103pqrEv,_ZThn4_N3ccc8CC6x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y10E[];
Class_Descriptor cd__ZN3ccc8CC6x2y10E = {  "_ZN3ccc8CC6x2y10E", // class name
  bases__ZN3ccc8CC6x2y10E, 2,
  &(vtc__ZN3ccc8CC6x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y11  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x2y113efgEv
  ~CC6x2y11(); // tgen
  CC6x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x2y113efgEv();
extern void _ZN3ccc8CC6x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y113efgEv,_ZThn4_N3ccc8CC6x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y113pqrEv,_ZThn4_N3ccc8CC6x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y113efgEv,_ZThn4_N3ccc8CC6x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y113pqrEv,_ZThn4_N3ccc8CC6x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y11E[];
Class_Descriptor cd__ZN3ccc8CC6x2y11E = {  "_ZN3ccc8CC6x2y11E", // class name
  bases__ZN3ccc8CC6x2y11E, 2,
  &(vtc__ZN3ccc8CC6x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y12  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC6x2y123abcEv
  ~CC6x2y12(); // tgen
  CC6x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y12E[];
extern void _ZN3ccc8CC6x2y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y123abcEv,_ZThn4_N3ccc8CC6x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y123abcEv,_ZThn4_N3ccc8CC6x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y12E[];
Class_Descriptor cd__ZN3ccc8CC6x2y12E = {  "_ZN3ccc8CC6x2y12E", // class name
  bases__ZN3ccc8CC6x2y12E, 2,
  &(vtc__ZN3ccc8CC6x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y13  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC6x2y133efgEv
  ~CC6x2y13(); // tgen
  CC6x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y133efgEv,_ZThn4_N3ccc8CC6x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y133efgEv,_ZThn4_N3ccc8CC6x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y13E[];
Class_Descriptor cd__ZN3ccc8CC6x2y13E = {  "_ZN3ccc8CC6x2y13E", // class name
  bases__ZN3ccc8CC6x2y13E, 2,
  &(vtc__ZN3ccc8CC6x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y14  : ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y143pqrEv
  ~CC6x2y14(); // tgen
  CC6x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y143pqrEv,_ZThn4_N3ccc8CC6x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x2y143pqrEv,_ZThn4_N3ccc8CC6x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y14E[];
Class_Descriptor cd__ZN3ccc8CC6x2y14E = {  "_ZN3ccc8CC6x2y14E", // class name
  bases__ZN3ccc8CC6x2y14E, 2,
  &(vtc__ZN3ccc8CC6x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x2y15  : ::ccc::AA6 , ::ccc::BB2 {
  ~CC6x2y15(); // tgen
  CC6x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y15E[];
Class_Descriptor cd__ZN3ccc8CC6x2y15E = {  "_ZN3ccc8CC6x2y15E", // class name
  bases__ZN3ccc8CC6x2y15E, 2,
  &(vtc__ZN3ccc8CC6x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y0  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y03pqrEv
  ~CC6x3y0(); // tgen
  CC6x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y0E[];
extern void _ZN3ccc7CC6x3y03abcEv();
extern void _ZN3ccc7CC6x3y03efgEv();
extern void _ZN3ccc7CC6x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y03efgEv,_ZThn4_N3ccc7CC6x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y03pqrEv,_ZThn4_N3ccc7CC6x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y03abcEv,_ZThn4_N3ccc7CC6x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y03efgEv,_ZThn4_N3ccc7CC6x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y03pqrEv,_ZThn4_N3ccc7CC6x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y03abcEv,_ZThn4_N3ccc7CC6x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y0E[];
Class_Descriptor cd__ZN3ccc7CC6x3y0E = {  "_ZN3ccc7CC6x3y0E", // class name
  bases__ZN3ccc7CC6x3y0E, 2,
  &(vtc__ZN3ccc7CC6x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y1  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x3y13efgEv
  ~CC6x3y1(); // tgen
  CC6x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y1E[];
extern void _ZN3ccc7CC6x3y13abcEv();
extern void _ZN3ccc7CC6x3y13efgEv();
extern void _ZN3ccc7CC6x3y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y13efgEv,_ZThn4_N3ccc7CC6x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y13pqrEv,_ZThn4_N3ccc7CC6x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y13abcEv,_ZThn4_N3ccc7CC6x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y13efgEv,_ZThn4_N3ccc7CC6x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y13pqrEv,_ZThn4_N3ccc7CC6x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y13abcEv,_ZThn4_N3ccc7CC6x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y1E[];
Class_Descriptor cd__ZN3ccc7CC6x3y1E = {  "_ZN3ccc7CC6x3y1E", // class name
  bases__ZN3ccc7CC6x3y1E, 2,
  &(vtc__ZN3ccc7CC6x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y2  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y23pqrEv
  ~CC6x3y2(); // tgen
  CC6x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y2E[];
extern void _ZN3ccc7CC6x3y23abcEv();
extern void _ZN3ccc7CC6x3y23efgEv();
extern void _ZN3ccc7CC6x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y23efgEv,_ZThn4_N3ccc7CC6x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y23pqrEv,_ZThn4_N3ccc7CC6x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y23abcEv,_ZThn4_N3ccc7CC6x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y23efgEv,_ZThn4_N3ccc7CC6x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y23pqrEv,_ZThn4_N3ccc7CC6x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y23abcEv,_ZThn4_N3ccc7CC6x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y2E[];
Class_Descriptor cd__ZN3ccc7CC6x3y2E = {  "_ZN3ccc7CC6x3y2E", // class name
  bases__ZN3ccc7CC6x3y2E, 2,
  &(vtc__ZN3ccc7CC6x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y3  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x3y33abcEv
  ~CC6x3y3(); // tgen
  CC6x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y3E[];
extern void _ZN3ccc7CC6x3y33abcEv();
extern void _ZN3ccc7CC6x3y33efgEv();
extern void _ZN3ccc7CC6x3y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y33efgEv,_ZThn4_N3ccc7CC6x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y33pqrEv,_ZThn4_N3ccc7CC6x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y33abcEv,_ZThn4_N3ccc7CC6x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y33efgEv,_ZThn4_N3ccc7CC6x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y33pqrEv,_ZThn4_N3ccc7CC6x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y33abcEv,_ZThn4_N3ccc7CC6x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y3E[];
Class_Descriptor cd__ZN3ccc7CC6x3y3E = {  "_ZN3ccc7CC6x3y3E", // class name
  bases__ZN3ccc7CC6x3y3E, 2,
  &(vtc__ZN3ccc7CC6x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y4  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC6x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y43efgEv
  ~CC6x3y4(); // tgen
  CC6x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y4E[];
extern void _ZN3ccc7CC6x3y43abcEv();
extern void _ZN3ccc7CC6x3y43efgEv();
extern void _ZN3ccc7CC6x3y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y43efgEv,_ZThn4_N3ccc7CC6x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y43pqrEv,_ZThn4_N3ccc7CC6x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y43abcEv,_ZThn4_N3ccc7CC6x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y43efgEv,_ZThn4_N3ccc7CC6x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y43pqrEv,_ZThn4_N3ccc7CC6x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y43abcEv,_ZThn4_N3ccc7CC6x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y4E[];
Class_Descriptor cd__ZN3ccc7CC6x3y4E = {  "_ZN3ccc7CC6x3y4E", // class name
  bases__ZN3ccc7CC6x3y4E, 2,
  &(vtc__ZN3ccc7CC6x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y5  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC6x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y53abcEv
  ~CC6x3y5(); // tgen
  CC6x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y5E[];
extern void _ZN3ccc7CC6x3y53abcEv();
extern void _ZN3ccc7CC6x3y53efgEv();
extern void _ZN3ccc7CC6x3y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y53efgEv,_ZThn4_N3ccc7CC6x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y53pqrEv,_ZThn4_N3ccc7CC6x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y53abcEv,_ZThn4_N3ccc7CC6x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y53efgEv,_ZThn4_N3ccc7CC6x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y53pqrEv,_ZThn4_N3ccc7CC6x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y53abcEv,_ZThn4_N3ccc7CC6x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y5E[];
Class_Descriptor cd__ZN3ccc7CC6x3y5E = {  "_ZN3ccc7CC6x3y5E", // class name
  bases__ZN3ccc7CC6x3y5E, 2,
  &(vtc__ZN3ccc7CC6x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y6  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y63efgEv
  ~CC6x3y6(); // tgen
  CC6x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y6E[];
extern void _ZN3ccc7CC6x3y63abcEv();
extern void _ZN3ccc7CC6x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y63efgEv,_ZThn4_N3ccc7CC6x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y63abcEv,_ZThn4_N3ccc7CC6x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y63efgEv,_ZThn4_N3ccc7CC6x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y63abcEv,_ZThn4_N3ccc7CC6x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y6E[];
Class_Descriptor cd__ZN3ccc7CC6x3y6E = {  "_ZN3ccc7CC6x3y6E", // class name
  bases__ZN3ccc7CC6x3y6E, 2,
  &(vtc__ZN3ccc7CC6x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y7  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y73pqrEv
  ~CC6x3y7(); // tgen
  CC6x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y7E[];
extern void _ZN3ccc7CC6x3y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y73pqrEv,_ZThn4_N3ccc7CC6x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y73abcEv,_ZThn4_N3ccc7CC6x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y73pqrEv,_ZThn4_N3ccc7CC6x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y73abcEv,_ZThn4_N3ccc7CC6x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y7E[];
Class_Descriptor cd__ZN3ccc7CC6x3y7E = {  "_ZN3ccc7CC6x3y7E", // class name
  bases__ZN3ccc7CC6x3y7E, 2,
  &(vtc__ZN3ccc7CC6x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y8  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y83abcEv
  ~CC6x3y8(); // tgen
  CC6x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y8E[];
extern void _ZN3ccc7CC6x3y83abcEv();
extern void _ZN3ccc7CC6x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y83efgEv,_ZThn4_N3ccc7CC6x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y83abcEv,_ZThn4_N3ccc7CC6x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y83efgEv,_ZThn4_N3ccc7CC6x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y83abcEv,_ZThn4_N3ccc7CC6x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y8E[];
Class_Descriptor cd__ZN3ccc7CC6x3y8E = {  "_ZN3ccc7CC6x3y8E", // class name
  bases__ZN3ccc7CC6x3y8E, 2,
  &(vtc__ZN3ccc7CC6x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y9  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y93pqrEv
  ~CC6x3y9(); // tgen
  CC6x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x3y93efgEv();
extern void _ZN3ccc7CC6x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y93efgEv,_ZThn4_N3ccc7CC6x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y93pqrEv,_ZThn4_N3ccc7CC6x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y93efgEv,_ZThn4_N3ccc7CC6x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x3y93pqrEv,_ZThn4_N3ccc7CC6x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y9E[];
Class_Descriptor cd__ZN3ccc7CC6x3y9E = {  "_ZN3ccc7CC6x3y9E", // class name
  bases__ZN3ccc7CC6x3y9E, 2,
  &(vtc__ZN3ccc7CC6x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y10  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x3y103abcEv
  ~CC6x3y10(); // tgen
  CC6x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y10E[];
extern void _ZN3ccc8CC6x3y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y103pqrEv,_ZThn4_N3ccc8CC6x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y103abcEv,_ZThn4_N3ccc8CC6x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y103pqrEv,_ZThn4_N3ccc8CC6x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y103abcEv,_ZThn4_N3ccc8CC6x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y10E[];
Class_Descriptor cd__ZN3ccc8CC6x3y10E = {  "_ZN3ccc8CC6x3y10E", // class name
  bases__ZN3ccc8CC6x3y10E, 2,
  &(vtc__ZN3ccc8CC6x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y11  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x3y113efgEv
  ~CC6x3y11(); // tgen
  CC6x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x3y113efgEv();
extern void _ZN3ccc8CC6x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y113efgEv,_ZThn4_N3ccc8CC6x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y113pqrEv,_ZThn4_N3ccc8CC6x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y113efgEv,_ZThn4_N3ccc8CC6x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y113pqrEv,_ZThn4_N3ccc8CC6x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y11E[];
Class_Descriptor cd__ZN3ccc8CC6x3y11E = {  "_ZN3ccc8CC6x3y11E", // class name
  bases__ZN3ccc8CC6x3y11E, 2,
  &(vtc__ZN3ccc8CC6x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y12  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC6x3y123abcEv
  ~CC6x3y12(); // tgen
  CC6x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y12E[];
extern void _ZN3ccc8CC6x3y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y123abcEv,_ZThn4_N3ccc8CC6x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y123abcEv,_ZThn4_N3ccc8CC6x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y12E[];
Class_Descriptor cd__ZN3ccc8CC6x3y12E = {  "_ZN3ccc8CC6x3y12E", // class name
  bases__ZN3ccc8CC6x3y12E, 2,
  &(vtc__ZN3ccc8CC6x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y13  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC6x3y133efgEv
  ~CC6x3y13(); // tgen
  CC6x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y133efgEv,_ZThn4_N3ccc8CC6x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y133efgEv,_ZThn4_N3ccc8CC6x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y13E[];
Class_Descriptor cd__ZN3ccc8CC6x3y13E = {  "_ZN3ccc8CC6x3y13E", // class name
  bases__ZN3ccc8CC6x3y13E, 2,
  &(vtc__ZN3ccc8CC6x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y14  : ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y143pqrEv
  ~CC6x3y14(); // tgen
  CC6x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y143pqrEv,_ZThn4_N3ccc8CC6x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x3y143pqrEv,_ZThn4_N3ccc8CC6x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y14E[];
Class_Descriptor cd__ZN3ccc8CC6x3y14E = {  "_ZN3ccc8CC6x3y14E", // class name
  bases__ZN3ccc8CC6x3y14E, 2,
  &(vtc__ZN3ccc8CC6x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x3y15  : ::ccc::AA6 , ::ccc::BB3 {
  ~CC6x3y15(); // tgen
  CC6x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y15E[];
Class_Descriptor cd__ZN3ccc8CC6x3y15E = {  "_ZN3ccc8CC6x3y15E", // class name
  bases__ZN3ccc8CC6x3y15E, 2,
  &(vtc__ZN3ccc8CC6x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y0  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y03pqrEv
  ~CC6x4y0(); // tgen
  CC6x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y0E[];
extern void _ZN3ccc7CC6x4y03abcEv();
extern void _ZN3ccc7CC6x4y03efgEv();
extern void _ZN3ccc7CC6x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y03pqrEv,_ZThn4_N3ccc7CC6x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y03abcEv,_ZThn4_N3ccc7CC6x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y03efgEv,_ZThn4_N3ccc7CC6x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y03pqrEv,_ZThn4_N3ccc7CC6x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y03abcEv,_ZThn4_N3ccc7CC6x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y03efgEv,_ZThn4_N3ccc7CC6x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y0E[];
Class_Descriptor cd__ZN3ccc7CC6x4y0E = {  "_ZN3ccc7CC6x4y0E", // class name
  bases__ZN3ccc7CC6x4y0E, 2,
  &(vtc__ZN3ccc7CC6x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y1  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x4y13efgEv
  ~CC6x4y1(); // tgen
  CC6x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y1E[];
extern void _ZN3ccc7CC6x4y13abcEv();
extern void _ZN3ccc7CC6x4y13efgEv();
extern void _ZN3ccc7CC6x4y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y13pqrEv,_ZThn4_N3ccc7CC6x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y13abcEv,_ZThn4_N3ccc7CC6x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y13efgEv,_ZThn4_N3ccc7CC6x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y13pqrEv,_ZThn4_N3ccc7CC6x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y13abcEv,_ZThn4_N3ccc7CC6x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y13efgEv,_ZThn4_N3ccc7CC6x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y1E[];
Class_Descriptor cd__ZN3ccc7CC6x4y1E = {  "_ZN3ccc7CC6x4y1E", // class name
  bases__ZN3ccc7CC6x4y1E, 2,
  &(vtc__ZN3ccc7CC6x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y2  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y23pqrEv
  ~CC6x4y2(); // tgen
  CC6x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y2E[];
extern void _ZN3ccc7CC6x4y23abcEv();
extern void _ZN3ccc7CC6x4y23efgEv();
extern void _ZN3ccc7CC6x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y23pqrEv,_ZThn4_N3ccc7CC6x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y23abcEv,_ZThn4_N3ccc7CC6x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y23efgEv,_ZThn4_N3ccc7CC6x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y23pqrEv,_ZThn4_N3ccc7CC6x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y23abcEv,_ZThn4_N3ccc7CC6x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y23efgEv,_ZThn4_N3ccc7CC6x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y2E[];
Class_Descriptor cd__ZN3ccc7CC6x4y2E = {  "_ZN3ccc7CC6x4y2E", // class name
  bases__ZN3ccc7CC6x4y2E, 2,
  &(vtc__ZN3ccc7CC6x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y3  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x4y33abcEv
  ~CC6x4y3(); // tgen
  CC6x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y3E[];
extern void _ZN3ccc7CC6x4y33abcEv();
extern void _ZN3ccc7CC6x4y33efgEv();
extern void _ZN3ccc7CC6x4y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y33pqrEv,_ZThn4_N3ccc7CC6x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y33abcEv,_ZThn4_N3ccc7CC6x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y33efgEv,_ZThn4_N3ccc7CC6x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y33pqrEv,_ZThn4_N3ccc7CC6x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y33abcEv,_ZThn4_N3ccc7CC6x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y33efgEv,_ZThn4_N3ccc7CC6x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y3E[];
Class_Descriptor cd__ZN3ccc7CC6x4y3E = {  "_ZN3ccc7CC6x4y3E", // class name
  bases__ZN3ccc7CC6x4y3E, 2,
  &(vtc__ZN3ccc7CC6x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y4  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC6x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y43efgEv
  ~CC6x4y4(); // tgen
  CC6x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y4E[];
extern void _ZN3ccc7CC6x4y43abcEv();
extern void _ZN3ccc7CC6x4y43efgEv();
extern void _ZN3ccc7CC6x4y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y43pqrEv,_ZThn4_N3ccc7CC6x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y43abcEv,_ZThn4_N3ccc7CC6x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y43efgEv,_ZThn4_N3ccc7CC6x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y43pqrEv,_ZThn4_N3ccc7CC6x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y43abcEv,_ZThn4_N3ccc7CC6x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y43efgEv,_ZThn4_N3ccc7CC6x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y4E[];
Class_Descriptor cd__ZN3ccc7CC6x4y4E = {  "_ZN3ccc7CC6x4y4E", // class name
  bases__ZN3ccc7CC6x4y4E, 2,
  &(vtc__ZN3ccc7CC6x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y5  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC6x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y53abcEv
  ~CC6x4y5(); // tgen
  CC6x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y5E[];
extern void _ZN3ccc7CC6x4y53abcEv();
extern void _ZN3ccc7CC6x4y53efgEv();
extern void _ZN3ccc7CC6x4y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y53pqrEv,_ZThn4_N3ccc7CC6x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y53abcEv,_ZThn4_N3ccc7CC6x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y53efgEv,_ZThn4_N3ccc7CC6x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y53pqrEv,_ZThn4_N3ccc7CC6x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y53abcEv,_ZThn4_N3ccc7CC6x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y53efgEv,_ZThn4_N3ccc7CC6x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y5E[];
Class_Descriptor cd__ZN3ccc7CC6x4y5E = {  "_ZN3ccc7CC6x4y5E", // class name
  bases__ZN3ccc7CC6x4y5E, 2,
  &(vtc__ZN3ccc7CC6x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y6  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y63efgEv
  ~CC6x4y6(); // tgen
  CC6x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y6E[];
extern void _ZN3ccc7CC6x4y63abcEv();
extern void _ZN3ccc7CC6x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y63abcEv,_ZThn4_N3ccc7CC6x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y63efgEv,_ZThn4_N3ccc7CC6x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y63abcEv,_ZThn4_N3ccc7CC6x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y63efgEv,_ZThn4_N3ccc7CC6x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y6E[];
Class_Descriptor cd__ZN3ccc7CC6x4y6E = {  "_ZN3ccc7CC6x4y6E", // class name
  bases__ZN3ccc7CC6x4y6E, 2,
  &(vtc__ZN3ccc7CC6x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y7  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y73pqrEv
  ~CC6x4y7(); // tgen
  CC6x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y7E[];
extern void _ZN3ccc7CC6x4y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y73pqrEv,_ZThn4_N3ccc7CC6x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y73abcEv,_ZThn4_N3ccc7CC6x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y73pqrEv,_ZThn4_N3ccc7CC6x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y73abcEv,_ZThn4_N3ccc7CC6x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y7E[];
Class_Descriptor cd__ZN3ccc7CC6x4y7E = {  "_ZN3ccc7CC6x4y7E", // class name
  bases__ZN3ccc7CC6x4y7E, 2,
  &(vtc__ZN3ccc7CC6x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y8  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y83abcEv
  ~CC6x4y8(); // tgen
  CC6x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y8E[];
extern void _ZN3ccc7CC6x4y83abcEv();
extern void _ZN3ccc7CC6x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y83abcEv,_ZThn4_N3ccc7CC6x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y83efgEv,_ZThn4_N3ccc7CC6x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y83abcEv,_ZThn4_N3ccc7CC6x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y83efgEv,_ZThn4_N3ccc7CC6x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y8E[];
Class_Descriptor cd__ZN3ccc7CC6x4y8E = {  "_ZN3ccc7CC6x4y8E", // class name
  bases__ZN3ccc7CC6x4y8E, 2,
  &(vtc__ZN3ccc7CC6x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y9  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y93pqrEv
  ~CC6x4y9(); // tgen
  CC6x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x4y93efgEv();
extern void _ZN3ccc7CC6x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y93pqrEv,_ZThn4_N3ccc7CC6x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y93efgEv,_ZThn4_N3ccc7CC6x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y93pqrEv,_ZThn4_N3ccc7CC6x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x4y93efgEv,_ZThn4_N3ccc7CC6x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y9E[];
Class_Descriptor cd__ZN3ccc7CC6x4y9E = {  "_ZN3ccc7CC6x4y9E", // class name
  bases__ZN3ccc7CC6x4y9E, 2,
  &(vtc__ZN3ccc7CC6x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y10  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x4y103abcEv
  ~CC6x4y10(); // tgen
  CC6x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y10E[];
extern void _ZN3ccc8CC6x4y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y103pqrEv,_ZThn4_N3ccc8CC6x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y103abcEv,_ZThn4_N3ccc8CC6x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y103pqrEv,_ZThn4_N3ccc8CC6x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y103abcEv,_ZThn4_N3ccc8CC6x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y10E[];
Class_Descriptor cd__ZN3ccc8CC6x4y10E = {  "_ZN3ccc8CC6x4y10E", // class name
  bases__ZN3ccc8CC6x4y10E, 2,
  &(vtc__ZN3ccc8CC6x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y11  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x4y113efgEv
  ~CC6x4y11(); // tgen
  CC6x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x4y113efgEv();
extern void _ZN3ccc8CC6x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y113pqrEv,_ZThn4_N3ccc8CC6x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y113efgEv,_ZThn4_N3ccc8CC6x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y113pqrEv,_ZThn4_N3ccc8CC6x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y113efgEv,_ZThn4_N3ccc8CC6x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y11E[];
Class_Descriptor cd__ZN3ccc8CC6x4y11E = {  "_ZN3ccc8CC6x4y11E", // class name
  bases__ZN3ccc8CC6x4y11E, 2,
  &(vtc__ZN3ccc8CC6x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y12  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC6x4y123abcEv
  ~CC6x4y12(); // tgen
  CC6x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y12E[];
extern void _ZN3ccc8CC6x4y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y123abcEv,_ZThn4_N3ccc8CC6x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y123abcEv,_ZThn4_N3ccc8CC6x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y12E[];
Class_Descriptor cd__ZN3ccc8CC6x4y12E = {  "_ZN3ccc8CC6x4y12E", // class name
  bases__ZN3ccc8CC6x4y12E, 2,
  &(vtc__ZN3ccc8CC6x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y13  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC6x4y133efgEv
  ~CC6x4y13(); // tgen
  CC6x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y133efgEv,_ZThn4_N3ccc8CC6x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y133efgEv,_ZThn4_N3ccc8CC6x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y13E[];
Class_Descriptor cd__ZN3ccc8CC6x4y13E = {  "_ZN3ccc8CC6x4y13E", // class name
  bases__ZN3ccc8CC6x4y13E, 2,
  &(vtc__ZN3ccc8CC6x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y14  : ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y143pqrEv
  ~CC6x4y14(); // tgen
  CC6x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y143pqrEv,_ZThn4_N3ccc8CC6x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x4y143pqrEv,_ZThn4_N3ccc8CC6x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y14E[];
Class_Descriptor cd__ZN3ccc8CC6x4y14E = {  "_ZN3ccc8CC6x4y14E", // class name
  bases__ZN3ccc8CC6x4y14E, 2,
  &(vtc__ZN3ccc8CC6x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x4y15  : ::ccc::AA6 , ::ccc::BB4 {
  ~CC6x4y15(); // tgen
  CC6x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y15E[];
Class_Descriptor cd__ZN3ccc8CC6x4y15E = {  "_ZN3ccc8CC6x4y15E", // class name
  bases__ZN3ccc8CC6x4y15E, 2,
  &(vtc__ZN3ccc8CC6x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y0  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y03pqrEv
  ~CC6x5y0(); // tgen
  CC6x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y0E[];
extern void _ZN3ccc7CC6x5y03abcEv();
extern void _ZN3ccc7CC6x5y03efgEv();
extern void _ZN3ccc7CC6x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y03pqrEv,_ZThn4_N3ccc7CC6x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y03efgEv,_ZThn4_N3ccc7CC6x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y03abcEv,_ZThn4_N3ccc7CC6x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y03pqrEv,_ZThn4_N3ccc7CC6x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y03efgEv,_ZThn4_N3ccc7CC6x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y03abcEv,_ZThn4_N3ccc7CC6x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y0E[];
Class_Descriptor cd__ZN3ccc7CC6x5y0E = {  "_ZN3ccc7CC6x5y0E", // class name
  bases__ZN3ccc7CC6x5y0E, 2,
  &(vtc__ZN3ccc7CC6x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y1  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x5y13efgEv
  ~CC6x5y1(); // tgen
  CC6x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y1E[];
extern void _ZN3ccc7CC6x5y13abcEv();
extern void _ZN3ccc7CC6x5y13efgEv();
extern void _ZN3ccc7CC6x5y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y13pqrEv,_ZThn4_N3ccc7CC6x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y13efgEv,_ZThn4_N3ccc7CC6x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y13abcEv,_ZThn4_N3ccc7CC6x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y13pqrEv,_ZThn4_N3ccc7CC6x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y13efgEv,_ZThn4_N3ccc7CC6x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y13abcEv,_ZThn4_N3ccc7CC6x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y1E[];
Class_Descriptor cd__ZN3ccc7CC6x5y1E = {  "_ZN3ccc7CC6x5y1E", // class name
  bases__ZN3ccc7CC6x5y1E, 2,
  &(vtc__ZN3ccc7CC6x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y2  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y23pqrEv
  ~CC6x5y2(); // tgen
  CC6x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y2E[];
extern void _ZN3ccc7CC6x5y23abcEv();
extern void _ZN3ccc7CC6x5y23efgEv();
extern void _ZN3ccc7CC6x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y23pqrEv,_ZThn4_N3ccc7CC6x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y23efgEv,_ZThn4_N3ccc7CC6x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y23abcEv,_ZThn4_N3ccc7CC6x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y23pqrEv,_ZThn4_N3ccc7CC6x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y23efgEv,_ZThn4_N3ccc7CC6x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y23abcEv,_ZThn4_N3ccc7CC6x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y2E[];
Class_Descriptor cd__ZN3ccc7CC6x5y2E = {  "_ZN3ccc7CC6x5y2E", // class name
  bases__ZN3ccc7CC6x5y2E, 2,
  &(vtc__ZN3ccc7CC6x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y3  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x5y33abcEv
  ~CC6x5y3(); // tgen
  CC6x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y3E[];
extern void _ZN3ccc7CC6x5y33abcEv();
extern void _ZN3ccc7CC6x5y33efgEv();
extern void _ZN3ccc7CC6x5y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y33pqrEv,_ZThn4_N3ccc7CC6x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y33efgEv,_ZThn4_N3ccc7CC6x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y33abcEv,_ZThn4_N3ccc7CC6x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y33pqrEv,_ZThn4_N3ccc7CC6x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y33efgEv,_ZThn4_N3ccc7CC6x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y33abcEv,_ZThn4_N3ccc7CC6x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y3E[];
Class_Descriptor cd__ZN3ccc7CC6x5y3E = {  "_ZN3ccc7CC6x5y3E", // class name
  bases__ZN3ccc7CC6x5y3E, 2,
  &(vtc__ZN3ccc7CC6x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y4  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC6x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y43efgEv
  ~CC6x5y4(); // tgen
  CC6x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y4E[];
extern void _ZN3ccc7CC6x5y43abcEv();
extern void _ZN3ccc7CC6x5y43efgEv();
extern void _ZN3ccc7CC6x5y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y43pqrEv,_ZThn4_N3ccc7CC6x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y43efgEv,_ZThn4_N3ccc7CC6x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y43abcEv,_ZThn4_N3ccc7CC6x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y43pqrEv,_ZThn4_N3ccc7CC6x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y43efgEv,_ZThn4_N3ccc7CC6x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y43abcEv,_ZThn4_N3ccc7CC6x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y4E[];
Class_Descriptor cd__ZN3ccc7CC6x5y4E = {  "_ZN3ccc7CC6x5y4E", // class name
  bases__ZN3ccc7CC6x5y4E, 2,
  &(vtc__ZN3ccc7CC6x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y5  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC6x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y53abcEv
  ~CC6x5y5(); // tgen
  CC6x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y5E[];
extern void _ZN3ccc7CC6x5y53abcEv();
extern void _ZN3ccc7CC6x5y53efgEv();
extern void _ZN3ccc7CC6x5y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y53pqrEv,_ZThn4_N3ccc7CC6x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y53efgEv,_ZThn4_N3ccc7CC6x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y53abcEv,_ZThn4_N3ccc7CC6x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y53pqrEv,_ZThn4_N3ccc7CC6x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y53efgEv,_ZThn4_N3ccc7CC6x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y53abcEv,_ZThn4_N3ccc7CC6x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y5E[];
Class_Descriptor cd__ZN3ccc7CC6x5y5E = {  "_ZN3ccc7CC6x5y5E", // class name
  bases__ZN3ccc7CC6x5y5E, 2,
  &(vtc__ZN3ccc7CC6x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y6  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y63efgEv
  ~CC6x5y6(); // tgen
  CC6x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y6E[];
extern void _ZN3ccc7CC6x5y63abcEv();
extern void _ZN3ccc7CC6x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y63efgEv,_ZThn4_N3ccc7CC6x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y63abcEv,_ZThn4_N3ccc7CC6x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y63efgEv,_ZThn4_N3ccc7CC6x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y63abcEv,_ZThn4_N3ccc7CC6x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y6E[];
Class_Descriptor cd__ZN3ccc7CC6x5y6E = {  "_ZN3ccc7CC6x5y6E", // class name
  bases__ZN3ccc7CC6x5y6E, 2,
  &(vtc__ZN3ccc7CC6x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y7  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y73pqrEv
  ~CC6x5y7(); // tgen
  CC6x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y7E[];
extern void _ZN3ccc7CC6x5y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y73pqrEv,_ZThn4_N3ccc7CC6x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y73abcEv,_ZThn4_N3ccc7CC6x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y73pqrEv,_ZThn4_N3ccc7CC6x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y73abcEv,_ZThn4_N3ccc7CC6x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y7E[];
Class_Descriptor cd__ZN3ccc7CC6x5y7E = {  "_ZN3ccc7CC6x5y7E", // class name
  bases__ZN3ccc7CC6x5y7E, 2,
  &(vtc__ZN3ccc7CC6x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y8  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y83abcEv
  ~CC6x5y8(); // tgen
  CC6x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y8E[];
extern void _ZN3ccc7CC6x5y83abcEv();
extern void _ZN3ccc7CC6x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y83efgEv,_ZThn4_N3ccc7CC6x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y83abcEv,_ZThn4_N3ccc7CC6x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y83efgEv,_ZThn4_N3ccc7CC6x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y83abcEv,_ZThn4_N3ccc7CC6x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y8E[];
Class_Descriptor cd__ZN3ccc7CC6x5y8E = {  "_ZN3ccc7CC6x5y8E", // class name
  bases__ZN3ccc7CC6x5y8E, 2,
  &(vtc__ZN3ccc7CC6x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y9  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y93pqrEv
  ~CC6x5y9(); // tgen
  CC6x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x5y93efgEv();
extern void _ZN3ccc7CC6x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y93pqrEv,_ZThn4_N3ccc7CC6x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y93efgEv,_ZThn4_N3ccc7CC6x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y93pqrEv,_ZThn4_N3ccc7CC6x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x5y93efgEv,_ZThn4_N3ccc7CC6x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y9E[];
Class_Descriptor cd__ZN3ccc7CC6x5y9E = {  "_ZN3ccc7CC6x5y9E", // class name
  bases__ZN3ccc7CC6x5y9E, 2,
  &(vtc__ZN3ccc7CC6x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y10  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x5y103abcEv
  ~CC6x5y10(); // tgen
  CC6x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y10E[];
extern void _ZN3ccc8CC6x5y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y103pqrEv,_ZThn4_N3ccc8CC6x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y103abcEv,_ZThn4_N3ccc8CC6x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y103pqrEv,_ZThn4_N3ccc8CC6x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y103abcEv,_ZThn4_N3ccc8CC6x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y10E[];
Class_Descriptor cd__ZN3ccc8CC6x5y10E = {  "_ZN3ccc8CC6x5y10E", // class name
  bases__ZN3ccc8CC6x5y10E, 2,
  &(vtc__ZN3ccc8CC6x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y11  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x5y113efgEv
  ~CC6x5y11(); // tgen
  CC6x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x5y113efgEv();
extern void _ZN3ccc8CC6x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y113pqrEv,_ZThn4_N3ccc8CC6x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y113efgEv,_ZThn4_N3ccc8CC6x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y113pqrEv,_ZThn4_N3ccc8CC6x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y113efgEv,_ZThn4_N3ccc8CC6x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y11E[];
Class_Descriptor cd__ZN3ccc8CC6x5y11E = {  "_ZN3ccc8CC6x5y11E", // class name
  bases__ZN3ccc8CC6x5y11E, 2,
  &(vtc__ZN3ccc8CC6x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y12  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC6x5y123abcEv
  ~CC6x5y12(); // tgen
  CC6x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y12E[];
extern void _ZN3ccc8CC6x5y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y123abcEv,_ZThn4_N3ccc8CC6x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y123abcEv,_ZThn4_N3ccc8CC6x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y12E[];
Class_Descriptor cd__ZN3ccc8CC6x5y12E = {  "_ZN3ccc8CC6x5y12E", // class name
  bases__ZN3ccc8CC6x5y12E, 2,
  &(vtc__ZN3ccc8CC6x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y13  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC6x5y133efgEv
  ~CC6x5y13(); // tgen
  CC6x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y133efgEv,_ZThn4_N3ccc8CC6x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y133efgEv,_ZThn4_N3ccc8CC6x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y13E[];
Class_Descriptor cd__ZN3ccc8CC6x5y13E = {  "_ZN3ccc8CC6x5y13E", // class name
  bases__ZN3ccc8CC6x5y13E, 2,
  &(vtc__ZN3ccc8CC6x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y14  : ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y143pqrEv
  ~CC6x5y14(); // tgen
  CC6x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y143pqrEv,_ZThn4_N3ccc8CC6x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x5y143pqrEv,_ZThn4_N3ccc8CC6x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y14E[];
Class_Descriptor cd__ZN3ccc8CC6x5y14E = {  "_ZN3ccc8CC6x5y14E", // class name
  bases__ZN3ccc8CC6x5y14E, 2,
  &(vtc__ZN3ccc8CC6x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x5y15  : ::ccc::AA6 , ::ccc::BB5 {
  ~CC6x5y15(); // tgen
  CC6x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y15E[];
Class_Descriptor cd__ZN3ccc8CC6x5y15E = {  "_ZN3ccc8CC6x5y15E", // class name
  bases__ZN3ccc8CC6x5y15E, 2,
  &(vtc__ZN3ccc8CC6x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y0  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y03pqrEv
  ~CC6x6y0(); // tgen
  CC6x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y0E[];
extern void _ZN3ccc7CC6x6y03abcEv();
extern void _ZN3ccc7CC6x6y03efgEv();
extern void _ZN3ccc7CC6x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y03abcEv,_ZThn4_N3ccc7CC6x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y03efgEv,_ZThn4_N3ccc7CC6x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y03abcEv,_ZThn4_N3ccc7CC6x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y03efgEv,_ZThn4_N3ccc7CC6x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y0E[];
Class_Descriptor cd__ZN3ccc7CC6x6y0E = {  "_ZN3ccc7CC6x6y0E", // class name
  bases__ZN3ccc7CC6x6y0E, 2,
  &(vtc__ZN3ccc7CC6x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y1  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x6y13efgEv
  ~CC6x6y1(); // tgen
  CC6x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y1E[];
extern void _ZN3ccc7CC6x6y13abcEv();
extern void _ZN3ccc7CC6x6y13efgEv();
extern void _ZN3ccc7CC6x6y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y13abcEv,_ZThn4_N3ccc7CC6x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y13efgEv,_ZThn4_N3ccc7CC6x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y13abcEv,_ZThn4_N3ccc7CC6x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y13efgEv,_ZThn4_N3ccc7CC6x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y1E[];
Class_Descriptor cd__ZN3ccc7CC6x6y1E = {  "_ZN3ccc7CC6x6y1E", // class name
  bases__ZN3ccc7CC6x6y1E, 2,
  &(vtc__ZN3ccc7CC6x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y2  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y23pqrEv
  ~CC6x6y2(); // tgen
  CC6x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y2E[];
extern void _ZN3ccc7CC6x6y23abcEv();
extern void _ZN3ccc7CC6x6y23efgEv();
extern void _ZN3ccc7CC6x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y23abcEv,_ZThn4_N3ccc7CC6x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y23efgEv,_ZThn4_N3ccc7CC6x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y23abcEv,_ZThn4_N3ccc7CC6x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y23efgEv,_ZThn4_N3ccc7CC6x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y2E[];
Class_Descriptor cd__ZN3ccc7CC6x6y2E = {  "_ZN3ccc7CC6x6y2E", // class name
  bases__ZN3ccc7CC6x6y2E, 2,
  &(vtc__ZN3ccc7CC6x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y3  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x6y33abcEv
  ~CC6x6y3(); // tgen
  CC6x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y3E[];
extern void _ZN3ccc7CC6x6y33abcEv();
extern void _ZN3ccc7CC6x6y33efgEv();
extern void _ZN3ccc7CC6x6y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y33abcEv,_ZThn4_N3ccc7CC6x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y33efgEv,_ZThn4_N3ccc7CC6x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y33abcEv,_ZThn4_N3ccc7CC6x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y33efgEv,_ZThn4_N3ccc7CC6x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y3E[];
Class_Descriptor cd__ZN3ccc7CC6x6y3E = {  "_ZN3ccc7CC6x6y3E", // class name
  bases__ZN3ccc7CC6x6y3E, 2,
  &(vtc__ZN3ccc7CC6x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y4  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC6x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y43efgEv
  ~CC6x6y4(); // tgen
  CC6x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y4E[];
extern void _ZN3ccc7CC6x6y43abcEv();
extern void _ZN3ccc7CC6x6y43efgEv();
extern void _ZN3ccc7CC6x6y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y43abcEv,_ZThn4_N3ccc7CC6x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y43efgEv,_ZThn4_N3ccc7CC6x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y43abcEv,_ZThn4_N3ccc7CC6x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y43efgEv,_ZThn4_N3ccc7CC6x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y4E[];
Class_Descriptor cd__ZN3ccc7CC6x6y4E = {  "_ZN3ccc7CC6x6y4E", // class name
  bases__ZN3ccc7CC6x6y4E, 2,
  &(vtc__ZN3ccc7CC6x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y5  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC6x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y53abcEv
  ~CC6x6y5(); // tgen
  CC6x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y5E[];
extern void _ZN3ccc7CC6x6y53abcEv();
extern void _ZN3ccc7CC6x6y53efgEv();
extern void _ZN3ccc7CC6x6y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y53abcEv,_ZThn4_N3ccc7CC6x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y53efgEv,_ZThn4_N3ccc7CC6x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y53abcEv,_ZThn4_N3ccc7CC6x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y53efgEv,_ZThn4_N3ccc7CC6x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y5E[];
Class_Descriptor cd__ZN3ccc7CC6x6y5E = {  "_ZN3ccc7CC6x6y5E", // class name
  bases__ZN3ccc7CC6x6y5E, 2,
  &(vtc__ZN3ccc7CC6x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y6  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y63efgEv
  ~CC6x6y6(); // tgen
  CC6x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y6E[];
extern void _ZN3ccc7CC6x6y63abcEv();
extern void _ZN3ccc7CC6x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y63abcEv,_ZThn4_N3ccc7CC6x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y63efgEv,_ZThn4_N3ccc7CC6x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y63abcEv,_ZThn4_N3ccc7CC6x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y63efgEv,_ZThn4_N3ccc7CC6x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y6E[];
Class_Descriptor cd__ZN3ccc7CC6x6y6E = {  "_ZN3ccc7CC6x6y6E", // class name
  bases__ZN3ccc7CC6x6y6E, 2,
  &(vtc__ZN3ccc7CC6x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y7  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y73pqrEv
  ~CC6x6y7(); // tgen
  CC6x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y7E[];
extern void _ZN3ccc7CC6x6y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y73abcEv,_ZThn4_N3ccc7CC6x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y73abcEv,_ZThn4_N3ccc7CC6x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y7E[];
Class_Descriptor cd__ZN3ccc7CC6x6y7E = {  "_ZN3ccc7CC6x6y7E", // class name
  bases__ZN3ccc7CC6x6y7E, 2,
  &(vtc__ZN3ccc7CC6x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y8  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y83abcEv
  ~CC6x6y8(); // tgen
  CC6x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y8E[];
extern void _ZN3ccc7CC6x6y83abcEv();
extern void _ZN3ccc7CC6x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y83abcEv,_ZThn4_N3ccc7CC6x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y83efgEv,_ZThn4_N3ccc7CC6x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y83abcEv,_ZThn4_N3ccc7CC6x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y83efgEv,_ZThn4_N3ccc7CC6x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y8E[];
Class_Descriptor cd__ZN3ccc7CC6x6y8E = {  "_ZN3ccc7CC6x6y8E", // class name
  bases__ZN3ccc7CC6x6y8E, 2,
  &(vtc__ZN3ccc7CC6x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y9  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y93pqrEv
  ~CC6x6y9(); // tgen
  CC6x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x6y93efgEv();
extern void _ZN3ccc7CC6x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y93efgEv,_ZThn4_N3ccc7CC6x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x6y93efgEv,_ZThn4_N3ccc7CC6x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y9E[];
Class_Descriptor cd__ZN3ccc7CC6x6y9E = {  "_ZN3ccc7CC6x6y9E", // class name
  bases__ZN3ccc7CC6x6y9E, 2,
  &(vtc__ZN3ccc7CC6x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y10  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x6y103abcEv
  ~CC6x6y10(); // tgen
  CC6x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y10E[];
extern void _ZN3ccc8CC6x6y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y103abcEv,_ZThn4_N3ccc8CC6x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x6y103abcEv,_ZThn4_N3ccc8CC6x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y10E[];
Class_Descriptor cd__ZN3ccc8CC6x6y10E = {  "_ZN3ccc8CC6x6y10E", // class name
  bases__ZN3ccc8CC6x6y10E, 2,
  &(vtc__ZN3ccc8CC6x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y11  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x6y113efgEv
  ~CC6x6y11(); // tgen
  CC6x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x6y113efgEv();
extern void _ZN3ccc8CC6x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y113efgEv,_ZThn4_N3ccc8CC6x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x6y113efgEv,_ZThn4_N3ccc8CC6x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y11E[];
Class_Descriptor cd__ZN3ccc8CC6x6y11E = {  "_ZN3ccc8CC6x6y11E", // class name
  bases__ZN3ccc8CC6x6y11E, 2,
  &(vtc__ZN3ccc8CC6x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y12  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC6x6y123abcEv
  ~CC6x6y12(); // tgen
  CC6x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y12E[];
extern void _ZN3ccc8CC6x6y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y123abcEv,_ZThn4_N3ccc8CC6x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x6y123abcEv,_ZThn4_N3ccc8CC6x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y12E[];
Class_Descriptor cd__ZN3ccc8CC6x6y12E = {  "_ZN3ccc8CC6x6y12E", // class name
  bases__ZN3ccc8CC6x6y12E, 2,
  &(vtc__ZN3ccc8CC6x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y13  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC6x6y133efgEv
  ~CC6x6y13(); // tgen
  CC6x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y133efgEv,_ZThn4_N3ccc8CC6x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x6y133efgEv,_ZThn4_N3ccc8CC6x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y13E[];
Class_Descriptor cd__ZN3ccc8CC6x6y13E = {  "_ZN3ccc8CC6x6y13E", // class name
  bases__ZN3ccc8CC6x6y13E, 2,
  &(vtc__ZN3ccc8CC6x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y14  : ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y143pqrEv
  ~CC6x6y14(); // tgen
  CC6x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y14E[];
Class_Descriptor cd__ZN3ccc8CC6x6y14E = {  "_ZN3ccc8CC6x6y14E", // class name
  bases__ZN3ccc8CC6x6y14E, 2,
  &(vtc__ZN3ccc8CC6x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x6y15  : ::ccc::AA6 , ::ccc::BB6 {
  ~CC6x6y15(); // tgen
  CC6x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y15E[];
Class_Descriptor cd__ZN3ccc8CC6x6y15E = {  "_ZN3ccc8CC6x6y15E", // class name
  bases__ZN3ccc8CC6x6y15E, 2,
  &(vtc__ZN3ccc8CC6x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y0  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y03pqrEv
  ~CC6x7y0(); // tgen
  CC6x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y0E[];
extern void _ZN3ccc7CC6x7y03abcEv();
extern void _ZN3ccc7CC6x7y03efgEv();
extern void _ZN3ccc7CC6x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y03abcEv,_ZThn4_N3ccc7CC6x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y03pqrEv,_ZThn4_N3ccc7CC6x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y03abcEv,_ZThn4_N3ccc7CC6x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y03pqrEv,_ZThn4_N3ccc7CC6x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y0E[];
Class_Descriptor cd__ZN3ccc7CC6x7y0E = {  "_ZN3ccc7CC6x7y0E", // class name
  bases__ZN3ccc7CC6x7y0E, 2,
  &(vtc__ZN3ccc7CC6x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y1  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x7y13efgEv
  ~CC6x7y1(); // tgen
  CC6x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y1E[];
extern void _ZN3ccc7CC6x7y13abcEv();
extern void _ZN3ccc7CC6x7y13efgEv();
extern void _ZN3ccc7CC6x7y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y13abcEv,_ZThn4_N3ccc7CC6x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y13pqrEv,_ZThn4_N3ccc7CC6x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y13abcEv,_ZThn4_N3ccc7CC6x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y13pqrEv,_ZThn4_N3ccc7CC6x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y1E[];
Class_Descriptor cd__ZN3ccc7CC6x7y1E = {  "_ZN3ccc7CC6x7y1E", // class name
  bases__ZN3ccc7CC6x7y1E, 2,
  &(vtc__ZN3ccc7CC6x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y2  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y23pqrEv
  ~CC6x7y2(); // tgen
  CC6x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y2E[];
extern void _ZN3ccc7CC6x7y23abcEv();
extern void _ZN3ccc7CC6x7y23efgEv();
extern void _ZN3ccc7CC6x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y23abcEv,_ZThn4_N3ccc7CC6x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y23pqrEv,_ZThn4_N3ccc7CC6x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y23abcEv,_ZThn4_N3ccc7CC6x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y23pqrEv,_ZThn4_N3ccc7CC6x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y2E[];
Class_Descriptor cd__ZN3ccc7CC6x7y2E = {  "_ZN3ccc7CC6x7y2E", // class name
  bases__ZN3ccc7CC6x7y2E, 2,
  &(vtc__ZN3ccc7CC6x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y3  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x7y33abcEv
  ~CC6x7y3(); // tgen
  CC6x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y3E[];
extern void _ZN3ccc7CC6x7y33abcEv();
extern void _ZN3ccc7CC6x7y33efgEv();
extern void _ZN3ccc7CC6x7y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y33abcEv,_ZThn4_N3ccc7CC6x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y33pqrEv,_ZThn4_N3ccc7CC6x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y33abcEv,_ZThn4_N3ccc7CC6x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y33pqrEv,_ZThn4_N3ccc7CC6x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y3E[];
Class_Descriptor cd__ZN3ccc7CC6x7y3E = {  "_ZN3ccc7CC6x7y3E", // class name
  bases__ZN3ccc7CC6x7y3E, 2,
  &(vtc__ZN3ccc7CC6x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y4  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC6x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y43efgEv
  ~CC6x7y4(); // tgen
  CC6x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y4E[];
extern void _ZN3ccc7CC6x7y43abcEv();
extern void _ZN3ccc7CC6x7y43efgEv();
extern void _ZN3ccc7CC6x7y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y43abcEv,_ZThn4_N3ccc7CC6x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y43pqrEv,_ZThn4_N3ccc7CC6x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y43abcEv,_ZThn4_N3ccc7CC6x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y43pqrEv,_ZThn4_N3ccc7CC6x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y4E[];
Class_Descriptor cd__ZN3ccc7CC6x7y4E = {  "_ZN3ccc7CC6x7y4E", // class name
  bases__ZN3ccc7CC6x7y4E, 2,
  &(vtc__ZN3ccc7CC6x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y5  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC6x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y53abcEv
  ~CC6x7y5(); // tgen
  CC6x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y5E[];
extern void _ZN3ccc7CC6x7y53abcEv();
extern void _ZN3ccc7CC6x7y53efgEv();
extern void _ZN3ccc7CC6x7y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y53abcEv,_ZThn4_N3ccc7CC6x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y53pqrEv,_ZThn4_N3ccc7CC6x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y53abcEv,_ZThn4_N3ccc7CC6x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y53pqrEv,_ZThn4_N3ccc7CC6x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y5E[];
Class_Descriptor cd__ZN3ccc7CC6x7y5E = {  "_ZN3ccc7CC6x7y5E", // class name
  bases__ZN3ccc7CC6x7y5E, 2,
  &(vtc__ZN3ccc7CC6x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y6  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y63efgEv
  ~CC6x7y6(); // tgen
  CC6x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y6E[];
extern void _ZN3ccc7CC6x7y63abcEv();
extern void _ZN3ccc7CC6x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y63abcEv,_ZThn4_N3ccc7CC6x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y63abcEv,_ZThn4_N3ccc7CC6x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y6E[];
Class_Descriptor cd__ZN3ccc7CC6x7y6E = {  "_ZN3ccc7CC6x7y6E", // class name
  bases__ZN3ccc7CC6x7y6E, 2,
  &(vtc__ZN3ccc7CC6x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y7  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y73pqrEv
  ~CC6x7y7(); // tgen
  CC6x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y7E[];
extern void _ZN3ccc7CC6x7y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y73abcEv,_ZThn4_N3ccc7CC6x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y73pqrEv,_ZThn4_N3ccc7CC6x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y73abcEv,_ZThn4_N3ccc7CC6x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y73pqrEv,_ZThn4_N3ccc7CC6x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y7E[];
Class_Descriptor cd__ZN3ccc7CC6x7y7E = {  "_ZN3ccc7CC6x7y7E", // class name
  bases__ZN3ccc7CC6x7y7E, 2,
  &(vtc__ZN3ccc7CC6x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y8  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y83abcEv
  ~CC6x7y8(); // tgen
  CC6x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y8E[];
extern void _ZN3ccc7CC6x7y83abcEv();
extern void _ZN3ccc7CC6x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y83abcEv,_ZThn4_N3ccc7CC6x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y83abcEv,_ZThn4_N3ccc7CC6x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y8E[];
Class_Descriptor cd__ZN3ccc7CC6x7y8E = {  "_ZN3ccc7CC6x7y8E", // class name
  bases__ZN3ccc7CC6x7y8E, 2,
  &(vtc__ZN3ccc7CC6x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y9  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y93pqrEv
  ~CC6x7y9(); // tgen
  CC6x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x7y93efgEv();
extern void _ZN3ccc7CC6x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y93pqrEv,_ZThn4_N3ccc7CC6x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x7y93pqrEv,_ZThn4_N3ccc7CC6x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y9E[];
Class_Descriptor cd__ZN3ccc7CC6x7y9E = {  "_ZN3ccc7CC6x7y9E", // class name
  bases__ZN3ccc7CC6x7y9E, 2,
  &(vtc__ZN3ccc7CC6x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y10  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x7y103abcEv
  ~CC6x7y10(); // tgen
  CC6x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y10E[];
extern void _ZN3ccc8CC6x7y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y103abcEv,_ZThn4_N3ccc8CC6x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y103pqrEv,_ZThn4_N3ccc8CC6x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x7y103abcEv,_ZThn4_N3ccc8CC6x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x7y103pqrEv,_ZThn4_N3ccc8CC6x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y10E[];
Class_Descriptor cd__ZN3ccc8CC6x7y10E = {  "_ZN3ccc8CC6x7y10E", // class name
  bases__ZN3ccc8CC6x7y10E, 2,
  &(vtc__ZN3ccc8CC6x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y11  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x7y113efgEv
  ~CC6x7y11(); // tgen
  CC6x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x7y113efgEv();
extern void _ZN3ccc8CC6x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y113pqrEv,_ZThn4_N3ccc8CC6x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x7y113pqrEv,_ZThn4_N3ccc8CC6x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y11E[];
Class_Descriptor cd__ZN3ccc8CC6x7y11E = {  "_ZN3ccc8CC6x7y11E", // class name
  bases__ZN3ccc8CC6x7y11E, 2,
  &(vtc__ZN3ccc8CC6x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y12  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC6x7y123abcEv
  ~CC6x7y12(); // tgen
  CC6x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y12E[];
extern void _ZN3ccc8CC6x7y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y123abcEv,_ZThn4_N3ccc8CC6x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x7y123abcEv,_ZThn4_N3ccc8CC6x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y12E[];
Class_Descriptor cd__ZN3ccc8CC6x7y12E = {  "_ZN3ccc8CC6x7y12E", // class name
  bases__ZN3ccc8CC6x7y12E, 2,
  &(vtc__ZN3ccc8CC6x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y13  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC6x7y133efgEv
  ~CC6x7y13(); // tgen
  CC6x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y13E[];
Class_Descriptor cd__ZN3ccc8CC6x7y13E = {  "_ZN3ccc8CC6x7y13E", // class name
  bases__ZN3ccc8CC6x7y13E, 2,
  &(vtc__ZN3ccc8CC6x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y14  : ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y143pqrEv
  ~CC6x7y14(); // tgen
  CC6x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y143pqrEv,_ZThn4_N3ccc8CC6x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x7y143pqrEv,_ZThn4_N3ccc8CC6x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y14E[];
Class_Descriptor cd__ZN3ccc8CC6x7y14E = {  "_ZN3ccc8CC6x7y14E", // class name
  bases__ZN3ccc8CC6x7y14E, 2,
  &(vtc__ZN3ccc8CC6x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x7y15  : ::ccc::AA6 , ::ccc::BB7 {
  ~CC6x7y15(); // tgen
  CC6x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y15E[];
Class_Descriptor cd__ZN3ccc8CC6x7y15E = {  "_ZN3ccc8CC6x7y15E", // class name
  bases__ZN3ccc8CC6x7y15E, 2,
  &(vtc__ZN3ccc8CC6x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y0  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y03pqrEv
  ~CC6x8y0(); // tgen
  CC6x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y0E[];
extern void _ZN3ccc7CC6x8y03abcEv();
extern void _ZN3ccc7CC6x8y03efgEv();
extern void _ZN3ccc7CC6x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y03efgEv,_ZThn4_N3ccc7CC6x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y03abcEv,_ZThn4_N3ccc7CC6x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y03efgEv,_ZThn4_N3ccc7CC6x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y03abcEv,_ZThn4_N3ccc7CC6x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y0E[];
Class_Descriptor cd__ZN3ccc7CC6x8y0E = {  "_ZN3ccc7CC6x8y0E", // class name
  bases__ZN3ccc7CC6x8y0E, 2,
  &(vtc__ZN3ccc7CC6x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y1  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x8y13efgEv
  ~CC6x8y1(); // tgen
  CC6x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y1E[];
extern void _ZN3ccc7CC6x8y13abcEv();
extern void _ZN3ccc7CC6x8y13efgEv();
extern void _ZN3ccc7CC6x8y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y13efgEv,_ZThn4_N3ccc7CC6x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y13abcEv,_ZThn4_N3ccc7CC6x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y13efgEv,_ZThn4_N3ccc7CC6x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y13abcEv,_ZThn4_N3ccc7CC6x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y1E[];
Class_Descriptor cd__ZN3ccc7CC6x8y1E = {  "_ZN3ccc7CC6x8y1E", // class name
  bases__ZN3ccc7CC6x8y1E, 2,
  &(vtc__ZN3ccc7CC6x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y2  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y23pqrEv
  ~CC6x8y2(); // tgen
  CC6x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y2E[];
extern void _ZN3ccc7CC6x8y23abcEv();
extern void _ZN3ccc7CC6x8y23efgEv();
extern void _ZN3ccc7CC6x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y23efgEv,_ZThn4_N3ccc7CC6x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y23abcEv,_ZThn4_N3ccc7CC6x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y23efgEv,_ZThn4_N3ccc7CC6x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y23abcEv,_ZThn4_N3ccc7CC6x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y2E[];
Class_Descriptor cd__ZN3ccc7CC6x8y2E = {  "_ZN3ccc7CC6x8y2E", // class name
  bases__ZN3ccc7CC6x8y2E, 2,
  &(vtc__ZN3ccc7CC6x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y3  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x8y33abcEv
  ~CC6x8y3(); // tgen
  CC6x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y3E[];
extern void _ZN3ccc7CC6x8y33abcEv();
extern void _ZN3ccc7CC6x8y33efgEv();
extern void _ZN3ccc7CC6x8y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y33efgEv,_ZThn4_N3ccc7CC6x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y33abcEv,_ZThn4_N3ccc7CC6x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y33efgEv,_ZThn4_N3ccc7CC6x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y33abcEv,_ZThn4_N3ccc7CC6x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y3E[];
Class_Descriptor cd__ZN3ccc7CC6x8y3E = {  "_ZN3ccc7CC6x8y3E", // class name
  bases__ZN3ccc7CC6x8y3E, 2,
  &(vtc__ZN3ccc7CC6x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y4  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC6x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y43efgEv
  ~CC6x8y4(); // tgen
  CC6x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y4E[];
extern void _ZN3ccc7CC6x8y43abcEv();
extern void _ZN3ccc7CC6x8y43efgEv();
extern void _ZN3ccc7CC6x8y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y43efgEv,_ZThn4_N3ccc7CC6x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y43abcEv,_ZThn4_N3ccc7CC6x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y43efgEv,_ZThn4_N3ccc7CC6x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y43abcEv,_ZThn4_N3ccc7CC6x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y4E[];
Class_Descriptor cd__ZN3ccc7CC6x8y4E = {  "_ZN3ccc7CC6x8y4E", // class name
  bases__ZN3ccc7CC6x8y4E, 2,
  &(vtc__ZN3ccc7CC6x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y5  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC6x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y53abcEv
  ~CC6x8y5(); // tgen
  CC6x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y5E[];
extern void _ZN3ccc7CC6x8y53abcEv();
extern void _ZN3ccc7CC6x8y53efgEv();
extern void _ZN3ccc7CC6x8y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y53efgEv,_ZThn4_N3ccc7CC6x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y53abcEv,_ZThn4_N3ccc7CC6x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y53efgEv,_ZThn4_N3ccc7CC6x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y53abcEv,_ZThn4_N3ccc7CC6x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y5E[];
Class_Descriptor cd__ZN3ccc7CC6x8y5E = {  "_ZN3ccc7CC6x8y5E", // class name
  bases__ZN3ccc7CC6x8y5E, 2,
  &(vtc__ZN3ccc7CC6x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y6  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y63efgEv
  ~CC6x8y6(); // tgen
  CC6x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y6E[];
extern void _ZN3ccc7CC6x8y63abcEv();
extern void _ZN3ccc7CC6x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y63efgEv,_ZThn4_N3ccc7CC6x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y63abcEv,_ZThn4_N3ccc7CC6x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y63efgEv,_ZThn4_N3ccc7CC6x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y63abcEv,_ZThn4_N3ccc7CC6x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y6E[];
Class_Descriptor cd__ZN3ccc7CC6x8y6E = {  "_ZN3ccc7CC6x8y6E", // class name
  bases__ZN3ccc7CC6x8y6E, 2,
  &(vtc__ZN3ccc7CC6x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y7  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y73pqrEv
  ~CC6x8y7(); // tgen
  CC6x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y7E[];
extern void _ZN3ccc7CC6x8y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y73abcEv,_ZThn4_N3ccc7CC6x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y73abcEv,_ZThn4_N3ccc7CC6x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y7E[];
Class_Descriptor cd__ZN3ccc7CC6x8y7E = {  "_ZN3ccc7CC6x8y7E", // class name
  bases__ZN3ccc7CC6x8y7E, 2,
  &(vtc__ZN3ccc7CC6x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y8  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y83abcEv
  ~CC6x8y8(); // tgen
  CC6x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y8E[];
extern void _ZN3ccc7CC6x8y83abcEv();
extern void _ZN3ccc7CC6x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y83efgEv,_ZThn4_N3ccc7CC6x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y83abcEv,_ZThn4_N3ccc7CC6x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y83efgEv,_ZThn4_N3ccc7CC6x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y83abcEv,_ZThn4_N3ccc7CC6x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y8E[];
Class_Descriptor cd__ZN3ccc7CC6x8y8E = {  "_ZN3ccc7CC6x8y8E", // class name
  bases__ZN3ccc7CC6x8y8E, 2,
  &(vtc__ZN3ccc7CC6x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y9  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y93pqrEv
  ~CC6x8y9(); // tgen
  CC6x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x8y93efgEv();
extern void _ZN3ccc7CC6x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y93efgEv,_ZThn4_N3ccc7CC6x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x8y93efgEv,_ZThn4_N3ccc7CC6x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y9E[];
Class_Descriptor cd__ZN3ccc7CC6x8y9E = {  "_ZN3ccc7CC6x8y9E", // class name
  bases__ZN3ccc7CC6x8y9E, 2,
  &(vtc__ZN3ccc7CC6x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y10  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x8y103abcEv
  ~CC6x8y10(); // tgen
  CC6x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y10E[];
extern void _ZN3ccc8CC6x8y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y103abcEv,_ZThn4_N3ccc8CC6x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x8y103abcEv,_ZThn4_N3ccc8CC6x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y10E[];
Class_Descriptor cd__ZN3ccc8CC6x8y10E = {  "_ZN3ccc8CC6x8y10E", // class name
  bases__ZN3ccc8CC6x8y10E, 2,
  &(vtc__ZN3ccc8CC6x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y11  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x8y113efgEv
  ~CC6x8y11(); // tgen
  CC6x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x8y113efgEv();
extern void _ZN3ccc8CC6x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y113efgEv,_ZThn4_N3ccc8CC6x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x8y113efgEv,_ZThn4_N3ccc8CC6x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y11E[];
Class_Descriptor cd__ZN3ccc8CC6x8y11E = {  "_ZN3ccc8CC6x8y11E", // class name
  bases__ZN3ccc8CC6x8y11E, 2,
  &(vtc__ZN3ccc8CC6x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y12  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC6x8y123abcEv
  ~CC6x8y12(); // tgen
  CC6x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y12E[];
extern void _ZN3ccc8CC6x8y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y123abcEv,_ZThn4_N3ccc8CC6x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x8y123abcEv,_ZThn4_N3ccc8CC6x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y12E[];
Class_Descriptor cd__ZN3ccc8CC6x8y12E = {  "_ZN3ccc8CC6x8y12E", // class name
  bases__ZN3ccc8CC6x8y12E, 2,
  &(vtc__ZN3ccc8CC6x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y13  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC6x8y133efgEv
  ~CC6x8y13(); // tgen
  CC6x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y133efgEv,_ZThn4_N3ccc8CC6x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x8y133efgEv,_ZThn4_N3ccc8CC6x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y13E[];
Class_Descriptor cd__ZN3ccc8CC6x8y13E = {  "_ZN3ccc8CC6x8y13E", // class name
  bases__ZN3ccc8CC6x8y13E, 2,
  &(vtc__ZN3ccc8CC6x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y14  : ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y143pqrEv
  ~CC6x8y14(); // tgen
  CC6x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y14E[];
Class_Descriptor cd__ZN3ccc8CC6x8y14E = {  "_ZN3ccc8CC6x8y14E", // class name
  bases__ZN3ccc8CC6x8y14E, 2,
  &(vtc__ZN3ccc8CC6x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x8y15  : ::ccc::AA6 , ::ccc::BB8 {
  ~CC6x8y15(); // tgen
  CC6x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y15E[];
Class_Descriptor cd__ZN3ccc8CC6x8y15E = {  "_ZN3ccc8CC6x8y15E", // class name
  bases__ZN3ccc8CC6x8y15E, 2,
  &(vtc__ZN3ccc8CC6x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y0  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y03pqrEv
  ~CC6x9y0(); // tgen
  CC6x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y0E[];
extern void _ZN3ccc7CC6x9y03abcEv();
extern void _ZN3ccc7CC6x9y03efgEv();
extern void _ZN3ccc7CC6x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y03efgEv,_ZThn4_N3ccc7CC6x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y03pqrEv,_ZThn4_N3ccc7CC6x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y03efgEv,_ZThn4_N3ccc7CC6x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y03pqrEv,_ZThn4_N3ccc7CC6x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y0E[];
Class_Descriptor cd__ZN3ccc7CC6x9y0E = {  "_ZN3ccc7CC6x9y0E", // class name
  bases__ZN3ccc7CC6x9y0E, 2,
  &(vtc__ZN3ccc7CC6x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y1  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x9y13efgEv
  ~CC6x9y1(); // tgen
  CC6x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y1E[];
extern void _ZN3ccc7CC6x9y13abcEv();
extern void _ZN3ccc7CC6x9y13efgEv();
extern void _ZN3ccc7CC6x9y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y13efgEv,_ZThn4_N3ccc7CC6x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y13pqrEv,_ZThn4_N3ccc7CC6x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y13efgEv,_ZThn4_N3ccc7CC6x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y13pqrEv,_ZThn4_N3ccc7CC6x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y1E[];
Class_Descriptor cd__ZN3ccc7CC6x9y1E = {  "_ZN3ccc7CC6x9y1E", // class name
  bases__ZN3ccc7CC6x9y1E, 2,
  &(vtc__ZN3ccc7CC6x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y2  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y23pqrEv
  ~CC6x9y2(); // tgen
  CC6x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y2E[];
extern void _ZN3ccc7CC6x9y23abcEv();
extern void _ZN3ccc7CC6x9y23efgEv();
extern void _ZN3ccc7CC6x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y23efgEv,_ZThn4_N3ccc7CC6x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y23pqrEv,_ZThn4_N3ccc7CC6x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y23efgEv,_ZThn4_N3ccc7CC6x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y23pqrEv,_ZThn4_N3ccc7CC6x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y2E[];
Class_Descriptor cd__ZN3ccc7CC6x9y2E = {  "_ZN3ccc7CC6x9y2E", // class name
  bases__ZN3ccc7CC6x9y2E, 2,
  &(vtc__ZN3ccc7CC6x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y3  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x9y33abcEv
  ~CC6x9y3(); // tgen
  CC6x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y3E[];
extern void _ZN3ccc7CC6x9y33abcEv();
extern void _ZN3ccc7CC6x9y33efgEv();
extern void _ZN3ccc7CC6x9y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y33efgEv,_ZThn4_N3ccc7CC6x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y33pqrEv,_ZThn4_N3ccc7CC6x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y33efgEv,_ZThn4_N3ccc7CC6x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y33pqrEv,_ZThn4_N3ccc7CC6x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y3E[];
Class_Descriptor cd__ZN3ccc7CC6x9y3E = {  "_ZN3ccc7CC6x9y3E", // class name
  bases__ZN3ccc7CC6x9y3E, 2,
  &(vtc__ZN3ccc7CC6x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y4  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC6x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y43efgEv
  ~CC6x9y4(); // tgen
  CC6x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y4E[];
extern void _ZN3ccc7CC6x9y43abcEv();
extern void _ZN3ccc7CC6x9y43efgEv();
extern void _ZN3ccc7CC6x9y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y43efgEv,_ZThn4_N3ccc7CC6x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y43pqrEv,_ZThn4_N3ccc7CC6x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y43efgEv,_ZThn4_N3ccc7CC6x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y43pqrEv,_ZThn4_N3ccc7CC6x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y4E[];
Class_Descriptor cd__ZN3ccc7CC6x9y4E = {  "_ZN3ccc7CC6x9y4E", // class name
  bases__ZN3ccc7CC6x9y4E, 2,
  &(vtc__ZN3ccc7CC6x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y5  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC6x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y53abcEv
  ~CC6x9y5(); // tgen
  CC6x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y5E[];
extern void _ZN3ccc7CC6x9y53abcEv();
extern void _ZN3ccc7CC6x9y53efgEv();
extern void _ZN3ccc7CC6x9y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y53efgEv,_ZThn4_N3ccc7CC6x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y53pqrEv,_ZThn4_N3ccc7CC6x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y53efgEv,_ZThn4_N3ccc7CC6x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y53pqrEv,_ZThn4_N3ccc7CC6x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y5E[];
Class_Descriptor cd__ZN3ccc7CC6x9y5E = {  "_ZN3ccc7CC6x9y5E", // class name
  bases__ZN3ccc7CC6x9y5E, 2,
  &(vtc__ZN3ccc7CC6x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y6  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y63efgEv
  ~CC6x9y6(); // tgen
  CC6x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y6E[];
extern void _ZN3ccc7CC6x9y63abcEv();
extern void _ZN3ccc7CC6x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y63efgEv,_ZThn4_N3ccc7CC6x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y63efgEv,_ZThn4_N3ccc7CC6x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y6E[];
Class_Descriptor cd__ZN3ccc7CC6x9y6E = {  "_ZN3ccc7CC6x9y6E", // class name
  bases__ZN3ccc7CC6x9y6E, 2,
  &(vtc__ZN3ccc7CC6x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y7  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y73pqrEv
  ~CC6x9y7(); // tgen
  CC6x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y7E[];
extern void _ZN3ccc7CC6x9y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7CC6x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y73pqrEv,_ZThn4_N3ccc7CC6x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y73pqrEv,_ZThn4_N3ccc7CC6x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y7E[];
Class_Descriptor cd__ZN3ccc7CC6x9y7E = {  "_ZN3ccc7CC6x9y7E", // class name
  bases__ZN3ccc7CC6x9y7E, 2,
  &(vtc__ZN3ccc7CC6x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y8  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y83abcEv
  ~CC6x9y8(); // tgen
  CC6x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y8E[];
extern void _ZN3ccc7CC6x9y83abcEv();
extern void _ZN3ccc7CC6x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y83efgEv,_ZThn4_N3ccc7CC6x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y83efgEv,_ZThn4_N3ccc7CC6x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y8E[];
Class_Descriptor cd__ZN3ccc7CC6x9y8E = {  "_ZN3ccc7CC6x9y8E", // class name
  bases__ZN3ccc7CC6x9y8E, 2,
  &(vtc__ZN3ccc7CC6x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y9  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y93pqrEv
  ~CC6x9y9(); // tgen
  CC6x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC6x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7CC6x9y93efgEv();
extern void _ZN3ccc7CC6x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y93efgEv,_ZThn4_N3ccc7CC6x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y93pqrEv,_ZThn4_N3ccc7CC6x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y93efgEv,_ZThn4_N3ccc7CC6x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC6x9y93pqrEv,_ZThn4_N3ccc7CC6x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y9E[];
Class_Descriptor cd__ZN3ccc7CC6x9y9E = {  "_ZN3ccc7CC6x9y9E", // class name
  bases__ZN3ccc7CC6x9y9E, 2,
  &(vtc__ZN3ccc7CC6x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y10  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x9y103abcEv
  ~CC6x9y10(); // tgen
  CC6x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y10E[];
extern void _ZN3ccc8CC6x9y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y103pqrEv,_ZThn4_N3ccc8CC6x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x9y103pqrEv,_ZThn4_N3ccc8CC6x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y10E[];
Class_Descriptor cd__ZN3ccc8CC6x9y10E = {  "_ZN3ccc8CC6x9y10E", // class name
  bases__ZN3ccc8CC6x9y10E, 2,
  &(vtc__ZN3ccc8CC6x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y11  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x9y113efgEv
  ~CC6x9y11(); // tgen
  CC6x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x9y113efgEv();
extern void _ZN3ccc8CC6x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y113efgEv,_ZThn4_N3ccc8CC6x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y113pqrEv,_ZThn4_N3ccc8CC6x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x9y113efgEv,_ZThn4_N3ccc8CC6x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x9y113pqrEv,_ZThn4_N3ccc8CC6x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y11E[];
Class_Descriptor cd__ZN3ccc8CC6x9y11E = {  "_ZN3ccc8CC6x9y11E", // class name
  bases__ZN3ccc8CC6x9y11E, 2,
  &(vtc__ZN3ccc8CC6x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y12  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC6x9y123abcEv
  ~CC6x9y12(); // tgen
  CC6x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y12E[];
extern void _ZN3ccc8CC6x9y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y12E[];
Class_Descriptor cd__ZN3ccc8CC6x9y12E = {  "_ZN3ccc8CC6x9y12E", // class name
  bases__ZN3ccc8CC6x9y12E, 2,
  &(vtc__ZN3ccc8CC6x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y13  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC6x9y133efgEv
  ~CC6x9y13(); // tgen
  CC6x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y133efgEv,_ZThn4_N3ccc8CC6x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x9y133efgEv,_ZThn4_N3ccc8CC6x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y13E[];
Class_Descriptor cd__ZN3ccc8CC6x9y13E = {  "_ZN3ccc8CC6x9y13E", // class name
  bases__ZN3ccc8CC6x9y13E, 2,
  &(vtc__ZN3ccc8CC6x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y14  : ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y143pqrEv
  ~CC6x9y14(); // tgen
  CC6x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y143pqrEv,_ZThn4_N3ccc8CC6x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x9y143pqrEv,_ZThn4_N3ccc8CC6x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y14E[];
Class_Descriptor cd__ZN3ccc8CC6x9y14E = {  "_ZN3ccc8CC6x9y14E", // class name
  bases__ZN3ccc8CC6x9y14E, 2,
  &(vtc__ZN3ccc8CC6x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x9y15  : ::ccc::AA6 , ::ccc::BB9 {
  ~CC6x9y15(); // tgen
  CC6x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y15E[];
Class_Descriptor cd__ZN3ccc8CC6x9y15E = {  "_ZN3ccc8CC6x9y15E", // class name
  bases__ZN3ccc8CC6x9y15E, 2,
  &(vtc__ZN3ccc8CC6x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y0  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y03pqrEv
  ~CC6x10y0(); // tgen
  CC6x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y0E[];
extern void _ZN3ccc8CC6x10y03abcEv();
extern void _ZN3ccc8CC6x10y03efgEv();
extern void _ZN3ccc8CC6x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y03pqrEv,_ZThn4_N3ccc8CC6x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y03abcEv,_ZThn4_N3ccc8CC6x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y03pqrEv,_ZThn4_N3ccc8CC6x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y03abcEv,_ZThn4_N3ccc8CC6x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y0E[];
Class_Descriptor cd__ZN3ccc8CC6x10y0E = {  "_ZN3ccc8CC6x10y0E", // class name
  bases__ZN3ccc8CC6x10y0E, 2,
  &(vtc__ZN3ccc8CC6x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y1  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x10y13efgEv
  ~CC6x10y1(); // tgen
  CC6x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y1E[];
extern void _ZN3ccc8CC6x10y13abcEv();
extern void _ZN3ccc8CC6x10y13efgEv();
extern void _ZN3ccc8CC6x10y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y13pqrEv,_ZThn4_N3ccc8CC6x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y13abcEv,_ZThn4_N3ccc8CC6x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y13pqrEv,_ZThn4_N3ccc8CC6x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y13abcEv,_ZThn4_N3ccc8CC6x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y1E[];
Class_Descriptor cd__ZN3ccc8CC6x10y1E = {  "_ZN3ccc8CC6x10y1E", // class name
  bases__ZN3ccc8CC6x10y1E, 2,
  &(vtc__ZN3ccc8CC6x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y2  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y23pqrEv
  ~CC6x10y2(); // tgen
  CC6x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y2E[];
extern void _ZN3ccc8CC6x10y23abcEv();
extern void _ZN3ccc8CC6x10y23efgEv();
extern void _ZN3ccc8CC6x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y23pqrEv,_ZThn4_N3ccc8CC6x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y23abcEv,_ZThn4_N3ccc8CC6x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y23pqrEv,_ZThn4_N3ccc8CC6x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y23abcEv,_ZThn4_N3ccc8CC6x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y2E[];
Class_Descriptor cd__ZN3ccc8CC6x10y2E = {  "_ZN3ccc8CC6x10y2E", // class name
  bases__ZN3ccc8CC6x10y2E, 2,
  &(vtc__ZN3ccc8CC6x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y3  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x10y33abcEv
  ~CC6x10y3(); // tgen
  CC6x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y3E[];
extern void _ZN3ccc8CC6x10y33abcEv();
extern void _ZN3ccc8CC6x10y33efgEv();
extern void _ZN3ccc8CC6x10y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y33pqrEv,_ZThn4_N3ccc8CC6x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y33abcEv,_ZThn4_N3ccc8CC6x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y33pqrEv,_ZThn4_N3ccc8CC6x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y33abcEv,_ZThn4_N3ccc8CC6x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y3E[];
Class_Descriptor cd__ZN3ccc8CC6x10y3E = {  "_ZN3ccc8CC6x10y3E", // class name
  bases__ZN3ccc8CC6x10y3E, 2,
  &(vtc__ZN3ccc8CC6x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y4  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC6x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y43efgEv
  ~CC6x10y4(); // tgen
  CC6x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y4E[];
extern void _ZN3ccc8CC6x10y43abcEv();
extern void _ZN3ccc8CC6x10y43efgEv();
extern void _ZN3ccc8CC6x10y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y43pqrEv,_ZThn4_N3ccc8CC6x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y43abcEv,_ZThn4_N3ccc8CC6x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y43pqrEv,_ZThn4_N3ccc8CC6x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y43abcEv,_ZThn4_N3ccc8CC6x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y4E[];
Class_Descriptor cd__ZN3ccc8CC6x10y4E = {  "_ZN3ccc8CC6x10y4E", // class name
  bases__ZN3ccc8CC6x10y4E, 2,
  &(vtc__ZN3ccc8CC6x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y5  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC6x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y53abcEv
  ~CC6x10y5(); // tgen
  CC6x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y5E[];
extern void _ZN3ccc8CC6x10y53abcEv();
extern void _ZN3ccc8CC6x10y53efgEv();
extern void _ZN3ccc8CC6x10y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y53pqrEv,_ZThn4_N3ccc8CC6x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y53abcEv,_ZThn4_N3ccc8CC6x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y53pqrEv,_ZThn4_N3ccc8CC6x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y53abcEv,_ZThn4_N3ccc8CC6x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y5E[];
Class_Descriptor cd__ZN3ccc8CC6x10y5E = {  "_ZN3ccc8CC6x10y5E", // class name
  bases__ZN3ccc8CC6x10y5E, 2,
  &(vtc__ZN3ccc8CC6x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y6  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y63efgEv
  ~CC6x10y6(); // tgen
  CC6x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y6E[];
extern void _ZN3ccc8CC6x10y63abcEv();
extern void _ZN3ccc8CC6x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y63abcEv,_ZThn4_N3ccc8CC6x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y63abcEv,_ZThn4_N3ccc8CC6x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y6E[];
Class_Descriptor cd__ZN3ccc8CC6x10y6E = {  "_ZN3ccc8CC6x10y6E", // class name
  bases__ZN3ccc8CC6x10y6E, 2,
  &(vtc__ZN3ccc8CC6x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y7  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y73pqrEv
  ~CC6x10y7(); // tgen
  CC6x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y7E[];
extern void _ZN3ccc8CC6x10y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y73pqrEv,_ZThn4_N3ccc8CC6x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y73abcEv,_ZThn4_N3ccc8CC6x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y73pqrEv,_ZThn4_N3ccc8CC6x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y73abcEv,_ZThn4_N3ccc8CC6x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y7E[];
Class_Descriptor cd__ZN3ccc8CC6x10y7E = {  "_ZN3ccc8CC6x10y7E", // class name
  bases__ZN3ccc8CC6x10y7E, 2,
  &(vtc__ZN3ccc8CC6x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y8  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y83abcEv
  ~CC6x10y8(); // tgen
  CC6x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y8E[];
extern void _ZN3ccc8CC6x10y83abcEv();
extern void _ZN3ccc8CC6x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y83abcEv,_ZThn4_N3ccc8CC6x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y83abcEv,_ZThn4_N3ccc8CC6x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y8E[];
Class_Descriptor cd__ZN3ccc8CC6x10y8E = {  "_ZN3ccc8CC6x10y8E", // class name
  bases__ZN3ccc8CC6x10y8E, 2,
  &(vtc__ZN3ccc8CC6x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y9  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y93pqrEv
  ~CC6x10y9(); // tgen
  CC6x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x10y93efgEv();
extern void _ZN3ccc8CC6x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y93pqrEv,_ZThn4_N3ccc8CC6x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x10y93pqrEv,_ZThn4_N3ccc8CC6x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y9E[];
Class_Descriptor cd__ZN3ccc8CC6x10y9E = {  "_ZN3ccc8CC6x10y9E", // class name
  bases__ZN3ccc8CC6x10y9E, 2,
  &(vtc__ZN3ccc8CC6x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y10  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x10y103abcEv
  ~CC6x10y10(); // tgen
  CC6x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y10E[];
extern void _ZN3ccc9CC6x10y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y103pqrEv,_ZThn4_N3ccc9CC6x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y103abcEv,_ZThn4_N3ccc9CC6x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x10y103pqrEv,_ZThn4_N3ccc9CC6x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x10y103abcEv,_ZThn4_N3ccc9CC6x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y10E[];
Class_Descriptor cd__ZN3ccc9CC6x10y10E = {  "_ZN3ccc9CC6x10y10E", // class name
  bases__ZN3ccc9CC6x10y10E, 2,
  &(vtc__ZN3ccc9CC6x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y11  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x10y113efgEv
  ~CC6x10y11(); // tgen
  CC6x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x10y113efgEv();
extern void _ZN3ccc9CC6x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y113pqrEv,_ZThn4_N3ccc9CC6x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x10y113pqrEv,_ZThn4_N3ccc9CC6x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y11E[];
Class_Descriptor cd__ZN3ccc9CC6x10y11E = {  "_ZN3ccc9CC6x10y11E", // class name
  bases__ZN3ccc9CC6x10y11E, 2,
  &(vtc__ZN3ccc9CC6x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y12  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC6x10y123abcEv
  ~CC6x10y12(); // tgen
  CC6x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y12E[];
extern void _ZN3ccc9CC6x10y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y123abcEv,_ZThn4_N3ccc9CC6x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x10y123abcEv,_ZThn4_N3ccc9CC6x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y12E[];
Class_Descriptor cd__ZN3ccc9CC6x10y12E = {  "_ZN3ccc9CC6x10y12E", // class name
  bases__ZN3ccc9CC6x10y12E, 2,
  &(vtc__ZN3ccc9CC6x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y13  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC6x10y133efgEv
  ~CC6x10y13(); // tgen
  CC6x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y13E[];
Class_Descriptor cd__ZN3ccc9CC6x10y13E = {  "_ZN3ccc9CC6x10y13E", // class name
  bases__ZN3ccc9CC6x10y13E, 2,
  &(vtc__ZN3ccc9CC6x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y14  : ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y143pqrEv
  ~CC6x10y14(); // tgen
  CC6x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y143pqrEv,_ZThn4_N3ccc9CC6x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x10y143pqrEv,_ZThn4_N3ccc9CC6x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y14E[];
Class_Descriptor cd__ZN3ccc9CC6x10y14E = {  "_ZN3ccc9CC6x10y14E", // class name
  bases__ZN3ccc9CC6x10y14E, 2,
  &(vtc__ZN3ccc9CC6x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x10y15  : ::ccc::AA6 , ::ccc::BB10 {
  ~CC6x10y15(); // tgen
  CC6x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y15E[];
Class_Descriptor cd__ZN3ccc9CC6x10y15E = {  "_ZN3ccc9CC6x10y15E", // class name
  bases__ZN3ccc9CC6x10y15E, 2,
  &(vtc__ZN3ccc9CC6x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y0  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y03pqrEv
  ~CC6x11y0(); // tgen
  CC6x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y0E[];
extern void _ZN3ccc8CC6x11y03abcEv();
extern void _ZN3ccc8CC6x11y03efgEv();
extern void _ZN3ccc8CC6x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y03pqrEv,_ZThn4_N3ccc8CC6x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y03efgEv,_ZThn4_N3ccc8CC6x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y03pqrEv,_ZThn4_N3ccc8CC6x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y03efgEv,_ZThn4_N3ccc8CC6x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y0E[];
Class_Descriptor cd__ZN3ccc8CC6x11y0E = {  "_ZN3ccc8CC6x11y0E", // class name
  bases__ZN3ccc8CC6x11y0E, 2,
  &(vtc__ZN3ccc8CC6x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y1  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x11y13efgEv
  ~CC6x11y1(); // tgen
  CC6x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y1E[];
extern void _ZN3ccc8CC6x11y13abcEv();
extern void _ZN3ccc8CC6x11y13efgEv();
extern void _ZN3ccc8CC6x11y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y13pqrEv,_ZThn4_N3ccc8CC6x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y13efgEv,_ZThn4_N3ccc8CC6x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y13pqrEv,_ZThn4_N3ccc8CC6x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y13efgEv,_ZThn4_N3ccc8CC6x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y1E[];
Class_Descriptor cd__ZN3ccc8CC6x11y1E = {  "_ZN3ccc8CC6x11y1E", // class name
  bases__ZN3ccc8CC6x11y1E, 2,
  &(vtc__ZN3ccc8CC6x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y2  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y23pqrEv
  ~CC6x11y2(); // tgen
  CC6x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y2E[];
extern void _ZN3ccc8CC6x11y23abcEv();
extern void _ZN3ccc8CC6x11y23efgEv();
extern void _ZN3ccc8CC6x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y23pqrEv,_ZThn4_N3ccc8CC6x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y23efgEv,_ZThn4_N3ccc8CC6x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y23pqrEv,_ZThn4_N3ccc8CC6x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y23efgEv,_ZThn4_N3ccc8CC6x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y2E[];
Class_Descriptor cd__ZN3ccc8CC6x11y2E = {  "_ZN3ccc8CC6x11y2E", // class name
  bases__ZN3ccc8CC6x11y2E, 2,
  &(vtc__ZN3ccc8CC6x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y3  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x11y33abcEv
  ~CC6x11y3(); // tgen
  CC6x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y3E[];
extern void _ZN3ccc8CC6x11y33abcEv();
extern void _ZN3ccc8CC6x11y33efgEv();
extern void _ZN3ccc8CC6x11y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y33pqrEv,_ZThn4_N3ccc8CC6x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y33efgEv,_ZThn4_N3ccc8CC6x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y33pqrEv,_ZThn4_N3ccc8CC6x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y33efgEv,_ZThn4_N3ccc8CC6x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y3E[];
Class_Descriptor cd__ZN3ccc8CC6x11y3E = {  "_ZN3ccc8CC6x11y3E", // class name
  bases__ZN3ccc8CC6x11y3E, 2,
  &(vtc__ZN3ccc8CC6x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y4  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC6x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y43efgEv
  ~CC6x11y4(); // tgen
  CC6x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y4E[];
extern void _ZN3ccc8CC6x11y43abcEv();
extern void _ZN3ccc8CC6x11y43efgEv();
extern void _ZN3ccc8CC6x11y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y43pqrEv,_ZThn4_N3ccc8CC6x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y43efgEv,_ZThn4_N3ccc8CC6x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y43pqrEv,_ZThn4_N3ccc8CC6x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y43efgEv,_ZThn4_N3ccc8CC6x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y4E[];
Class_Descriptor cd__ZN3ccc8CC6x11y4E = {  "_ZN3ccc8CC6x11y4E", // class name
  bases__ZN3ccc8CC6x11y4E, 2,
  &(vtc__ZN3ccc8CC6x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y5  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC6x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y53abcEv
  ~CC6x11y5(); // tgen
  CC6x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y5E[];
extern void _ZN3ccc8CC6x11y53abcEv();
extern void _ZN3ccc8CC6x11y53efgEv();
extern void _ZN3ccc8CC6x11y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y53pqrEv,_ZThn4_N3ccc8CC6x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y53efgEv,_ZThn4_N3ccc8CC6x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y53pqrEv,_ZThn4_N3ccc8CC6x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y53efgEv,_ZThn4_N3ccc8CC6x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y5E[];
Class_Descriptor cd__ZN3ccc8CC6x11y5E = {  "_ZN3ccc8CC6x11y5E", // class name
  bases__ZN3ccc8CC6x11y5E, 2,
  &(vtc__ZN3ccc8CC6x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y6  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y63efgEv
  ~CC6x11y6(); // tgen
  CC6x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y6E[];
extern void _ZN3ccc8CC6x11y63abcEv();
extern void _ZN3ccc8CC6x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y63efgEv,_ZThn4_N3ccc8CC6x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y63efgEv,_ZThn4_N3ccc8CC6x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y6E[];
Class_Descriptor cd__ZN3ccc8CC6x11y6E = {  "_ZN3ccc8CC6x11y6E", // class name
  bases__ZN3ccc8CC6x11y6E, 2,
  &(vtc__ZN3ccc8CC6x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y7  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y73pqrEv
  ~CC6x11y7(); // tgen
  CC6x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y7E[];
extern void _ZN3ccc8CC6x11y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y73pqrEv,_ZThn4_N3ccc8CC6x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y73pqrEv,_ZThn4_N3ccc8CC6x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y7E[];
Class_Descriptor cd__ZN3ccc8CC6x11y7E = {  "_ZN3ccc8CC6x11y7E", // class name
  bases__ZN3ccc8CC6x11y7E, 2,
  &(vtc__ZN3ccc8CC6x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y8  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y83abcEv
  ~CC6x11y8(); // tgen
  CC6x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y8E[];
extern void _ZN3ccc8CC6x11y83abcEv();
extern void _ZN3ccc8CC6x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y83efgEv,_ZThn4_N3ccc8CC6x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y83efgEv,_ZThn4_N3ccc8CC6x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y8E[];
Class_Descriptor cd__ZN3ccc8CC6x11y8E = {  "_ZN3ccc8CC6x11y8E", // class name
  bases__ZN3ccc8CC6x11y8E, 2,
  &(vtc__ZN3ccc8CC6x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y9  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y93pqrEv
  ~CC6x11y9(); // tgen
  CC6x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x11y93efgEv();
extern void _ZN3ccc8CC6x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y93pqrEv,_ZThn4_N3ccc8CC6x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y93efgEv,_ZThn4_N3ccc8CC6x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y93pqrEv,_ZThn4_N3ccc8CC6x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x11y93efgEv,_ZThn4_N3ccc8CC6x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y9E[];
Class_Descriptor cd__ZN3ccc8CC6x11y9E = {  "_ZN3ccc8CC6x11y9E", // class name
  bases__ZN3ccc8CC6x11y9E, 2,
  &(vtc__ZN3ccc8CC6x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y10  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x11y103abcEv
  ~CC6x11y10(); // tgen
  CC6x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y10E[];
extern void _ZN3ccc9CC6x11y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y103pqrEv,_ZThn4_N3ccc9CC6x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x11y103pqrEv,_ZThn4_N3ccc9CC6x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y10E[];
Class_Descriptor cd__ZN3ccc9CC6x11y10E = {  "_ZN3ccc9CC6x11y10E", // class name
  bases__ZN3ccc9CC6x11y10E, 2,
  &(vtc__ZN3ccc9CC6x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y11  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x11y113efgEv
  ~CC6x11y11(); // tgen
  CC6x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x11y113efgEv();
extern void _ZN3ccc9CC6x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y113pqrEv,_ZThn4_N3ccc9CC6x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y113efgEv,_ZThn4_N3ccc9CC6x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x11y113pqrEv,_ZThn4_N3ccc9CC6x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x11y113efgEv,_ZThn4_N3ccc9CC6x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y11E[];
Class_Descriptor cd__ZN3ccc9CC6x11y11E = {  "_ZN3ccc9CC6x11y11E", // class name
  bases__ZN3ccc9CC6x11y11E, 2,
  &(vtc__ZN3ccc9CC6x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y12  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC6x11y123abcEv
  ~CC6x11y12(); // tgen
  CC6x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y12E[];
extern void _ZN3ccc9CC6x11y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y12E[];
Class_Descriptor cd__ZN3ccc9CC6x11y12E = {  "_ZN3ccc9CC6x11y12E", // class name
  bases__ZN3ccc9CC6x11y12E, 2,
  &(vtc__ZN3ccc9CC6x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y13  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC6x11y133efgEv
  ~CC6x11y13(); // tgen
  CC6x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y133efgEv,_ZThn4_N3ccc9CC6x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x11y133efgEv,_ZThn4_N3ccc9CC6x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y13E[];
Class_Descriptor cd__ZN3ccc9CC6x11y13E = {  "_ZN3ccc9CC6x11y13E", // class name
  bases__ZN3ccc9CC6x11y13E, 2,
  &(vtc__ZN3ccc9CC6x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y14  : ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y143pqrEv
  ~CC6x11y14(); // tgen
  CC6x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y143pqrEv,_ZThn4_N3ccc9CC6x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x11y143pqrEv,_ZThn4_N3ccc9CC6x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y14E[];
Class_Descriptor cd__ZN3ccc9CC6x11y14E = {  "_ZN3ccc9CC6x11y14E", // class name
  bases__ZN3ccc9CC6x11y14E, 2,
  &(vtc__ZN3ccc9CC6x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x11y15  : ::ccc::AA6 , ::ccc::BB11 {
  ~CC6x11y15(); // tgen
  CC6x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y15E[];
Class_Descriptor cd__ZN3ccc9CC6x11y15E = {  "_ZN3ccc9CC6x11y15E", // class name
  bases__ZN3ccc9CC6x11y15E, 2,
  &(vtc__ZN3ccc9CC6x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y0  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y03pqrEv
  ~CC6x12y0(); // tgen
  CC6x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y0E[];
extern void _ZN3ccc8CC6x12y03abcEv();
extern void _ZN3ccc8CC6x12y03efgEv();
extern void _ZN3ccc8CC6x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y03abcEv,_ZThn4_N3ccc8CC6x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y03abcEv,_ZThn4_N3ccc8CC6x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y0E[];
Class_Descriptor cd__ZN3ccc8CC6x12y0E = {  "_ZN3ccc8CC6x12y0E", // class name
  bases__ZN3ccc8CC6x12y0E, 2,
  &(vtc__ZN3ccc8CC6x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y1  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x12y13efgEv
  ~CC6x12y1(); // tgen
  CC6x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y1E[];
extern void _ZN3ccc8CC6x12y13abcEv();
extern void _ZN3ccc8CC6x12y13efgEv();
extern void _ZN3ccc8CC6x12y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y13abcEv,_ZThn4_N3ccc8CC6x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y13abcEv,_ZThn4_N3ccc8CC6x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y1E[];
Class_Descriptor cd__ZN3ccc8CC6x12y1E = {  "_ZN3ccc8CC6x12y1E", // class name
  bases__ZN3ccc8CC6x12y1E, 2,
  &(vtc__ZN3ccc8CC6x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y2  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y23pqrEv
  ~CC6x12y2(); // tgen
  CC6x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y2E[];
extern void _ZN3ccc8CC6x12y23abcEv();
extern void _ZN3ccc8CC6x12y23efgEv();
extern void _ZN3ccc8CC6x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y23abcEv,_ZThn4_N3ccc8CC6x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y23abcEv,_ZThn4_N3ccc8CC6x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y2E[];
Class_Descriptor cd__ZN3ccc8CC6x12y2E = {  "_ZN3ccc8CC6x12y2E", // class name
  bases__ZN3ccc8CC6x12y2E, 2,
  &(vtc__ZN3ccc8CC6x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y3  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x12y33abcEv
  ~CC6x12y3(); // tgen
  CC6x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y3E[];
extern void _ZN3ccc8CC6x12y33abcEv();
extern void _ZN3ccc8CC6x12y33efgEv();
extern void _ZN3ccc8CC6x12y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y33abcEv,_ZThn4_N3ccc8CC6x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y33abcEv,_ZThn4_N3ccc8CC6x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y3E[];
Class_Descriptor cd__ZN3ccc8CC6x12y3E = {  "_ZN3ccc8CC6x12y3E", // class name
  bases__ZN3ccc8CC6x12y3E, 2,
  &(vtc__ZN3ccc8CC6x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y4  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC6x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y43efgEv
  ~CC6x12y4(); // tgen
  CC6x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y4E[];
extern void _ZN3ccc8CC6x12y43abcEv();
extern void _ZN3ccc8CC6x12y43efgEv();
extern void _ZN3ccc8CC6x12y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y43abcEv,_ZThn4_N3ccc8CC6x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y43abcEv,_ZThn4_N3ccc8CC6x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y4E[];
Class_Descriptor cd__ZN3ccc8CC6x12y4E = {  "_ZN3ccc8CC6x12y4E", // class name
  bases__ZN3ccc8CC6x12y4E, 2,
  &(vtc__ZN3ccc8CC6x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y5  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC6x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y53abcEv
  ~CC6x12y5(); // tgen
  CC6x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y5E[];
extern void _ZN3ccc8CC6x12y53abcEv();
extern void _ZN3ccc8CC6x12y53efgEv();
extern void _ZN3ccc8CC6x12y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y53abcEv,_ZThn4_N3ccc8CC6x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y53abcEv,_ZThn4_N3ccc8CC6x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y5E[];
Class_Descriptor cd__ZN3ccc8CC6x12y5E = {  "_ZN3ccc8CC6x12y5E", // class name
  bases__ZN3ccc8CC6x12y5E, 2,
  &(vtc__ZN3ccc8CC6x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y6  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y63efgEv
  ~CC6x12y6(); // tgen
  CC6x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y6E[];
extern void _ZN3ccc8CC6x12y63abcEv();
extern void _ZN3ccc8CC6x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y63abcEv,_ZThn4_N3ccc8CC6x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y63abcEv,_ZThn4_N3ccc8CC6x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y6E[];
Class_Descriptor cd__ZN3ccc8CC6x12y6E = {  "_ZN3ccc8CC6x12y6E", // class name
  bases__ZN3ccc8CC6x12y6E, 2,
  &(vtc__ZN3ccc8CC6x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y7  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y73pqrEv
  ~CC6x12y7(); // tgen
  CC6x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y7E[];
extern void _ZN3ccc8CC6x12y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y73abcEv,_ZThn4_N3ccc8CC6x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y73abcEv,_ZThn4_N3ccc8CC6x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y7E[];
Class_Descriptor cd__ZN3ccc8CC6x12y7E = {  "_ZN3ccc8CC6x12y7E", // class name
  bases__ZN3ccc8CC6x12y7E, 2,
  &(vtc__ZN3ccc8CC6x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y8  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y83abcEv
  ~CC6x12y8(); // tgen
  CC6x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y8E[];
extern void _ZN3ccc8CC6x12y83abcEv();
extern void _ZN3ccc8CC6x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y83abcEv,_ZThn4_N3ccc8CC6x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x12y83abcEv,_ZThn4_N3ccc8CC6x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y8E[];
Class_Descriptor cd__ZN3ccc8CC6x12y8E = {  "_ZN3ccc8CC6x12y8E", // class name
  bases__ZN3ccc8CC6x12y8E, 2,
  &(vtc__ZN3ccc8CC6x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y9  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y93pqrEv
  ~CC6x12y9(); // tgen
  CC6x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x12y93efgEv();
extern void _ZN3ccc8CC6x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y9E[];
Class_Descriptor cd__ZN3ccc8CC6x12y9E = {  "_ZN3ccc8CC6x12y9E", // class name
  bases__ZN3ccc8CC6x12y9E, 2,
  &(vtc__ZN3ccc8CC6x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y10  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x12y103abcEv
  ~CC6x12y10(); // tgen
  CC6x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y10E[];
extern void _ZN3ccc9CC6x12y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y103abcEv,_ZThn4_N3ccc9CC6x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x12y103abcEv,_ZThn4_N3ccc9CC6x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y10E[];
Class_Descriptor cd__ZN3ccc9CC6x12y10E = {  "_ZN3ccc9CC6x12y10E", // class name
  bases__ZN3ccc9CC6x12y10E, 2,
  &(vtc__ZN3ccc9CC6x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y11  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x12y113efgEv
  ~CC6x12y11(); // tgen
  CC6x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x12y113efgEv();
extern void _ZN3ccc9CC6x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y11E[];
Class_Descriptor cd__ZN3ccc9CC6x12y11E = {  "_ZN3ccc9CC6x12y11E", // class name
  bases__ZN3ccc9CC6x12y11E, 2,
  &(vtc__ZN3ccc9CC6x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y12  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC6x12y123abcEv
  ~CC6x12y12(); // tgen
  CC6x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y12E[];
extern void _ZN3ccc9CC6x12y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y123abcEv,_ZThn4_N3ccc9CC6x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x12y123abcEv,_ZThn4_N3ccc9CC6x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y12E[];
Class_Descriptor cd__ZN3ccc9CC6x12y12E = {  "_ZN3ccc9CC6x12y12E", // class name
  bases__ZN3ccc9CC6x12y12E, 2,
  &(vtc__ZN3ccc9CC6x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y13  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC6x12y133efgEv
  ~CC6x12y13(); // tgen
  CC6x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y13E[];
Class_Descriptor cd__ZN3ccc9CC6x12y13E = {  "_ZN3ccc9CC6x12y13E", // class name
  bases__ZN3ccc9CC6x12y13E, 2,
  &(vtc__ZN3ccc9CC6x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y14  : ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y143pqrEv
  ~CC6x12y14(); // tgen
  CC6x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y14E[];
Class_Descriptor cd__ZN3ccc9CC6x12y14E = {  "_ZN3ccc9CC6x12y14E", // class name
  bases__ZN3ccc9CC6x12y14E, 2,
  &(vtc__ZN3ccc9CC6x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x12y15  : ::ccc::AA6 , ::ccc::BB12 {
  ~CC6x12y15(); // tgen
  CC6x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y15E[];
Class_Descriptor cd__ZN3ccc9CC6x12y15E = {  "_ZN3ccc9CC6x12y15E", // class name
  bases__ZN3ccc9CC6x12y15E, 2,
  &(vtc__ZN3ccc9CC6x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y0  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y03pqrEv
  ~CC6x13y0(); // tgen
  CC6x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y0E[];
extern void _ZN3ccc8CC6x13y03abcEv();
extern void _ZN3ccc8CC6x13y03efgEv();
extern void _ZN3ccc8CC6x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y03efgEv,_ZThn4_N3ccc8CC6x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y03efgEv,_ZThn4_N3ccc8CC6x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y0E[];
Class_Descriptor cd__ZN3ccc8CC6x13y0E = {  "_ZN3ccc8CC6x13y0E", // class name
  bases__ZN3ccc8CC6x13y0E, 2,
  &(vtc__ZN3ccc8CC6x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y1  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x13y13efgEv
  ~CC6x13y1(); // tgen
  CC6x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y1E[];
extern void _ZN3ccc8CC6x13y13abcEv();
extern void _ZN3ccc8CC6x13y13efgEv();
extern void _ZN3ccc8CC6x13y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y13efgEv,_ZThn4_N3ccc8CC6x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y13efgEv,_ZThn4_N3ccc8CC6x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y1E[];
Class_Descriptor cd__ZN3ccc8CC6x13y1E = {  "_ZN3ccc8CC6x13y1E", // class name
  bases__ZN3ccc8CC6x13y1E, 2,
  &(vtc__ZN3ccc8CC6x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y2  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y23pqrEv
  ~CC6x13y2(); // tgen
  CC6x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y2E[];
extern void _ZN3ccc8CC6x13y23abcEv();
extern void _ZN3ccc8CC6x13y23efgEv();
extern void _ZN3ccc8CC6x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y23efgEv,_ZThn4_N3ccc8CC6x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y23efgEv,_ZThn4_N3ccc8CC6x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y2E[];
Class_Descriptor cd__ZN3ccc8CC6x13y2E = {  "_ZN3ccc8CC6x13y2E", // class name
  bases__ZN3ccc8CC6x13y2E, 2,
  &(vtc__ZN3ccc8CC6x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y3  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x13y33abcEv
  ~CC6x13y3(); // tgen
  CC6x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y3E[];
extern void _ZN3ccc8CC6x13y33abcEv();
extern void _ZN3ccc8CC6x13y33efgEv();
extern void _ZN3ccc8CC6x13y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y33efgEv,_ZThn4_N3ccc8CC6x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y33efgEv,_ZThn4_N3ccc8CC6x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y3E[];
Class_Descriptor cd__ZN3ccc8CC6x13y3E = {  "_ZN3ccc8CC6x13y3E", // class name
  bases__ZN3ccc8CC6x13y3E, 2,
  &(vtc__ZN3ccc8CC6x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y4  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC6x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y43efgEv
  ~CC6x13y4(); // tgen
  CC6x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y4E[];
extern void _ZN3ccc8CC6x13y43abcEv();
extern void _ZN3ccc8CC6x13y43efgEv();
extern void _ZN3ccc8CC6x13y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y43efgEv,_ZThn4_N3ccc8CC6x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y43efgEv,_ZThn4_N3ccc8CC6x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y4E[];
Class_Descriptor cd__ZN3ccc8CC6x13y4E = {  "_ZN3ccc8CC6x13y4E", // class name
  bases__ZN3ccc8CC6x13y4E, 2,
  &(vtc__ZN3ccc8CC6x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y5  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC6x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y53abcEv
  ~CC6x13y5(); // tgen
  CC6x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y5E[];
extern void _ZN3ccc8CC6x13y53abcEv();
extern void _ZN3ccc8CC6x13y53efgEv();
extern void _ZN3ccc8CC6x13y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y53efgEv,_ZThn4_N3ccc8CC6x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y53efgEv,_ZThn4_N3ccc8CC6x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y5E[];
Class_Descriptor cd__ZN3ccc8CC6x13y5E = {  "_ZN3ccc8CC6x13y5E", // class name
  bases__ZN3ccc8CC6x13y5E, 2,
  &(vtc__ZN3ccc8CC6x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y6  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y63efgEv
  ~CC6x13y6(); // tgen
  CC6x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y6E[];
extern void _ZN3ccc8CC6x13y63abcEv();
extern void _ZN3ccc8CC6x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y63efgEv,_ZThn4_N3ccc8CC6x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y63efgEv,_ZThn4_N3ccc8CC6x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y6E[];
Class_Descriptor cd__ZN3ccc8CC6x13y6E = {  "_ZN3ccc8CC6x13y6E", // class name
  bases__ZN3ccc8CC6x13y6E, 2,
  &(vtc__ZN3ccc8CC6x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y7  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y73pqrEv
  ~CC6x13y7(); // tgen
  CC6x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y7E[];
extern void _ZN3ccc8CC6x13y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y7E[];
Class_Descriptor cd__ZN3ccc8CC6x13y7E = {  "_ZN3ccc8CC6x13y7E", // class name
  bases__ZN3ccc8CC6x13y7E, 2,
  &(vtc__ZN3ccc8CC6x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y8  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y83abcEv
  ~CC6x13y8(); // tgen
  CC6x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y8E[];
extern void _ZN3ccc8CC6x13y83abcEv();
extern void _ZN3ccc8CC6x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y83efgEv,_ZThn4_N3ccc8CC6x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y83efgEv,_ZThn4_N3ccc8CC6x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y8E[];
Class_Descriptor cd__ZN3ccc8CC6x13y8E = {  "_ZN3ccc8CC6x13y8E", // class name
  bases__ZN3ccc8CC6x13y8E, 2,
  &(vtc__ZN3ccc8CC6x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y9  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y93pqrEv
  ~CC6x13y9(); // tgen
  CC6x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x13y93efgEv();
extern void _ZN3ccc8CC6x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y93efgEv,_ZThn4_N3ccc8CC6x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x13y93efgEv,_ZThn4_N3ccc8CC6x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y9E[];
Class_Descriptor cd__ZN3ccc8CC6x13y9E = {  "_ZN3ccc8CC6x13y9E", // class name
  bases__ZN3ccc8CC6x13y9E, 2,
  &(vtc__ZN3ccc8CC6x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y10  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x13y103abcEv
  ~CC6x13y10(); // tgen
  CC6x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y10E[];
extern void _ZN3ccc9CC6x13y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y10E[];
Class_Descriptor cd__ZN3ccc9CC6x13y10E = {  "_ZN3ccc9CC6x13y10E", // class name
  bases__ZN3ccc9CC6x13y10E, 2,
  &(vtc__ZN3ccc9CC6x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y11  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x13y113efgEv
  ~CC6x13y11(); // tgen
  CC6x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x13y113efgEv();
extern void _ZN3ccc9CC6x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y113efgEv,_ZThn4_N3ccc9CC6x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x13y113efgEv,_ZThn4_N3ccc9CC6x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y11E[];
Class_Descriptor cd__ZN3ccc9CC6x13y11E = {  "_ZN3ccc9CC6x13y11E", // class name
  bases__ZN3ccc9CC6x13y11E, 2,
  &(vtc__ZN3ccc9CC6x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y12  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC6x13y123abcEv
  ~CC6x13y12(); // tgen
  CC6x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y12E[];
extern void _ZN3ccc9CC6x13y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y12E[];
Class_Descriptor cd__ZN3ccc9CC6x13y12E = {  "_ZN3ccc9CC6x13y12E", // class name
  bases__ZN3ccc9CC6x13y12E, 2,
  &(vtc__ZN3ccc9CC6x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y13  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC6x13y133efgEv
  ~CC6x13y13(); // tgen
  CC6x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y133efgEv,_ZThn4_N3ccc9CC6x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x13y133efgEv,_ZThn4_N3ccc9CC6x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y13E[];
Class_Descriptor cd__ZN3ccc9CC6x13y13E = {  "_ZN3ccc9CC6x13y13E", // class name
  bases__ZN3ccc9CC6x13y13E, 2,
  &(vtc__ZN3ccc9CC6x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y14  : ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y143pqrEv
  ~CC6x13y14(); // tgen
  CC6x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y14E[];
Class_Descriptor cd__ZN3ccc9CC6x13y14E = {  "_ZN3ccc9CC6x13y14E", // class name
  bases__ZN3ccc9CC6x13y14E, 2,
  &(vtc__ZN3ccc9CC6x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x13y15  : ::ccc::AA6 , ::ccc::BB13 {
  ~CC6x13y15(); // tgen
  CC6x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y15E[];
Class_Descriptor cd__ZN3ccc9CC6x13y15E = {  "_ZN3ccc9CC6x13y15E", // class name
  bases__ZN3ccc9CC6x13y15E, 2,
  &(vtc__ZN3ccc9CC6x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y0  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y03pqrEv
  ~CC6x14y0(); // tgen
  CC6x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y0E[];
extern void _ZN3ccc8CC6x14y03abcEv();
extern void _ZN3ccc8CC6x14y03efgEv();
extern void _ZN3ccc8CC6x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y03pqrEv,_ZThn4_N3ccc8CC6x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y03pqrEv,_ZThn4_N3ccc8CC6x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y0E[];
Class_Descriptor cd__ZN3ccc8CC6x14y0E = {  "_ZN3ccc8CC6x14y0E", // class name
  bases__ZN3ccc8CC6x14y0E, 2,
  &(vtc__ZN3ccc8CC6x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y1  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x14y13efgEv
  ~CC6x14y1(); // tgen
  CC6x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y1E[];
extern void _ZN3ccc8CC6x14y13abcEv();
extern void _ZN3ccc8CC6x14y13efgEv();
extern void _ZN3ccc8CC6x14y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y13pqrEv,_ZThn4_N3ccc8CC6x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y13pqrEv,_ZThn4_N3ccc8CC6x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y1E[];
Class_Descriptor cd__ZN3ccc8CC6x14y1E = {  "_ZN3ccc8CC6x14y1E", // class name
  bases__ZN3ccc8CC6x14y1E, 2,
  &(vtc__ZN3ccc8CC6x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y2  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y23pqrEv
  ~CC6x14y2(); // tgen
  CC6x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y2E[];
extern void _ZN3ccc8CC6x14y23abcEv();
extern void _ZN3ccc8CC6x14y23efgEv();
extern void _ZN3ccc8CC6x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y23pqrEv,_ZThn4_N3ccc8CC6x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y23pqrEv,_ZThn4_N3ccc8CC6x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y2E[];
Class_Descriptor cd__ZN3ccc8CC6x14y2E = {  "_ZN3ccc8CC6x14y2E", // class name
  bases__ZN3ccc8CC6x14y2E, 2,
  &(vtc__ZN3ccc8CC6x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y3  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x14y33abcEv
  ~CC6x14y3(); // tgen
  CC6x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y3E[];
extern void _ZN3ccc8CC6x14y33abcEv();
extern void _ZN3ccc8CC6x14y33efgEv();
extern void _ZN3ccc8CC6x14y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y33pqrEv,_ZThn4_N3ccc8CC6x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y33pqrEv,_ZThn4_N3ccc8CC6x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y3E[];
Class_Descriptor cd__ZN3ccc8CC6x14y3E = {  "_ZN3ccc8CC6x14y3E", // class name
  bases__ZN3ccc8CC6x14y3E, 2,
  &(vtc__ZN3ccc8CC6x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y4  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC6x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y43efgEv
  ~CC6x14y4(); // tgen
  CC6x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y4E[];
extern void _ZN3ccc8CC6x14y43abcEv();
extern void _ZN3ccc8CC6x14y43efgEv();
extern void _ZN3ccc8CC6x14y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y43pqrEv,_ZThn4_N3ccc8CC6x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y43pqrEv,_ZThn4_N3ccc8CC6x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y4E[];
Class_Descriptor cd__ZN3ccc8CC6x14y4E = {  "_ZN3ccc8CC6x14y4E", // class name
  bases__ZN3ccc8CC6x14y4E, 2,
  &(vtc__ZN3ccc8CC6x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y5  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC6x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y53abcEv
  ~CC6x14y5(); // tgen
  CC6x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y5E[];
extern void _ZN3ccc8CC6x14y53abcEv();
extern void _ZN3ccc8CC6x14y53efgEv();
extern void _ZN3ccc8CC6x14y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y53pqrEv,_ZThn4_N3ccc8CC6x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y53pqrEv,_ZThn4_N3ccc8CC6x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y5E[];
Class_Descriptor cd__ZN3ccc8CC6x14y5E = {  "_ZN3ccc8CC6x14y5E", // class name
  bases__ZN3ccc8CC6x14y5E, 2,
  &(vtc__ZN3ccc8CC6x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y6  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y63efgEv
  ~CC6x14y6(); // tgen
  CC6x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y6E[];
extern void _ZN3ccc8CC6x14y63abcEv();
extern void _ZN3ccc8CC6x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y6E[];
Class_Descriptor cd__ZN3ccc8CC6x14y6E = {  "_ZN3ccc8CC6x14y6E", // class name
  bases__ZN3ccc8CC6x14y6E, 2,
  &(vtc__ZN3ccc8CC6x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y7  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y73pqrEv
  ~CC6x14y7(); // tgen
  CC6x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y7E[];
extern void _ZN3ccc8CC6x14y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y73pqrEv,_ZThn4_N3ccc8CC6x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y73pqrEv,_ZThn4_N3ccc8CC6x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y7E[];
Class_Descriptor cd__ZN3ccc8CC6x14y7E = {  "_ZN3ccc8CC6x14y7E", // class name
  bases__ZN3ccc8CC6x14y7E, 2,
  &(vtc__ZN3ccc8CC6x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y8  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y83abcEv
  ~CC6x14y8(); // tgen
  CC6x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y8E[];
extern void _ZN3ccc8CC6x14y83abcEv();
extern void _ZN3ccc8CC6x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y8E[];
Class_Descriptor cd__ZN3ccc8CC6x14y8E = {  "_ZN3ccc8CC6x14y8E", // class name
  bases__ZN3ccc8CC6x14y8E, 2,
  &(vtc__ZN3ccc8CC6x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y9  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y93pqrEv
  ~CC6x14y9(); // tgen
  CC6x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC6x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x14y93efgEv();
extern void _ZN3ccc8CC6x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y93pqrEv,_ZThn4_N3ccc8CC6x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC6x14y93pqrEv,_ZThn4_N3ccc8CC6x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y9E[];
Class_Descriptor cd__ZN3ccc8CC6x14y9E = {  "_ZN3ccc8CC6x14y9E", // class name
  bases__ZN3ccc8CC6x14y9E, 2,
  &(vtc__ZN3ccc8CC6x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y10  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x14y103abcEv
  ~CC6x14y10(); // tgen
  CC6x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y10E[];
extern void _ZN3ccc9CC6x14y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y103pqrEv,_ZThn4_N3ccc9CC6x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x14y103pqrEv,_ZThn4_N3ccc9CC6x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y10E[];
Class_Descriptor cd__ZN3ccc9CC6x14y10E = {  "_ZN3ccc9CC6x14y10E", // class name
  bases__ZN3ccc9CC6x14y10E, 2,
  &(vtc__ZN3ccc9CC6x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y11  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x14y113efgEv
  ~CC6x14y11(); // tgen
  CC6x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x14y113efgEv();
extern void _ZN3ccc9CC6x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y113pqrEv,_ZThn4_N3ccc9CC6x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x14y113pqrEv,_ZThn4_N3ccc9CC6x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y11E[];
Class_Descriptor cd__ZN3ccc9CC6x14y11E = {  "_ZN3ccc9CC6x14y11E", // class name
  bases__ZN3ccc9CC6x14y11E, 2,
  &(vtc__ZN3ccc9CC6x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y12  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC6x14y123abcEv
  ~CC6x14y12(); // tgen
  CC6x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y12E[];
extern void _ZN3ccc9CC6x14y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y12E[];
Class_Descriptor cd__ZN3ccc9CC6x14y12E = {  "_ZN3ccc9CC6x14y12E", // class name
  bases__ZN3ccc9CC6x14y12E, 2,
  &(vtc__ZN3ccc9CC6x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y13  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC6x14y133efgEv
  ~CC6x14y13(); // tgen
  CC6x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y13E[];
Class_Descriptor cd__ZN3ccc9CC6x14y13E = {  "_ZN3ccc9CC6x14y13E", // class name
  bases__ZN3ccc9CC6x14y13E, 2,
  &(vtc__ZN3ccc9CC6x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y14  : ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y143pqrEv
  ~CC6x14y14(); // tgen
  CC6x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y143pqrEv,_ZThn4_N3ccc9CC6x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC6x14y143pqrEv,_ZThn4_N3ccc9CC6x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y14E[];
Class_Descriptor cd__ZN3ccc9CC6x14y14E = {  "_ZN3ccc9CC6x14y14E", // class name
  bases__ZN3ccc9CC6x14y14E, 2,
  &(vtc__ZN3ccc9CC6x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x14y15  : ::ccc::AA6 , ::ccc::BB14 {
  ~CC6x14y15(); // tgen
  CC6x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC6x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y15E[];
Class_Descriptor cd__ZN3ccc9CC6x14y15E = {  "_ZN3ccc9CC6x14y15E", // class name
  bases__ZN3ccc9CC6x14y15E, 2,
  &(vtc__ZN3ccc9CC6x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y0  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y03pqrEv
  ~CC6x15y0(); // tgen
  CC6x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y0E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y0E[];
Class_Descriptor cd__ZN3ccc8CC6x15y0E = {  "_ZN3ccc8CC6x15y0E", // class name
  bases__ZN3ccc8CC6x15y0E, 2,
  &(vtc__ZN3ccc8CC6x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y1  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x15y13efgEv
  ~CC6x15y1(); // tgen
  CC6x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y1E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y1E[];
Class_Descriptor cd__ZN3ccc8CC6x15y1E = {  "_ZN3ccc8CC6x15y1E", // class name
  bases__ZN3ccc8CC6x15y1E, 2,
  &(vtc__ZN3ccc8CC6x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y2  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y23pqrEv
  ~CC6x15y2(); // tgen
  CC6x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y2E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y2E[];
Class_Descriptor cd__ZN3ccc8CC6x15y2E = {  "_ZN3ccc8CC6x15y2E", // class name
  bases__ZN3ccc8CC6x15y2E, 2,
  &(vtc__ZN3ccc8CC6x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y3  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x15y33abcEv
  ~CC6x15y3(); // tgen
  CC6x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y3E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y3E[];
Class_Descriptor cd__ZN3ccc8CC6x15y3E = {  "_ZN3ccc8CC6x15y3E", // class name
  bases__ZN3ccc8CC6x15y3E, 2,
  &(vtc__ZN3ccc8CC6x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y4  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC6x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y43efgEv
  ~CC6x15y4(); // tgen
  CC6x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y4E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y4E[];
Class_Descriptor cd__ZN3ccc8CC6x15y4E = {  "_ZN3ccc8CC6x15y4E", // class name
  bases__ZN3ccc8CC6x15y4E, 2,
  &(vtc__ZN3ccc8CC6x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y5  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC6x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y53abcEv
  ~CC6x15y5(); // tgen
  CC6x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y5E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y5E[];
Class_Descriptor cd__ZN3ccc8CC6x15y5E = {  "_ZN3ccc8CC6x15y5E", // class name
  bases__ZN3ccc8CC6x15y5E, 2,
  &(vtc__ZN3ccc8CC6x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y6  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y63efgEv
  ~CC6x15y6(); // tgen
  CC6x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y6E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y6E[];
Class_Descriptor cd__ZN3ccc8CC6x15y6E = {  "_ZN3ccc8CC6x15y6E", // class name
  bases__ZN3ccc8CC6x15y6E, 2,
  &(vtc__ZN3ccc8CC6x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y7  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y73pqrEv
  ~CC6x15y7(); // tgen
  CC6x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y7E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y7E[];
Class_Descriptor cd__ZN3ccc8CC6x15y7E = {  "_ZN3ccc8CC6x15y7E", // class name
  bases__ZN3ccc8CC6x15y7E, 2,
  &(vtc__ZN3ccc8CC6x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y8  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y83abcEv
  ~CC6x15y8(); // tgen
  CC6x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y8E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y8E[];
Class_Descriptor cd__ZN3ccc8CC6x15y8E = {  "_ZN3ccc8CC6x15y8E", // class name
  bases__ZN3ccc8CC6x15y8E, 2,
  &(vtc__ZN3ccc8CC6x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y9  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y93pqrEv
  ~CC6x15y9(); // tgen
  CC6x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y9E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y9E[];
Class_Descriptor cd__ZN3ccc8CC6x15y9E = {  "_ZN3ccc8CC6x15y9E", // class name
  bases__ZN3ccc8CC6x15y9E, 2,
  &(vtc__ZN3ccc8CC6x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y10  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x15y103abcEv
  ~CC6x15y10(); // tgen
  CC6x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y10E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y10E[];
Class_Descriptor cd__ZN3ccc9CC6x15y10E = {  "_ZN3ccc9CC6x15y10E", // class name
  bases__ZN3ccc9CC6x15y10E, 2,
  &(vtc__ZN3ccc9CC6x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y11  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x15y113efgEv
  ~CC6x15y11(); // tgen
  CC6x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y11E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y11E[];
Class_Descriptor cd__ZN3ccc9CC6x15y11E = {  "_ZN3ccc9CC6x15y11E", // class name
  bases__ZN3ccc9CC6x15y11E, 2,
  &(vtc__ZN3ccc9CC6x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y12  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC6x15y123abcEv
  ~CC6x15y12(); // tgen
  CC6x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y12E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y12E[];
Class_Descriptor cd__ZN3ccc9CC6x15y12E = {  "_ZN3ccc9CC6x15y12E", // class name
  bases__ZN3ccc9CC6x15y12E, 2,
  &(vtc__ZN3ccc9CC6x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y13  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC6x15y133efgEv
  ~CC6x15y13(); // tgen
  CC6x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y13E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y13E[];
Class_Descriptor cd__ZN3ccc9CC6x15y13E = {  "_ZN3ccc9CC6x15y13E", // class name
  bases__ZN3ccc9CC6x15y13E, 2,
  &(vtc__ZN3ccc9CC6x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y14  : ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y143pqrEv
  ~CC6x15y14(); // tgen
  CC6x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y14E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y14E[];
Class_Descriptor cd__ZN3ccc9CC6x15y14E = {  "_ZN3ccc9CC6x15y14E", // class name
  bases__ZN3ccc9CC6x15y14E, 2,
  &(vtc__ZN3ccc9CC6x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y15  : ::ccc::AA6 , ::ccc::BB15 {
  ~CC6x15y15(); // tgen
  CC6x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y15E) C1{ BC2{ 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
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y15E[];
Class_Descriptor cd__ZN3ccc9CC6x15y15E = {  "_ZN3ccc9CC6x15y15E", // class name
  bases__ZN3ccc9CC6x15y15E, 2,
  &(vtc__ZN3ccc9CC6x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y0  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y03pqrEv
  ~CC7x0y0(); // tgen
  CC7x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y0E[];
extern void _ZN3ccc7CC7x0y03abcEv();
extern void _ZN3ccc7CC7x0y03pqrEv();
extern void _ZN3ccc7CC7x0y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y03abcEv,_ZThn4_N3ccc7CC7x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y03efgEv,_ZThn4_N3ccc7CC7x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y03pqrEv,_ZThn4_N3ccc7CC7x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y03abcEv,_ZThn4_N3ccc7CC7x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y03efgEv,_ZThn4_N3ccc7CC7x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y03pqrEv,_ZThn4_N3ccc7CC7x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y0E[];
Class_Descriptor cd__ZN3ccc7CC7x0y0E = {  "_ZN3ccc7CC7x0y0E", // class name
  bases__ZN3ccc7CC7x0y0E, 2,
  &(vtc__ZN3ccc7CC7x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y1  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x0y13efgEv
  ~CC7x0y1(); // tgen
  CC7x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y1E[];
extern void _ZN3ccc7CC7x0y13abcEv();
extern void _ZN3ccc7CC7x0y13pqrEv();
extern void _ZN3ccc7CC7x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y13abcEv,_ZThn4_N3ccc7CC7x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y13efgEv,_ZThn4_N3ccc7CC7x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y13pqrEv,_ZThn4_N3ccc7CC7x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y13abcEv,_ZThn4_N3ccc7CC7x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y13efgEv,_ZThn4_N3ccc7CC7x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y13pqrEv,_ZThn4_N3ccc7CC7x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y1E[];
Class_Descriptor cd__ZN3ccc7CC7x0y1E = {  "_ZN3ccc7CC7x0y1E", // class name
  bases__ZN3ccc7CC7x0y1E, 2,
  &(vtc__ZN3ccc7CC7x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y2  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y23pqrEv
  ~CC7x0y2(); // tgen
  CC7x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y2E[];
extern void _ZN3ccc7CC7x0y23abcEv();
extern void _ZN3ccc7CC7x0y23pqrEv();
extern void _ZN3ccc7CC7x0y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y23abcEv,_ZThn4_N3ccc7CC7x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y23efgEv,_ZThn4_N3ccc7CC7x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y23pqrEv,_ZThn4_N3ccc7CC7x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y23abcEv,_ZThn4_N3ccc7CC7x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y23efgEv,_ZThn4_N3ccc7CC7x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y23pqrEv,_ZThn4_N3ccc7CC7x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y2E[];
Class_Descriptor cd__ZN3ccc7CC7x0y2E = {  "_ZN3ccc7CC7x0y2E", // class name
  bases__ZN3ccc7CC7x0y2E, 2,
  &(vtc__ZN3ccc7CC7x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y3  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x0y33abcEv
  ~CC7x0y3(); // tgen
  CC7x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y3E[];
extern void _ZN3ccc7CC7x0y33abcEv();
extern void _ZN3ccc7CC7x0y33pqrEv();
extern void _ZN3ccc7CC7x0y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y33abcEv,_ZThn4_N3ccc7CC7x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y33efgEv,_ZThn4_N3ccc7CC7x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y33pqrEv,_ZThn4_N3ccc7CC7x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y33abcEv,_ZThn4_N3ccc7CC7x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y33efgEv,_ZThn4_N3ccc7CC7x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y33pqrEv,_ZThn4_N3ccc7CC7x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y3E[];
Class_Descriptor cd__ZN3ccc7CC7x0y3E = {  "_ZN3ccc7CC7x0y3E", // class name
  bases__ZN3ccc7CC7x0y3E, 2,
  &(vtc__ZN3ccc7CC7x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y4  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC7x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y43efgEv
  ~CC7x0y4(); // tgen
  CC7x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y4E[];
extern void _ZN3ccc7CC7x0y43abcEv();
extern void _ZN3ccc7CC7x0y43pqrEv();
extern void _ZN3ccc7CC7x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y43abcEv,_ZThn4_N3ccc7CC7x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y43efgEv,_ZThn4_N3ccc7CC7x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y43pqrEv,_ZThn4_N3ccc7CC7x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y43abcEv,_ZThn4_N3ccc7CC7x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y43efgEv,_ZThn4_N3ccc7CC7x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y43pqrEv,_ZThn4_N3ccc7CC7x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y4E[];
Class_Descriptor cd__ZN3ccc7CC7x0y4E = {  "_ZN3ccc7CC7x0y4E", // class name
  bases__ZN3ccc7CC7x0y4E, 2,
  &(vtc__ZN3ccc7CC7x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y5  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC7x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y53abcEv
  ~CC7x0y5(); // tgen
  CC7x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y5E[];
extern void _ZN3ccc7CC7x0y53abcEv();
extern void _ZN3ccc7CC7x0y53pqrEv();
extern void _ZN3ccc7CC7x0y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y53abcEv,_ZThn4_N3ccc7CC7x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y53efgEv,_ZThn4_N3ccc7CC7x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y53pqrEv,_ZThn4_N3ccc7CC7x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y53abcEv,_ZThn4_N3ccc7CC7x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y53efgEv,_ZThn4_N3ccc7CC7x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y53pqrEv,_ZThn4_N3ccc7CC7x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y5E[];
Class_Descriptor cd__ZN3ccc7CC7x0y5E = {  "_ZN3ccc7CC7x0y5E", // class name
  bases__ZN3ccc7CC7x0y5E, 2,
  &(vtc__ZN3ccc7CC7x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y6  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y63efgEv
  ~CC7x0y6(); // tgen
  CC7x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y6E[];
extern void _ZN3ccc7CC7x0y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y63abcEv,_ZThn4_N3ccc7CC7x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y63efgEv,_ZThn4_N3ccc7CC7x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y63abcEv,_ZThn4_N3ccc7CC7x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y63efgEv,_ZThn4_N3ccc7CC7x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y6E[];
Class_Descriptor cd__ZN3ccc7CC7x0y6E = {  "_ZN3ccc7CC7x0y6E", // class name
  bases__ZN3ccc7CC7x0y6E, 2,
  &(vtc__ZN3ccc7CC7x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y7  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y73pqrEv
  ~CC7x0y7(); // tgen
  CC7x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y7E[];
extern void _ZN3ccc7CC7x0y73abcEv();
extern void _ZN3ccc7CC7x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y73abcEv,_ZThn4_N3ccc7CC7x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y73pqrEv,_ZThn4_N3ccc7CC7x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y73abcEv,_ZThn4_N3ccc7CC7x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y73pqrEv,_ZThn4_N3ccc7CC7x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y7E[];
Class_Descriptor cd__ZN3ccc7CC7x0y7E = {  "_ZN3ccc7CC7x0y7E", // class name
  bases__ZN3ccc7CC7x0y7E, 2,
  &(vtc__ZN3ccc7CC7x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y8  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y83abcEv
  ~CC7x0y8(); // tgen
  CC7x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y8E[];
extern void _ZN3ccc7CC7x0y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y83abcEv,_ZThn4_N3ccc7CC7x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y83efgEv,_ZThn4_N3ccc7CC7x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y83abcEv,_ZThn4_N3ccc7CC7x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y83efgEv,_ZThn4_N3ccc7CC7x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y8E[];
Class_Descriptor cd__ZN3ccc7CC7x0y8E = {  "_ZN3ccc7CC7x0y8E", // class name
  bases__ZN3ccc7CC7x0y8E, 2,
  &(vtc__ZN3ccc7CC7x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y9  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y93pqrEv
  ~CC7x0y9(); // tgen
  CC7x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x0y93pqrEv();
extern void _ZN3ccc7CC7x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y93efgEv,_ZThn4_N3ccc7CC7x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y93pqrEv,_ZThn4_N3ccc7CC7x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y93efgEv,_ZThn4_N3ccc7CC7x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x0y93pqrEv,_ZThn4_N3ccc7CC7x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y9E[];
Class_Descriptor cd__ZN3ccc7CC7x0y9E = {  "_ZN3ccc7CC7x0y9E", // class name
  bases__ZN3ccc7CC7x0y9E, 2,
  &(vtc__ZN3ccc7CC7x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y10  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x0y103abcEv
  ~CC7x0y10(); // tgen
  CC7x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y10E[];
extern void _ZN3ccc8CC7x0y103abcEv();
extern void _ZN3ccc8CC7x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y103abcEv,_ZThn4_N3ccc8CC7x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y103pqrEv,_ZThn4_N3ccc8CC7x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y103abcEv,_ZThn4_N3ccc8CC7x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y103pqrEv,_ZThn4_N3ccc8CC7x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y10E[];
Class_Descriptor cd__ZN3ccc8CC7x0y10E = {  "_ZN3ccc8CC7x0y10E", // class name
  bases__ZN3ccc8CC7x0y10E, 2,
  &(vtc__ZN3ccc8CC7x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y11  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x0y113efgEv
  ~CC7x0y11(); // tgen
  CC7x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x0y113pqrEv();
extern void _ZN3ccc8CC7x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y113efgEv,_ZThn4_N3ccc8CC7x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y113pqrEv,_ZThn4_N3ccc8CC7x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y113efgEv,_ZThn4_N3ccc8CC7x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y113pqrEv,_ZThn4_N3ccc8CC7x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y11E[];
Class_Descriptor cd__ZN3ccc8CC7x0y11E = {  "_ZN3ccc8CC7x0y11E", // class name
  bases__ZN3ccc8CC7x0y11E, 2,
  &(vtc__ZN3ccc8CC7x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y12  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC7x0y123abcEv
  ~CC7x0y12(); // tgen
  CC7x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y12E[];
extern void _ZN3ccc8CC7x0y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y123abcEv,_ZThn4_N3ccc8CC7x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y123abcEv,_ZThn4_N3ccc8CC7x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y12E[];
Class_Descriptor cd__ZN3ccc8CC7x0y12E = {  "_ZN3ccc8CC7x0y12E", // class name
  bases__ZN3ccc8CC7x0y12E, 2,
  &(vtc__ZN3ccc8CC7x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y13  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC7x0y133efgEv
  ~CC7x0y13(); // tgen
  CC7x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y133efgEv,_ZThn4_N3ccc8CC7x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y133efgEv,_ZThn4_N3ccc8CC7x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y13E[];
Class_Descriptor cd__ZN3ccc8CC7x0y13E = {  "_ZN3ccc8CC7x0y13E", // class name
  bases__ZN3ccc8CC7x0y13E, 2,
  &(vtc__ZN3ccc8CC7x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y14  : ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y143pqrEv
  ~CC7x0y14(); // tgen
  CC7x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y143pqrEv,_ZThn4_N3ccc8CC7x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x0y143pqrEv,_ZThn4_N3ccc8CC7x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y14E[];
Class_Descriptor cd__ZN3ccc8CC7x0y14E = {  "_ZN3ccc8CC7x0y14E", // class name
  bases__ZN3ccc8CC7x0y14E, 2,
  &(vtc__ZN3ccc8CC7x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y15  : ::ccc::AA7 , ::ccc::BB0 {
  ~CC7x0y15(); // tgen
  CC7x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y15E[];
Class_Descriptor cd__ZN3ccc8CC7x0y15E = {  "_ZN3ccc8CC7x0y15E", // class name
  bases__ZN3ccc8CC7x0y15E, 2,
  &(vtc__ZN3ccc8CC7x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y0  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y03pqrEv
  ~CC7x1y0(); // tgen
  CC7x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y0E[];
extern void _ZN3ccc7CC7x1y03abcEv();
extern void _ZN3ccc7CC7x1y03pqrEv();
extern void _ZN3ccc7CC7x1y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y03abcEv,_ZThn4_N3ccc7CC7x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y03pqrEv,_ZThn4_N3ccc7CC7x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y03efgEv,_ZThn4_N3ccc7CC7x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y03abcEv,_ZThn4_N3ccc7CC7x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y03pqrEv,_ZThn4_N3ccc7CC7x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y03efgEv,_ZThn4_N3ccc7CC7x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y0E[];
Class_Descriptor cd__ZN3ccc7CC7x1y0E = {  "_ZN3ccc7CC7x1y0E", // class name
  bases__ZN3ccc7CC7x1y0E, 2,
  &(vtc__ZN3ccc7CC7x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y1  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x1y13efgEv
  ~CC7x1y1(); // tgen
  CC7x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y1E[];
extern void _ZN3ccc7CC7x1y13abcEv();
extern void _ZN3ccc7CC7x1y13pqrEv();
extern void _ZN3ccc7CC7x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y13abcEv,_ZThn4_N3ccc7CC7x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y13pqrEv,_ZThn4_N3ccc7CC7x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y13efgEv,_ZThn4_N3ccc7CC7x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y13abcEv,_ZThn4_N3ccc7CC7x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y13pqrEv,_ZThn4_N3ccc7CC7x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y13efgEv,_ZThn4_N3ccc7CC7x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y1E[];
Class_Descriptor cd__ZN3ccc7CC7x1y1E = {  "_ZN3ccc7CC7x1y1E", // class name
  bases__ZN3ccc7CC7x1y1E, 2,
  &(vtc__ZN3ccc7CC7x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y2  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y23pqrEv
  ~CC7x1y2(); // tgen
  CC7x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y2E[];
extern void _ZN3ccc7CC7x1y23abcEv();
extern void _ZN3ccc7CC7x1y23pqrEv();
extern void _ZN3ccc7CC7x1y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y23abcEv,_ZThn4_N3ccc7CC7x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y23pqrEv,_ZThn4_N3ccc7CC7x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y23efgEv,_ZThn4_N3ccc7CC7x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y23abcEv,_ZThn4_N3ccc7CC7x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y23pqrEv,_ZThn4_N3ccc7CC7x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y23efgEv,_ZThn4_N3ccc7CC7x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y2E[];
Class_Descriptor cd__ZN3ccc7CC7x1y2E = {  "_ZN3ccc7CC7x1y2E", // class name
  bases__ZN3ccc7CC7x1y2E, 2,
  &(vtc__ZN3ccc7CC7x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y3  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x1y33abcEv
  ~CC7x1y3(); // tgen
  CC7x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y3E[];
extern void _ZN3ccc7CC7x1y33abcEv();
extern void _ZN3ccc7CC7x1y33pqrEv();
extern void _ZN3ccc7CC7x1y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y33abcEv,_ZThn4_N3ccc7CC7x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y33pqrEv,_ZThn4_N3ccc7CC7x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y33efgEv,_ZThn4_N3ccc7CC7x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y33abcEv,_ZThn4_N3ccc7CC7x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y33pqrEv,_ZThn4_N3ccc7CC7x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y33efgEv,_ZThn4_N3ccc7CC7x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y3E[];
Class_Descriptor cd__ZN3ccc7CC7x1y3E = {  "_ZN3ccc7CC7x1y3E", // class name
  bases__ZN3ccc7CC7x1y3E, 2,
  &(vtc__ZN3ccc7CC7x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y4  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC7x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y43efgEv
  ~CC7x1y4(); // tgen
  CC7x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y4E[];
extern void _ZN3ccc7CC7x1y43abcEv();
extern void _ZN3ccc7CC7x1y43pqrEv();
extern void _ZN3ccc7CC7x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y43abcEv,_ZThn4_N3ccc7CC7x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y43pqrEv,_ZThn4_N3ccc7CC7x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y43efgEv,_ZThn4_N3ccc7CC7x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y43abcEv,_ZThn4_N3ccc7CC7x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y43pqrEv,_ZThn4_N3ccc7CC7x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y43efgEv,_ZThn4_N3ccc7CC7x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y4E[];
Class_Descriptor cd__ZN3ccc7CC7x1y4E = {  "_ZN3ccc7CC7x1y4E", // class name
  bases__ZN3ccc7CC7x1y4E, 2,
  &(vtc__ZN3ccc7CC7x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y5  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC7x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y53abcEv
  ~CC7x1y5(); // tgen
  CC7x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y5E[];
extern void _ZN3ccc7CC7x1y53abcEv();
extern void _ZN3ccc7CC7x1y53pqrEv();
extern void _ZN3ccc7CC7x1y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y53abcEv,_ZThn4_N3ccc7CC7x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y53pqrEv,_ZThn4_N3ccc7CC7x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y53efgEv,_ZThn4_N3ccc7CC7x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y53abcEv,_ZThn4_N3ccc7CC7x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y53pqrEv,_ZThn4_N3ccc7CC7x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y53efgEv,_ZThn4_N3ccc7CC7x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y5E[];
Class_Descriptor cd__ZN3ccc7CC7x1y5E = {  "_ZN3ccc7CC7x1y5E", // class name
  bases__ZN3ccc7CC7x1y5E, 2,
  &(vtc__ZN3ccc7CC7x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y6  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y63efgEv
  ~CC7x1y6(); // tgen
  CC7x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y6E[];
extern void _ZN3ccc7CC7x1y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y63abcEv,_ZThn4_N3ccc7CC7x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y63efgEv,_ZThn4_N3ccc7CC7x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y63abcEv,_ZThn4_N3ccc7CC7x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y63efgEv,_ZThn4_N3ccc7CC7x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y6E[];
Class_Descriptor cd__ZN3ccc7CC7x1y6E = {  "_ZN3ccc7CC7x1y6E", // class name
  bases__ZN3ccc7CC7x1y6E, 2,
  &(vtc__ZN3ccc7CC7x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y7  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y73pqrEv
  ~CC7x1y7(); // tgen
  CC7x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y7E[];
extern void _ZN3ccc7CC7x1y73abcEv();
extern void _ZN3ccc7CC7x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y73abcEv,_ZThn4_N3ccc7CC7x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y73pqrEv,_ZThn4_N3ccc7CC7x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y73abcEv,_ZThn4_N3ccc7CC7x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y73pqrEv,_ZThn4_N3ccc7CC7x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y7E[];
Class_Descriptor cd__ZN3ccc7CC7x1y7E = {  "_ZN3ccc7CC7x1y7E", // class name
  bases__ZN3ccc7CC7x1y7E, 2,
  &(vtc__ZN3ccc7CC7x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y8  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y83abcEv
  ~CC7x1y8(); // tgen
  CC7x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y8E[];
extern void _ZN3ccc7CC7x1y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y83abcEv,_ZThn4_N3ccc7CC7x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y83efgEv,_ZThn4_N3ccc7CC7x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y83abcEv,_ZThn4_N3ccc7CC7x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y83efgEv,_ZThn4_N3ccc7CC7x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y8E[];
Class_Descriptor cd__ZN3ccc7CC7x1y8E = {  "_ZN3ccc7CC7x1y8E", // class name
  bases__ZN3ccc7CC7x1y8E, 2,
  &(vtc__ZN3ccc7CC7x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y9  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y93pqrEv
  ~CC7x1y9(); // tgen
  CC7x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x1y93pqrEv();
extern void _ZN3ccc7CC7x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y93pqrEv,_ZThn4_N3ccc7CC7x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y93efgEv,_ZThn4_N3ccc7CC7x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y93pqrEv,_ZThn4_N3ccc7CC7x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x1y93efgEv,_ZThn4_N3ccc7CC7x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y9E[];
Class_Descriptor cd__ZN3ccc7CC7x1y9E = {  "_ZN3ccc7CC7x1y9E", // class name
  bases__ZN3ccc7CC7x1y9E, 2,
  &(vtc__ZN3ccc7CC7x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y10  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x1y103abcEv
  ~CC7x1y10(); // tgen
  CC7x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y10E[];
extern void _ZN3ccc8CC7x1y103abcEv();
extern void _ZN3ccc8CC7x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y103abcEv,_ZThn4_N3ccc8CC7x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y103pqrEv,_ZThn4_N3ccc8CC7x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y103abcEv,_ZThn4_N3ccc8CC7x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y103pqrEv,_ZThn4_N3ccc8CC7x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y10E[];
Class_Descriptor cd__ZN3ccc8CC7x1y10E = {  "_ZN3ccc8CC7x1y10E", // class name
  bases__ZN3ccc8CC7x1y10E, 2,
  &(vtc__ZN3ccc8CC7x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y11  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x1y113efgEv
  ~CC7x1y11(); // tgen
  CC7x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x1y113pqrEv();
extern void _ZN3ccc8CC7x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y113pqrEv,_ZThn4_N3ccc8CC7x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y113efgEv,_ZThn4_N3ccc8CC7x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y113pqrEv,_ZThn4_N3ccc8CC7x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y113efgEv,_ZThn4_N3ccc8CC7x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y11E[];
Class_Descriptor cd__ZN3ccc8CC7x1y11E = {  "_ZN3ccc8CC7x1y11E", // class name
  bases__ZN3ccc8CC7x1y11E, 2,
  &(vtc__ZN3ccc8CC7x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y12  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC7x1y123abcEv
  ~CC7x1y12(); // tgen
  CC7x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y12E[];
extern void _ZN3ccc8CC7x1y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y123abcEv,_ZThn4_N3ccc8CC7x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y123abcEv,_ZThn4_N3ccc8CC7x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y12E[];
Class_Descriptor cd__ZN3ccc8CC7x1y12E = {  "_ZN3ccc8CC7x1y12E", // class name
  bases__ZN3ccc8CC7x1y12E, 2,
  &(vtc__ZN3ccc8CC7x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y13  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC7x1y133efgEv
  ~CC7x1y13(); // tgen
  CC7x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y133efgEv,_ZThn4_N3ccc8CC7x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y133efgEv,_ZThn4_N3ccc8CC7x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y13E[];
Class_Descriptor cd__ZN3ccc8CC7x1y13E = {  "_ZN3ccc8CC7x1y13E", // class name
  bases__ZN3ccc8CC7x1y13E, 2,
  &(vtc__ZN3ccc8CC7x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y14  : ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y143pqrEv
  ~CC7x1y14(); // tgen
  CC7x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y143pqrEv,_ZThn4_N3ccc8CC7x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x1y143pqrEv,_ZThn4_N3ccc8CC7x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y14E[];
Class_Descriptor cd__ZN3ccc8CC7x1y14E = {  "_ZN3ccc8CC7x1y14E", // class name
  bases__ZN3ccc8CC7x1y14E, 2,
  &(vtc__ZN3ccc8CC7x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x1y15  : ::ccc::AA7 , ::ccc::BB1 {
  ~CC7x1y15(); // tgen
  CC7x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y15E[];
Class_Descriptor cd__ZN3ccc8CC7x1y15E = {  "_ZN3ccc8CC7x1y15E", // class name
  bases__ZN3ccc8CC7x1y15E, 2,
  &(vtc__ZN3ccc8CC7x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y0  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y03pqrEv
  ~CC7x2y0(); // tgen
  CC7x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y0E[];
extern void _ZN3ccc7CC7x2y03abcEv();
extern void _ZN3ccc7CC7x2y03pqrEv();
extern void _ZN3ccc7CC7x2y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y03efgEv,_ZThn4_N3ccc7CC7x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y03abcEv,_ZThn4_N3ccc7CC7x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y03pqrEv,_ZThn4_N3ccc7CC7x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y03efgEv,_ZThn4_N3ccc7CC7x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y03abcEv,_ZThn4_N3ccc7CC7x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y03pqrEv,_ZThn4_N3ccc7CC7x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y0E[];
Class_Descriptor cd__ZN3ccc7CC7x2y0E = {  "_ZN3ccc7CC7x2y0E", // class name
  bases__ZN3ccc7CC7x2y0E, 2,
  &(vtc__ZN3ccc7CC7x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y1  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x2y13efgEv
  ~CC7x2y1(); // tgen
  CC7x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y1E[];
extern void _ZN3ccc7CC7x2y13abcEv();
extern void _ZN3ccc7CC7x2y13pqrEv();
extern void _ZN3ccc7CC7x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y13efgEv,_ZThn4_N3ccc7CC7x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y13abcEv,_ZThn4_N3ccc7CC7x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y13pqrEv,_ZThn4_N3ccc7CC7x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y13efgEv,_ZThn4_N3ccc7CC7x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y13abcEv,_ZThn4_N3ccc7CC7x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y13pqrEv,_ZThn4_N3ccc7CC7x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y1E[];
Class_Descriptor cd__ZN3ccc7CC7x2y1E = {  "_ZN3ccc7CC7x2y1E", // class name
  bases__ZN3ccc7CC7x2y1E, 2,
  &(vtc__ZN3ccc7CC7x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y2  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y23pqrEv
  ~CC7x2y2(); // tgen
  CC7x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y2E[];
extern void _ZN3ccc7CC7x2y23abcEv();
extern void _ZN3ccc7CC7x2y23pqrEv();
extern void _ZN3ccc7CC7x2y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y23efgEv,_ZThn4_N3ccc7CC7x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y23abcEv,_ZThn4_N3ccc7CC7x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y23pqrEv,_ZThn4_N3ccc7CC7x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y23efgEv,_ZThn4_N3ccc7CC7x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y23abcEv,_ZThn4_N3ccc7CC7x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y23pqrEv,_ZThn4_N3ccc7CC7x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y2E[];
Class_Descriptor cd__ZN3ccc7CC7x2y2E = {  "_ZN3ccc7CC7x2y2E", // class name
  bases__ZN3ccc7CC7x2y2E, 2,
  &(vtc__ZN3ccc7CC7x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y3  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x2y33abcEv
  ~CC7x2y3(); // tgen
  CC7x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y3E[];
extern void _ZN3ccc7CC7x2y33abcEv();
extern void _ZN3ccc7CC7x2y33pqrEv();
extern void _ZN3ccc7CC7x2y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y33efgEv,_ZThn4_N3ccc7CC7x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y33abcEv,_ZThn4_N3ccc7CC7x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y33pqrEv,_ZThn4_N3ccc7CC7x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y33efgEv,_ZThn4_N3ccc7CC7x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y33abcEv,_ZThn4_N3ccc7CC7x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y33pqrEv,_ZThn4_N3ccc7CC7x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y3E[];
Class_Descriptor cd__ZN3ccc7CC7x2y3E = {  "_ZN3ccc7CC7x2y3E", // class name
  bases__ZN3ccc7CC7x2y3E, 2,
  &(vtc__ZN3ccc7CC7x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y4  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC7x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y43efgEv
  ~CC7x2y4(); // tgen
  CC7x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y4E[];
extern void _ZN3ccc7CC7x2y43abcEv();
extern void _ZN3ccc7CC7x2y43pqrEv();
extern void _ZN3ccc7CC7x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y43efgEv,_ZThn4_N3ccc7CC7x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y43abcEv,_ZThn4_N3ccc7CC7x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y43pqrEv,_ZThn4_N3ccc7CC7x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y43efgEv,_ZThn4_N3ccc7CC7x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y43abcEv,_ZThn4_N3ccc7CC7x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y43pqrEv,_ZThn4_N3ccc7CC7x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y4E[];
Class_Descriptor cd__ZN3ccc7CC7x2y4E = {  "_ZN3ccc7CC7x2y4E", // class name
  bases__ZN3ccc7CC7x2y4E, 2,
  &(vtc__ZN3ccc7CC7x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y5  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC7x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y53abcEv
  ~CC7x2y5(); // tgen
  CC7x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y5E[];
extern void _ZN3ccc7CC7x2y53abcEv();
extern void _ZN3ccc7CC7x2y53pqrEv();
extern void _ZN3ccc7CC7x2y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y53efgEv,_ZThn4_N3ccc7CC7x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y53abcEv,_ZThn4_N3ccc7CC7x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y53pqrEv,_ZThn4_N3ccc7CC7x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y53efgEv,_ZThn4_N3ccc7CC7x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y53abcEv,_ZThn4_N3ccc7CC7x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y53pqrEv,_ZThn4_N3ccc7CC7x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y5E[];
Class_Descriptor cd__ZN3ccc7CC7x2y5E = {  "_ZN3ccc7CC7x2y5E", // class name
  bases__ZN3ccc7CC7x2y5E, 2,
  &(vtc__ZN3ccc7CC7x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y6  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y63efgEv
  ~CC7x2y6(); // tgen
  CC7x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y6E[];
extern void _ZN3ccc7CC7x2y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y63efgEv,_ZThn4_N3ccc7CC7x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y63abcEv,_ZThn4_N3ccc7CC7x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y63efgEv,_ZThn4_N3ccc7CC7x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y63abcEv,_ZThn4_N3ccc7CC7x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y6E[];
Class_Descriptor cd__ZN3ccc7CC7x2y6E = {  "_ZN3ccc7CC7x2y6E", // class name
  bases__ZN3ccc7CC7x2y6E, 2,
  &(vtc__ZN3ccc7CC7x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y7  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y73pqrEv
  ~CC7x2y7(); // tgen
  CC7x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y7E[];
extern void _ZN3ccc7CC7x2y73abcEv();
extern void _ZN3ccc7CC7x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y73abcEv,_ZThn4_N3ccc7CC7x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y73pqrEv,_ZThn4_N3ccc7CC7x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y73abcEv,_ZThn4_N3ccc7CC7x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y73pqrEv,_ZThn4_N3ccc7CC7x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y7E[];
Class_Descriptor cd__ZN3ccc7CC7x2y7E = {  "_ZN3ccc7CC7x2y7E", // class name
  bases__ZN3ccc7CC7x2y7E, 2,
  &(vtc__ZN3ccc7CC7x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y8  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y83abcEv
  ~CC7x2y8(); // tgen
  CC7x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y8E[];
extern void _ZN3ccc7CC7x2y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y83efgEv,_ZThn4_N3ccc7CC7x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y83abcEv,_ZThn4_N3ccc7CC7x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y83efgEv,_ZThn4_N3ccc7CC7x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y83abcEv,_ZThn4_N3ccc7CC7x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y8E[];
Class_Descriptor cd__ZN3ccc7CC7x2y8E = {  "_ZN3ccc7CC7x2y8E", // class name
  bases__ZN3ccc7CC7x2y8E, 2,
  &(vtc__ZN3ccc7CC7x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y9  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y93pqrEv
  ~CC7x2y9(); // tgen
  CC7x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x2y93pqrEv();
extern void _ZN3ccc7CC7x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y93efgEv,_ZThn4_N3ccc7CC7x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y93pqrEv,_ZThn4_N3ccc7CC7x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y93efgEv,_ZThn4_N3ccc7CC7x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x2y93pqrEv,_ZThn4_N3ccc7CC7x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y9E[];
Class_Descriptor cd__ZN3ccc7CC7x2y9E = {  "_ZN3ccc7CC7x2y9E", // class name
  bases__ZN3ccc7CC7x2y9E, 2,
  &(vtc__ZN3ccc7CC7x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y10  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x2y103abcEv
  ~CC7x2y10(); // tgen
  CC7x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y10E[];
extern void _ZN3ccc8CC7x2y103abcEv();
extern void _ZN3ccc8CC7x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y103abcEv,_ZThn4_N3ccc8CC7x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y103pqrEv,_ZThn4_N3ccc8CC7x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y103abcEv,_ZThn4_N3ccc8CC7x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y103pqrEv,_ZThn4_N3ccc8CC7x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y10E[];
Class_Descriptor cd__ZN3ccc8CC7x2y10E = {  "_ZN3ccc8CC7x2y10E", // class name
  bases__ZN3ccc8CC7x2y10E, 2,
  &(vtc__ZN3ccc8CC7x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y11  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x2y113efgEv
  ~CC7x2y11(); // tgen
  CC7x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x2y113pqrEv();
extern void _ZN3ccc8CC7x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y113efgEv,_ZThn4_N3ccc8CC7x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y113pqrEv,_ZThn4_N3ccc8CC7x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y113efgEv,_ZThn4_N3ccc8CC7x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y113pqrEv,_ZThn4_N3ccc8CC7x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y11E[];
Class_Descriptor cd__ZN3ccc8CC7x2y11E = {  "_ZN3ccc8CC7x2y11E", // class name
  bases__ZN3ccc8CC7x2y11E, 2,
  &(vtc__ZN3ccc8CC7x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y12  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC7x2y123abcEv
  ~CC7x2y12(); // tgen
  CC7x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y12E[];
extern void _ZN3ccc8CC7x2y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y123abcEv,_ZThn4_N3ccc8CC7x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y123abcEv,_ZThn4_N3ccc8CC7x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y12E[];
Class_Descriptor cd__ZN3ccc8CC7x2y12E = {  "_ZN3ccc8CC7x2y12E", // class name
  bases__ZN3ccc8CC7x2y12E, 2,
  &(vtc__ZN3ccc8CC7x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y13  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC7x2y133efgEv
  ~CC7x2y13(); // tgen
  CC7x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y133efgEv,_ZThn4_N3ccc8CC7x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y133efgEv,_ZThn4_N3ccc8CC7x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y13E[];
Class_Descriptor cd__ZN3ccc8CC7x2y13E = {  "_ZN3ccc8CC7x2y13E", // class name
  bases__ZN3ccc8CC7x2y13E, 2,
  &(vtc__ZN3ccc8CC7x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y14  : ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y143pqrEv
  ~CC7x2y14(); // tgen
  CC7x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y143pqrEv,_ZThn4_N3ccc8CC7x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x2y143pqrEv,_ZThn4_N3ccc8CC7x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y14E[];
Class_Descriptor cd__ZN3ccc8CC7x2y14E = {  "_ZN3ccc8CC7x2y14E", // class name
  bases__ZN3ccc8CC7x2y14E, 2,
  &(vtc__ZN3ccc8CC7x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x2y15  : ::ccc::AA7 , ::ccc::BB2 {
  ~CC7x2y15(); // tgen
  CC7x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y15E[];
Class_Descriptor cd__ZN3ccc8CC7x2y15E = {  "_ZN3ccc8CC7x2y15E", // class name
  bases__ZN3ccc8CC7x2y15E, 2,
  &(vtc__ZN3ccc8CC7x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y0  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y03pqrEv
  ~CC7x3y0(); // tgen
  CC7x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y0E[];
extern void _ZN3ccc7CC7x3y03abcEv();
extern void _ZN3ccc7CC7x3y03pqrEv();
extern void _ZN3ccc7CC7x3y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y03efgEv,_ZThn4_N3ccc7CC7x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y03pqrEv,_ZThn4_N3ccc7CC7x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y03abcEv,_ZThn4_N3ccc7CC7x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y03efgEv,_ZThn4_N3ccc7CC7x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y03pqrEv,_ZThn4_N3ccc7CC7x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y03abcEv,_ZThn4_N3ccc7CC7x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y0E[];
Class_Descriptor cd__ZN3ccc7CC7x3y0E = {  "_ZN3ccc7CC7x3y0E", // class name
  bases__ZN3ccc7CC7x3y0E, 2,
  &(vtc__ZN3ccc7CC7x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y1  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x3y13efgEv
  ~CC7x3y1(); // tgen
  CC7x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y1E[];
extern void _ZN3ccc7CC7x3y13abcEv();
extern void _ZN3ccc7CC7x3y13pqrEv();
extern void _ZN3ccc7CC7x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y13efgEv,_ZThn4_N3ccc7CC7x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y13pqrEv,_ZThn4_N3ccc7CC7x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y13abcEv,_ZThn4_N3ccc7CC7x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y13efgEv,_ZThn4_N3ccc7CC7x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y13pqrEv,_ZThn4_N3ccc7CC7x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y13abcEv,_ZThn4_N3ccc7CC7x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y1E[];
Class_Descriptor cd__ZN3ccc7CC7x3y1E = {  "_ZN3ccc7CC7x3y1E", // class name
  bases__ZN3ccc7CC7x3y1E, 2,
  &(vtc__ZN3ccc7CC7x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y2  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y23pqrEv
  ~CC7x3y2(); // tgen
  CC7x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y2E[];
extern void _ZN3ccc7CC7x3y23abcEv();
extern void _ZN3ccc7CC7x3y23pqrEv();
extern void _ZN3ccc7CC7x3y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y23efgEv,_ZThn4_N3ccc7CC7x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y23pqrEv,_ZThn4_N3ccc7CC7x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y23abcEv,_ZThn4_N3ccc7CC7x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y23efgEv,_ZThn4_N3ccc7CC7x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y23pqrEv,_ZThn4_N3ccc7CC7x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y23abcEv,_ZThn4_N3ccc7CC7x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y2E[];
Class_Descriptor cd__ZN3ccc7CC7x3y2E = {  "_ZN3ccc7CC7x3y2E", // class name
  bases__ZN3ccc7CC7x3y2E, 2,
  &(vtc__ZN3ccc7CC7x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y3  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x3y33abcEv
  ~CC7x3y3(); // tgen
  CC7x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y3E[];
extern void _ZN3ccc7CC7x3y33abcEv();
extern void _ZN3ccc7CC7x3y33pqrEv();
extern void _ZN3ccc7CC7x3y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y33efgEv,_ZThn4_N3ccc7CC7x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y33pqrEv,_ZThn4_N3ccc7CC7x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y33abcEv,_ZThn4_N3ccc7CC7x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y33efgEv,_ZThn4_N3ccc7CC7x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y33pqrEv,_ZThn4_N3ccc7CC7x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y33abcEv,_ZThn4_N3ccc7CC7x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y3E[];
Class_Descriptor cd__ZN3ccc7CC7x3y3E = {  "_ZN3ccc7CC7x3y3E", // class name
  bases__ZN3ccc7CC7x3y3E, 2,
  &(vtc__ZN3ccc7CC7x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y4  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC7x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y43efgEv
  ~CC7x3y4(); // tgen
  CC7x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y4E[];
extern void _ZN3ccc7CC7x3y43abcEv();
extern void _ZN3ccc7CC7x3y43pqrEv();
extern void _ZN3ccc7CC7x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y43efgEv,_ZThn4_N3ccc7CC7x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y43pqrEv,_ZThn4_N3ccc7CC7x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y43abcEv,_ZThn4_N3ccc7CC7x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y43efgEv,_ZThn4_N3ccc7CC7x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y43pqrEv,_ZThn4_N3ccc7CC7x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y43abcEv,_ZThn4_N3ccc7CC7x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y4E[];
Class_Descriptor cd__ZN3ccc7CC7x3y4E = {  "_ZN3ccc7CC7x3y4E", // class name
  bases__ZN3ccc7CC7x3y4E, 2,
  &(vtc__ZN3ccc7CC7x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y5  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC7x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y53abcEv
  ~CC7x3y5(); // tgen
  CC7x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y5E[];
extern void _ZN3ccc7CC7x3y53abcEv();
extern void _ZN3ccc7CC7x3y53pqrEv();
extern void _ZN3ccc7CC7x3y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y53efgEv,_ZThn4_N3ccc7CC7x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y53pqrEv,_ZThn4_N3ccc7CC7x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y53abcEv,_ZThn4_N3ccc7CC7x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y53efgEv,_ZThn4_N3ccc7CC7x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y53pqrEv,_ZThn4_N3ccc7CC7x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y53abcEv,_ZThn4_N3ccc7CC7x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y5E[];
Class_Descriptor cd__ZN3ccc7CC7x3y5E = {  "_ZN3ccc7CC7x3y5E", // class name
  bases__ZN3ccc7CC7x3y5E, 2,
  &(vtc__ZN3ccc7CC7x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y6  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y63efgEv
  ~CC7x3y6(); // tgen
  CC7x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y6E[];
extern void _ZN3ccc7CC7x3y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y63efgEv,_ZThn4_N3ccc7CC7x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y63abcEv,_ZThn4_N3ccc7CC7x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y63efgEv,_ZThn4_N3ccc7CC7x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y63abcEv,_ZThn4_N3ccc7CC7x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y6E[];
Class_Descriptor cd__ZN3ccc7CC7x3y6E = {  "_ZN3ccc7CC7x3y6E", // class name
  bases__ZN3ccc7CC7x3y6E, 2,
  &(vtc__ZN3ccc7CC7x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y7  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y73pqrEv
  ~CC7x3y7(); // tgen
  CC7x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y7E[];
extern void _ZN3ccc7CC7x3y73abcEv();
extern void _ZN3ccc7CC7x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y73pqrEv,_ZThn4_N3ccc7CC7x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y73abcEv,_ZThn4_N3ccc7CC7x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y73pqrEv,_ZThn4_N3ccc7CC7x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y73abcEv,_ZThn4_N3ccc7CC7x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y7E[];
Class_Descriptor cd__ZN3ccc7CC7x3y7E = {  "_ZN3ccc7CC7x3y7E", // class name
  bases__ZN3ccc7CC7x3y7E, 2,
  &(vtc__ZN3ccc7CC7x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y8  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y83abcEv
  ~CC7x3y8(); // tgen
  CC7x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y8E[];
extern void _ZN3ccc7CC7x3y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y83efgEv,_ZThn4_N3ccc7CC7x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y83abcEv,_ZThn4_N3ccc7CC7x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y83efgEv,_ZThn4_N3ccc7CC7x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y83abcEv,_ZThn4_N3ccc7CC7x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y8E[];
Class_Descriptor cd__ZN3ccc7CC7x3y8E = {  "_ZN3ccc7CC7x3y8E", // class name
  bases__ZN3ccc7CC7x3y8E, 2,
  &(vtc__ZN3ccc7CC7x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y9  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y93pqrEv
  ~CC7x3y9(); // tgen
  CC7x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x3y93pqrEv();
extern void _ZN3ccc7CC7x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y93efgEv,_ZThn4_N3ccc7CC7x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y93pqrEv,_ZThn4_N3ccc7CC7x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y93efgEv,_ZThn4_N3ccc7CC7x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x3y93pqrEv,_ZThn4_N3ccc7CC7x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y9E[];
Class_Descriptor cd__ZN3ccc7CC7x3y9E = {  "_ZN3ccc7CC7x3y9E", // class name
  bases__ZN3ccc7CC7x3y9E, 2,
  &(vtc__ZN3ccc7CC7x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y10  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x3y103abcEv
  ~CC7x3y10(); // tgen
  CC7x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y10E[];
extern void _ZN3ccc8CC7x3y103abcEv();
extern void _ZN3ccc8CC7x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y103pqrEv,_ZThn4_N3ccc8CC7x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y103abcEv,_ZThn4_N3ccc8CC7x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y103pqrEv,_ZThn4_N3ccc8CC7x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y103abcEv,_ZThn4_N3ccc8CC7x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y10E[];
Class_Descriptor cd__ZN3ccc8CC7x3y10E = {  "_ZN3ccc8CC7x3y10E", // class name
  bases__ZN3ccc8CC7x3y10E, 2,
  &(vtc__ZN3ccc8CC7x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y11  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x3y113efgEv
  ~CC7x3y11(); // tgen
  CC7x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x3y113pqrEv();
extern void _ZN3ccc8CC7x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y113efgEv,_ZThn4_N3ccc8CC7x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y113pqrEv,_ZThn4_N3ccc8CC7x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y113efgEv,_ZThn4_N3ccc8CC7x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y113pqrEv,_ZThn4_N3ccc8CC7x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y11E[];
Class_Descriptor cd__ZN3ccc8CC7x3y11E = {  "_ZN3ccc8CC7x3y11E", // class name
  bases__ZN3ccc8CC7x3y11E, 2,
  &(vtc__ZN3ccc8CC7x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y12  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC7x3y123abcEv
  ~CC7x3y12(); // tgen
  CC7x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y12E[];
extern void _ZN3ccc8CC7x3y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y123abcEv,_ZThn4_N3ccc8CC7x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y123abcEv,_ZThn4_N3ccc8CC7x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y12E[];
Class_Descriptor cd__ZN3ccc8CC7x3y12E = {  "_ZN3ccc8CC7x3y12E", // class name
  bases__ZN3ccc8CC7x3y12E, 2,
  &(vtc__ZN3ccc8CC7x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y13  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC7x3y133efgEv
  ~CC7x3y13(); // tgen
  CC7x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y133efgEv,_ZThn4_N3ccc8CC7x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y133efgEv,_ZThn4_N3ccc8CC7x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y13E[];
Class_Descriptor cd__ZN3ccc8CC7x3y13E = {  "_ZN3ccc8CC7x3y13E", // class name
  bases__ZN3ccc8CC7x3y13E, 2,
  &(vtc__ZN3ccc8CC7x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y14  : ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y143pqrEv
  ~CC7x3y14(); // tgen
  CC7x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y143pqrEv,_ZThn4_N3ccc8CC7x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x3y143pqrEv,_ZThn4_N3ccc8CC7x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y14E[];
Class_Descriptor cd__ZN3ccc8CC7x3y14E = {  "_ZN3ccc8CC7x3y14E", // class name
  bases__ZN3ccc8CC7x3y14E, 2,
  &(vtc__ZN3ccc8CC7x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x3y15  : ::ccc::AA7 , ::ccc::BB3 {
  ~CC7x3y15(); // tgen
  CC7x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y15E[];
Class_Descriptor cd__ZN3ccc8CC7x3y15E = {  "_ZN3ccc8CC7x3y15E", // class name
  bases__ZN3ccc8CC7x3y15E, 2,
  &(vtc__ZN3ccc8CC7x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y0  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y03pqrEv
  ~CC7x4y0(); // tgen
  CC7x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y0E[];
extern void _ZN3ccc7CC7x4y03abcEv();
extern void _ZN3ccc7CC7x4y03pqrEv();
extern void _ZN3ccc7CC7x4y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y03pqrEv,_ZThn4_N3ccc7CC7x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y03abcEv,_ZThn4_N3ccc7CC7x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y03efgEv,_ZThn4_N3ccc7CC7x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y03pqrEv,_ZThn4_N3ccc7CC7x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y03abcEv,_ZThn4_N3ccc7CC7x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y03efgEv,_ZThn4_N3ccc7CC7x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y0E[];
Class_Descriptor cd__ZN3ccc7CC7x4y0E = {  "_ZN3ccc7CC7x4y0E", // class name
  bases__ZN3ccc7CC7x4y0E, 2,
  &(vtc__ZN3ccc7CC7x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y1  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x4y13efgEv
  ~CC7x4y1(); // tgen
  CC7x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y1E[];
extern void _ZN3ccc7CC7x4y13abcEv();
extern void _ZN3ccc7CC7x4y13pqrEv();
extern void _ZN3ccc7CC7x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y13pqrEv,_ZThn4_N3ccc7CC7x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y13abcEv,_ZThn4_N3ccc7CC7x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y13efgEv,_ZThn4_N3ccc7CC7x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y13pqrEv,_ZThn4_N3ccc7CC7x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y13abcEv,_ZThn4_N3ccc7CC7x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y13efgEv,_ZThn4_N3ccc7CC7x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y1E[];
Class_Descriptor cd__ZN3ccc7CC7x4y1E = {  "_ZN3ccc7CC7x4y1E", // class name
  bases__ZN3ccc7CC7x4y1E, 2,
  &(vtc__ZN3ccc7CC7x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y2  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y23pqrEv
  ~CC7x4y2(); // tgen
  CC7x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y2E[];
extern void _ZN3ccc7CC7x4y23abcEv();
extern void _ZN3ccc7CC7x4y23pqrEv();
extern void _ZN3ccc7CC7x4y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y23pqrEv,_ZThn4_N3ccc7CC7x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y23abcEv,_ZThn4_N3ccc7CC7x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y23efgEv,_ZThn4_N3ccc7CC7x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y23pqrEv,_ZThn4_N3ccc7CC7x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y23abcEv,_ZThn4_N3ccc7CC7x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y23efgEv,_ZThn4_N3ccc7CC7x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y2E[];
Class_Descriptor cd__ZN3ccc7CC7x4y2E = {  "_ZN3ccc7CC7x4y2E", // class name
  bases__ZN3ccc7CC7x4y2E, 2,
  &(vtc__ZN3ccc7CC7x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y3  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x4y33abcEv
  ~CC7x4y3(); // tgen
  CC7x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y3E[];
extern void _ZN3ccc7CC7x4y33abcEv();
extern void _ZN3ccc7CC7x4y33pqrEv();
extern void _ZN3ccc7CC7x4y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y33pqrEv,_ZThn4_N3ccc7CC7x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y33abcEv,_ZThn4_N3ccc7CC7x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y33efgEv,_ZThn4_N3ccc7CC7x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y33pqrEv,_ZThn4_N3ccc7CC7x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y33abcEv,_ZThn4_N3ccc7CC7x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y33efgEv,_ZThn4_N3ccc7CC7x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y3E[];
Class_Descriptor cd__ZN3ccc7CC7x4y3E = {  "_ZN3ccc7CC7x4y3E", // class name
  bases__ZN3ccc7CC7x4y3E, 2,
  &(vtc__ZN3ccc7CC7x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y4  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC7x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y43efgEv
  ~CC7x4y4(); // tgen
  CC7x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y4E[];
extern void _ZN3ccc7CC7x4y43abcEv();
extern void _ZN3ccc7CC7x4y43pqrEv();
extern void _ZN3ccc7CC7x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y43pqrEv,_ZThn4_N3ccc7CC7x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y43abcEv,_ZThn4_N3ccc7CC7x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y43efgEv,_ZThn4_N3ccc7CC7x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y43pqrEv,_ZThn4_N3ccc7CC7x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y43abcEv,_ZThn4_N3ccc7CC7x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y43efgEv,_ZThn4_N3ccc7CC7x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y4E[];
Class_Descriptor cd__ZN3ccc7CC7x4y4E = {  "_ZN3ccc7CC7x4y4E", // class name
  bases__ZN3ccc7CC7x4y4E, 2,
  &(vtc__ZN3ccc7CC7x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y5  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC7x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y53abcEv
  ~CC7x4y5(); // tgen
  CC7x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y5E[];
extern void _ZN3ccc7CC7x4y53abcEv();
extern void _ZN3ccc7CC7x4y53pqrEv();
extern void _ZN3ccc7CC7x4y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y53pqrEv,_ZThn4_N3ccc7CC7x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y53abcEv,_ZThn4_N3ccc7CC7x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y53efgEv,_ZThn4_N3ccc7CC7x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y53pqrEv,_ZThn4_N3ccc7CC7x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y53abcEv,_ZThn4_N3ccc7CC7x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y53efgEv,_ZThn4_N3ccc7CC7x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y5E[];
Class_Descriptor cd__ZN3ccc7CC7x4y5E = {  "_ZN3ccc7CC7x4y5E", // class name
  bases__ZN3ccc7CC7x4y5E, 2,
  &(vtc__ZN3ccc7CC7x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y6  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y63efgEv
  ~CC7x4y6(); // tgen
  CC7x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y6E[];
extern void _ZN3ccc7CC7x4y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y63abcEv,_ZThn4_N3ccc7CC7x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y63efgEv,_ZThn4_N3ccc7CC7x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y63abcEv,_ZThn4_N3ccc7CC7x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y63efgEv,_ZThn4_N3ccc7CC7x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y6E[];
Class_Descriptor cd__ZN3ccc7CC7x4y6E = {  "_ZN3ccc7CC7x4y6E", // class name
  bases__ZN3ccc7CC7x4y6E, 2,
  &(vtc__ZN3ccc7CC7x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y7  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y73pqrEv
  ~CC7x4y7(); // tgen
  CC7x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y7E[];
extern void _ZN3ccc7CC7x4y73abcEv();
extern void _ZN3ccc7CC7x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y73pqrEv,_ZThn4_N3ccc7CC7x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y73abcEv,_ZThn4_N3ccc7CC7x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y73pqrEv,_ZThn4_N3ccc7CC7x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y73abcEv,_ZThn4_N3ccc7CC7x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y7E[];
Class_Descriptor cd__ZN3ccc7CC7x4y7E = {  "_ZN3ccc7CC7x4y7E", // class name
  bases__ZN3ccc7CC7x4y7E, 2,
  &(vtc__ZN3ccc7CC7x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y8  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y83abcEv
  ~CC7x4y8(); // tgen
  CC7x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y8E[];
extern void _ZN3ccc7CC7x4y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y83abcEv,_ZThn4_N3ccc7CC7x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y83efgEv,_ZThn4_N3ccc7CC7x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y83abcEv,_ZThn4_N3ccc7CC7x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y83efgEv,_ZThn4_N3ccc7CC7x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y8E[];
Class_Descriptor cd__ZN3ccc7CC7x4y8E = {  "_ZN3ccc7CC7x4y8E", // class name
  bases__ZN3ccc7CC7x4y8E, 2,
  &(vtc__ZN3ccc7CC7x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y9  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y93pqrEv
  ~CC7x4y9(); // tgen
  CC7x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x4y93pqrEv();
extern void _ZN3ccc7CC7x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y93pqrEv,_ZThn4_N3ccc7CC7x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y93efgEv,_ZThn4_N3ccc7CC7x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y93pqrEv,_ZThn4_N3ccc7CC7x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x4y93efgEv,_ZThn4_N3ccc7CC7x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y9E[];
Class_Descriptor cd__ZN3ccc7CC7x4y9E = {  "_ZN3ccc7CC7x4y9E", // class name
  bases__ZN3ccc7CC7x4y9E, 2,
  &(vtc__ZN3ccc7CC7x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y10  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x4y103abcEv
  ~CC7x4y10(); // tgen
  CC7x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y10E[];
extern void _ZN3ccc8CC7x4y103abcEv();
extern void _ZN3ccc8CC7x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y103pqrEv,_ZThn4_N3ccc8CC7x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y103abcEv,_ZThn4_N3ccc8CC7x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y103pqrEv,_ZThn4_N3ccc8CC7x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y103abcEv,_ZThn4_N3ccc8CC7x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y10E[];
Class_Descriptor cd__ZN3ccc8CC7x4y10E = {  "_ZN3ccc8CC7x4y10E", // class name
  bases__ZN3ccc8CC7x4y10E, 2,
  &(vtc__ZN3ccc8CC7x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y11  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x4y113efgEv
  ~CC7x4y11(); // tgen
  CC7x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x4y113pqrEv();
extern void _ZN3ccc8CC7x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y113pqrEv,_ZThn4_N3ccc8CC7x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y113efgEv,_ZThn4_N3ccc8CC7x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y113pqrEv,_ZThn4_N3ccc8CC7x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y113efgEv,_ZThn4_N3ccc8CC7x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y11E[];
Class_Descriptor cd__ZN3ccc8CC7x4y11E = {  "_ZN3ccc8CC7x4y11E", // class name
  bases__ZN3ccc8CC7x4y11E, 2,
  &(vtc__ZN3ccc8CC7x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y12  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC7x4y123abcEv
  ~CC7x4y12(); // tgen
  CC7x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y12E[];
extern void _ZN3ccc8CC7x4y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y123abcEv,_ZThn4_N3ccc8CC7x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y123abcEv,_ZThn4_N3ccc8CC7x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y12E[];
Class_Descriptor cd__ZN3ccc8CC7x4y12E = {  "_ZN3ccc8CC7x4y12E", // class name
  bases__ZN3ccc8CC7x4y12E, 2,
  &(vtc__ZN3ccc8CC7x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y13  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC7x4y133efgEv
  ~CC7x4y13(); // tgen
  CC7x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y133efgEv,_ZThn4_N3ccc8CC7x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y133efgEv,_ZThn4_N3ccc8CC7x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y13E[];
Class_Descriptor cd__ZN3ccc8CC7x4y13E = {  "_ZN3ccc8CC7x4y13E", // class name
  bases__ZN3ccc8CC7x4y13E, 2,
  &(vtc__ZN3ccc8CC7x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y14  : ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y143pqrEv
  ~CC7x4y14(); // tgen
  CC7x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y143pqrEv,_ZThn4_N3ccc8CC7x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x4y143pqrEv,_ZThn4_N3ccc8CC7x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y14E[];
Class_Descriptor cd__ZN3ccc8CC7x4y14E = {  "_ZN3ccc8CC7x4y14E", // class name
  bases__ZN3ccc8CC7x4y14E, 2,
  &(vtc__ZN3ccc8CC7x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x4y15  : ::ccc::AA7 , ::ccc::BB4 {
  ~CC7x4y15(); // tgen
  CC7x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y15E[];
Class_Descriptor cd__ZN3ccc8CC7x4y15E = {  "_ZN3ccc8CC7x4y15E", // class name
  bases__ZN3ccc8CC7x4y15E, 2,
  &(vtc__ZN3ccc8CC7x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y0  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y03pqrEv
  ~CC7x5y0(); // tgen
  CC7x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y0E[];
extern void _ZN3ccc7CC7x5y03abcEv();
extern void _ZN3ccc7CC7x5y03pqrEv();
extern void _ZN3ccc7CC7x5y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y03pqrEv,_ZThn4_N3ccc7CC7x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y03efgEv,_ZThn4_N3ccc7CC7x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y03abcEv,_ZThn4_N3ccc7CC7x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y03pqrEv,_ZThn4_N3ccc7CC7x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y03efgEv,_ZThn4_N3ccc7CC7x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y03abcEv,_ZThn4_N3ccc7CC7x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y0E[];
Class_Descriptor cd__ZN3ccc7CC7x5y0E = {  "_ZN3ccc7CC7x5y0E", // class name
  bases__ZN3ccc7CC7x5y0E, 2,
  &(vtc__ZN3ccc7CC7x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y1  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x5y13efgEv
  ~CC7x5y1(); // tgen
  CC7x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y1E[];
extern void _ZN3ccc7CC7x5y13abcEv();
extern void _ZN3ccc7CC7x5y13pqrEv();
extern void _ZN3ccc7CC7x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y13pqrEv,_ZThn4_N3ccc7CC7x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y13efgEv,_ZThn4_N3ccc7CC7x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y13abcEv,_ZThn4_N3ccc7CC7x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y13pqrEv,_ZThn4_N3ccc7CC7x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y13efgEv,_ZThn4_N3ccc7CC7x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y13abcEv,_ZThn4_N3ccc7CC7x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y1E[];
Class_Descriptor cd__ZN3ccc7CC7x5y1E = {  "_ZN3ccc7CC7x5y1E", // class name
  bases__ZN3ccc7CC7x5y1E, 2,
  &(vtc__ZN3ccc7CC7x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y2  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y23pqrEv
  ~CC7x5y2(); // tgen
  CC7x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y2E[];
extern void _ZN3ccc7CC7x5y23abcEv();
extern void _ZN3ccc7CC7x5y23pqrEv();
extern void _ZN3ccc7CC7x5y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y23pqrEv,_ZThn4_N3ccc7CC7x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y23efgEv,_ZThn4_N3ccc7CC7x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y23abcEv,_ZThn4_N3ccc7CC7x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y23pqrEv,_ZThn4_N3ccc7CC7x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y23efgEv,_ZThn4_N3ccc7CC7x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y23abcEv,_ZThn4_N3ccc7CC7x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y2E[];
Class_Descriptor cd__ZN3ccc7CC7x5y2E = {  "_ZN3ccc7CC7x5y2E", // class name
  bases__ZN3ccc7CC7x5y2E, 2,
  &(vtc__ZN3ccc7CC7x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y3  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x5y33abcEv
  ~CC7x5y3(); // tgen
  CC7x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y3E[];
extern void _ZN3ccc7CC7x5y33abcEv();
extern void _ZN3ccc7CC7x5y33pqrEv();
extern void _ZN3ccc7CC7x5y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y33pqrEv,_ZThn4_N3ccc7CC7x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y33efgEv,_ZThn4_N3ccc7CC7x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y33abcEv,_ZThn4_N3ccc7CC7x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y33pqrEv,_ZThn4_N3ccc7CC7x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y33efgEv,_ZThn4_N3ccc7CC7x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y33abcEv,_ZThn4_N3ccc7CC7x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y3E[];
Class_Descriptor cd__ZN3ccc7CC7x5y3E = {  "_ZN3ccc7CC7x5y3E", // class name
  bases__ZN3ccc7CC7x5y3E, 2,
  &(vtc__ZN3ccc7CC7x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y4  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC7x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y43efgEv
  ~CC7x5y4(); // tgen
  CC7x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y4E[];
extern void _ZN3ccc7CC7x5y43abcEv();
extern void _ZN3ccc7CC7x5y43pqrEv();
extern void _ZN3ccc7CC7x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y43pqrEv,_ZThn4_N3ccc7CC7x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y43efgEv,_ZThn4_N3ccc7CC7x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y43abcEv,_ZThn4_N3ccc7CC7x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y43pqrEv,_ZThn4_N3ccc7CC7x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y43efgEv,_ZThn4_N3ccc7CC7x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y43abcEv,_ZThn4_N3ccc7CC7x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y4E[];
Class_Descriptor cd__ZN3ccc7CC7x5y4E = {  "_ZN3ccc7CC7x5y4E", // class name
  bases__ZN3ccc7CC7x5y4E, 2,
  &(vtc__ZN3ccc7CC7x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y5  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC7x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y53abcEv
  ~CC7x5y5(); // tgen
  CC7x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y5E[];
extern void _ZN3ccc7CC7x5y53abcEv();
extern void _ZN3ccc7CC7x5y53pqrEv();
extern void _ZN3ccc7CC7x5y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y53pqrEv,_ZThn4_N3ccc7CC7x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y53efgEv,_ZThn4_N3ccc7CC7x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y53abcEv,_ZThn4_N3ccc7CC7x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y53pqrEv,_ZThn4_N3ccc7CC7x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y53efgEv,_ZThn4_N3ccc7CC7x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y53abcEv,_ZThn4_N3ccc7CC7x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y5E[];
Class_Descriptor cd__ZN3ccc7CC7x5y5E = {  "_ZN3ccc7CC7x5y5E", // class name
  bases__ZN3ccc7CC7x5y5E, 2,
  &(vtc__ZN3ccc7CC7x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y6  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y63efgEv
  ~CC7x5y6(); // tgen
  CC7x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y6E[];
extern void _ZN3ccc7CC7x5y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y63efgEv,_ZThn4_N3ccc7CC7x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y63abcEv,_ZThn4_N3ccc7CC7x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y63efgEv,_ZThn4_N3ccc7CC7x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y63abcEv,_ZThn4_N3ccc7CC7x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y6E[];
Class_Descriptor cd__ZN3ccc7CC7x5y6E = {  "_ZN3ccc7CC7x5y6E", // class name
  bases__ZN3ccc7CC7x5y6E, 2,
  &(vtc__ZN3ccc7CC7x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y7  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y73pqrEv
  ~CC7x5y7(); // tgen
  CC7x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y7E[];
extern void _ZN3ccc7CC7x5y73abcEv();
extern void _ZN3ccc7CC7x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y73pqrEv,_ZThn4_N3ccc7CC7x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y73abcEv,_ZThn4_N3ccc7CC7x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y73pqrEv,_ZThn4_N3ccc7CC7x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y73abcEv,_ZThn4_N3ccc7CC7x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y7E[];
Class_Descriptor cd__ZN3ccc7CC7x5y7E = {  "_ZN3ccc7CC7x5y7E", // class name
  bases__ZN3ccc7CC7x5y7E, 2,
  &(vtc__ZN3ccc7CC7x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y8  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y83abcEv
  ~CC7x5y8(); // tgen
  CC7x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y8E[];
extern void _ZN3ccc7CC7x5y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y83efgEv,_ZThn4_N3ccc7CC7x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y83abcEv,_ZThn4_N3ccc7CC7x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y83efgEv,_ZThn4_N3ccc7CC7x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y83abcEv,_ZThn4_N3ccc7CC7x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y8E[];
Class_Descriptor cd__ZN3ccc7CC7x5y8E = {  "_ZN3ccc7CC7x5y8E", // class name
  bases__ZN3ccc7CC7x5y8E, 2,
  &(vtc__ZN3ccc7CC7x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y9  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y93pqrEv
  ~CC7x5y9(); // tgen
  CC7x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x5y93pqrEv();
extern void _ZN3ccc7CC7x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y93pqrEv,_ZThn4_N3ccc7CC7x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y93efgEv,_ZThn4_N3ccc7CC7x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y93pqrEv,_ZThn4_N3ccc7CC7x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x5y93efgEv,_ZThn4_N3ccc7CC7x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y9E[];
Class_Descriptor cd__ZN3ccc7CC7x5y9E = {  "_ZN3ccc7CC7x5y9E", // class name
  bases__ZN3ccc7CC7x5y9E, 2,
  &(vtc__ZN3ccc7CC7x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y10  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x5y103abcEv
  ~CC7x5y10(); // tgen
  CC7x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y10E[];
extern void _ZN3ccc8CC7x5y103abcEv();
extern void _ZN3ccc8CC7x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y103pqrEv,_ZThn4_N3ccc8CC7x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y103abcEv,_ZThn4_N3ccc8CC7x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y103pqrEv,_ZThn4_N3ccc8CC7x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y103abcEv,_ZThn4_N3ccc8CC7x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y10E[];
Class_Descriptor cd__ZN3ccc8CC7x5y10E = {  "_ZN3ccc8CC7x5y10E", // class name
  bases__ZN3ccc8CC7x5y10E, 2,
  &(vtc__ZN3ccc8CC7x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y11  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x5y113efgEv
  ~CC7x5y11(); // tgen
  CC7x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x5y113pqrEv();
extern void _ZN3ccc8CC7x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y113pqrEv,_ZThn4_N3ccc8CC7x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y113efgEv,_ZThn4_N3ccc8CC7x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y113pqrEv,_ZThn4_N3ccc8CC7x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y113efgEv,_ZThn4_N3ccc8CC7x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y11E[];
Class_Descriptor cd__ZN3ccc8CC7x5y11E = {  "_ZN3ccc8CC7x5y11E", // class name
  bases__ZN3ccc8CC7x5y11E, 2,
  &(vtc__ZN3ccc8CC7x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y12  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC7x5y123abcEv
  ~CC7x5y12(); // tgen
  CC7x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y12E[];
extern void _ZN3ccc8CC7x5y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y123abcEv,_ZThn4_N3ccc8CC7x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y123abcEv,_ZThn4_N3ccc8CC7x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y12E[];
Class_Descriptor cd__ZN3ccc8CC7x5y12E = {  "_ZN3ccc8CC7x5y12E", // class name
  bases__ZN3ccc8CC7x5y12E, 2,
  &(vtc__ZN3ccc8CC7x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y13  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC7x5y133efgEv
  ~CC7x5y13(); // tgen
  CC7x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y133efgEv,_ZThn4_N3ccc8CC7x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y133efgEv,_ZThn4_N3ccc8CC7x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y13E[];
Class_Descriptor cd__ZN3ccc8CC7x5y13E = {  "_ZN3ccc8CC7x5y13E", // class name
  bases__ZN3ccc8CC7x5y13E, 2,
  &(vtc__ZN3ccc8CC7x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y14  : ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y143pqrEv
  ~CC7x5y14(); // tgen
  CC7x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y143pqrEv,_ZThn4_N3ccc8CC7x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x5y143pqrEv,_ZThn4_N3ccc8CC7x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y14E[];
Class_Descriptor cd__ZN3ccc8CC7x5y14E = {  "_ZN3ccc8CC7x5y14E", // class name
  bases__ZN3ccc8CC7x5y14E, 2,
  &(vtc__ZN3ccc8CC7x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x5y15  : ::ccc::AA7 , ::ccc::BB5 {
  ~CC7x5y15(); // tgen
  CC7x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y15E[];
Class_Descriptor cd__ZN3ccc8CC7x5y15E = {  "_ZN3ccc8CC7x5y15E", // class name
  bases__ZN3ccc8CC7x5y15E, 2,
  &(vtc__ZN3ccc8CC7x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y0  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y03pqrEv
  ~CC7x6y0(); // tgen
  CC7x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y0E[];
extern void _ZN3ccc7CC7x6y03abcEv();
extern void _ZN3ccc7CC7x6y03pqrEv();
extern void _ZN3ccc7CC7x6y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y03abcEv,_ZThn4_N3ccc7CC7x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y03efgEv,_ZThn4_N3ccc7CC7x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y03abcEv,_ZThn4_N3ccc7CC7x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y03efgEv,_ZThn4_N3ccc7CC7x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y0E[];
Class_Descriptor cd__ZN3ccc7CC7x6y0E = {  "_ZN3ccc7CC7x6y0E", // class name
  bases__ZN3ccc7CC7x6y0E, 2,
  &(vtc__ZN3ccc7CC7x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y1  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x6y13efgEv
  ~CC7x6y1(); // tgen
  CC7x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y1E[];
extern void _ZN3ccc7CC7x6y13abcEv();
extern void _ZN3ccc7CC7x6y13pqrEv();
extern void _ZN3ccc7CC7x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y13abcEv,_ZThn4_N3ccc7CC7x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y13efgEv,_ZThn4_N3ccc7CC7x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y13abcEv,_ZThn4_N3ccc7CC7x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y13efgEv,_ZThn4_N3ccc7CC7x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y1E[];
Class_Descriptor cd__ZN3ccc7CC7x6y1E = {  "_ZN3ccc7CC7x6y1E", // class name
  bases__ZN3ccc7CC7x6y1E, 2,
  &(vtc__ZN3ccc7CC7x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y2  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y23pqrEv
  ~CC7x6y2(); // tgen
  CC7x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y2E[];
extern void _ZN3ccc7CC7x6y23abcEv();
extern void _ZN3ccc7CC7x6y23pqrEv();
extern void _ZN3ccc7CC7x6y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y23abcEv,_ZThn4_N3ccc7CC7x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y23efgEv,_ZThn4_N3ccc7CC7x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y23abcEv,_ZThn4_N3ccc7CC7x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y23efgEv,_ZThn4_N3ccc7CC7x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y2E[];
Class_Descriptor cd__ZN3ccc7CC7x6y2E = {  "_ZN3ccc7CC7x6y2E", // class name
  bases__ZN3ccc7CC7x6y2E, 2,
  &(vtc__ZN3ccc7CC7x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y3  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x6y33abcEv
  ~CC7x6y3(); // tgen
  CC7x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y3E[];
extern void _ZN3ccc7CC7x6y33abcEv();
extern void _ZN3ccc7CC7x6y33pqrEv();
extern void _ZN3ccc7CC7x6y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y33abcEv,_ZThn4_N3ccc7CC7x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y33efgEv,_ZThn4_N3ccc7CC7x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y33abcEv,_ZThn4_N3ccc7CC7x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y33efgEv,_ZThn4_N3ccc7CC7x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y3E[];
Class_Descriptor cd__ZN3ccc7CC7x6y3E = {  "_ZN3ccc7CC7x6y3E", // class name
  bases__ZN3ccc7CC7x6y3E, 2,
  &(vtc__ZN3ccc7CC7x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y4  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC7x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y43efgEv
  ~CC7x6y4(); // tgen
  CC7x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y4E[];
extern void _ZN3ccc7CC7x6y43abcEv();
extern void _ZN3ccc7CC7x6y43pqrEv();
extern void _ZN3ccc7CC7x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y43abcEv,_ZThn4_N3ccc7CC7x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y43efgEv,_ZThn4_N3ccc7CC7x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y43abcEv,_ZThn4_N3ccc7CC7x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y43efgEv,_ZThn4_N3ccc7CC7x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y4E[];
Class_Descriptor cd__ZN3ccc7CC7x6y4E = {  "_ZN3ccc7CC7x6y4E", // class name
  bases__ZN3ccc7CC7x6y4E, 2,
  &(vtc__ZN3ccc7CC7x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y5  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC7x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y53abcEv
  ~CC7x6y5(); // tgen
  CC7x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y5E[];
extern void _ZN3ccc7CC7x6y53abcEv();
extern void _ZN3ccc7CC7x6y53pqrEv();
extern void _ZN3ccc7CC7x6y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y53abcEv,_ZThn4_N3ccc7CC7x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y53efgEv,_ZThn4_N3ccc7CC7x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y53abcEv,_ZThn4_N3ccc7CC7x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y53efgEv,_ZThn4_N3ccc7CC7x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y5E[];
Class_Descriptor cd__ZN3ccc7CC7x6y5E = {  "_ZN3ccc7CC7x6y5E", // class name
  bases__ZN3ccc7CC7x6y5E, 2,
  &(vtc__ZN3ccc7CC7x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y6  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y63efgEv
  ~CC7x6y6(); // tgen
  CC7x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y6E[];
extern void _ZN3ccc7CC7x6y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y63abcEv,_ZThn4_N3ccc7CC7x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y63efgEv,_ZThn4_N3ccc7CC7x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y63abcEv,_ZThn4_N3ccc7CC7x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y63efgEv,_ZThn4_N3ccc7CC7x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y6E[];
Class_Descriptor cd__ZN3ccc7CC7x6y6E = {  "_ZN3ccc7CC7x6y6E", // class name
  bases__ZN3ccc7CC7x6y6E, 2,
  &(vtc__ZN3ccc7CC7x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y7  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y73pqrEv
  ~CC7x6y7(); // tgen
  CC7x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y7E[];
extern void _ZN3ccc7CC7x6y73abcEv();
extern void _ZN3ccc7CC7x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y73abcEv,_ZThn4_N3ccc7CC7x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y73abcEv,_ZThn4_N3ccc7CC7x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y7E[];
Class_Descriptor cd__ZN3ccc7CC7x6y7E = {  "_ZN3ccc7CC7x6y7E", // class name
  bases__ZN3ccc7CC7x6y7E, 2,
  &(vtc__ZN3ccc7CC7x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y8  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y83abcEv
  ~CC7x6y8(); // tgen
  CC7x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y8E[];
extern void _ZN3ccc7CC7x6y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y83abcEv,_ZThn4_N3ccc7CC7x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y83efgEv,_ZThn4_N3ccc7CC7x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y83abcEv,_ZThn4_N3ccc7CC7x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y83efgEv,_ZThn4_N3ccc7CC7x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y8E[];
Class_Descriptor cd__ZN3ccc7CC7x6y8E = {  "_ZN3ccc7CC7x6y8E", // class name
  bases__ZN3ccc7CC7x6y8E, 2,
  &(vtc__ZN3ccc7CC7x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y9  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y93pqrEv
  ~CC7x6y9(); // tgen
  CC7x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x6y93pqrEv();
extern void _ZN3ccc7CC7x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y93efgEv,_ZThn4_N3ccc7CC7x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x6y93efgEv,_ZThn4_N3ccc7CC7x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y9E[];
Class_Descriptor cd__ZN3ccc7CC7x6y9E = {  "_ZN3ccc7CC7x6y9E", // class name
  bases__ZN3ccc7CC7x6y9E, 2,
  &(vtc__ZN3ccc7CC7x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y10  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x6y103abcEv
  ~CC7x6y10(); // tgen
  CC7x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y10E[];
extern void _ZN3ccc8CC7x6y103abcEv();
extern void _ZN3ccc8CC7x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y103abcEv,_ZThn4_N3ccc8CC7x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x6y103abcEv,_ZThn4_N3ccc8CC7x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y10E[];
Class_Descriptor cd__ZN3ccc8CC7x6y10E = {  "_ZN3ccc8CC7x6y10E", // class name
  bases__ZN3ccc8CC7x6y10E, 2,
  &(vtc__ZN3ccc8CC7x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y11  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x6y113efgEv
  ~CC7x6y11(); // tgen
  CC7x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x6y113pqrEv();
extern void _ZN3ccc8CC7x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y113efgEv,_ZThn4_N3ccc8CC7x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x6y113efgEv,_ZThn4_N3ccc8CC7x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y11E[];
Class_Descriptor cd__ZN3ccc8CC7x6y11E = {  "_ZN3ccc8CC7x6y11E", // class name
  bases__ZN3ccc8CC7x6y11E, 2,
  &(vtc__ZN3ccc8CC7x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y12  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC7x6y123abcEv
  ~CC7x6y12(); // tgen
  CC7x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y12E[];
extern void _ZN3ccc8CC7x6y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y123abcEv,_ZThn4_N3ccc8CC7x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x6y123abcEv,_ZThn4_N3ccc8CC7x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y12E[];
Class_Descriptor cd__ZN3ccc8CC7x6y12E = {  "_ZN3ccc8CC7x6y12E", // class name
  bases__ZN3ccc8CC7x6y12E, 2,
  &(vtc__ZN3ccc8CC7x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y13  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC7x6y133efgEv
  ~CC7x6y13(); // tgen
  CC7x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y133efgEv,_ZThn4_N3ccc8CC7x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x6y133efgEv,_ZThn4_N3ccc8CC7x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y13E[];
Class_Descriptor cd__ZN3ccc8CC7x6y13E = {  "_ZN3ccc8CC7x6y13E", // class name
  bases__ZN3ccc8CC7x6y13E, 2,
  &(vtc__ZN3ccc8CC7x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y14  : ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y143pqrEv
  ~CC7x6y14(); // tgen
  CC7x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y14E[];
Class_Descriptor cd__ZN3ccc8CC7x6y14E = {  "_ZN3ccc8CC7x6y14E", // class name
  bases__ZN3ccc8CC7x6y14E, 2,
  &(vtc__ZN3ccc8CC7x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x6y15  : ::ccc::AA7 , ::ccc::BB6 {
  ~CC7x6y15(); // tgen
  CC7x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y15E[];
Class_Descriptor cd__ZN3ccc8CC7x6y15E = {  "_ZN3ccc8CC7x6y15E", // class name
  bases__ZN3ccc8CC7x6y15E, 2,
  &(vtc__ZN3ccc8CC7x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y0  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y03pqrEv
  ~CC7x7y0(); // tgen
  CC7x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y0E[];
extern void _ZN3ccc7CC7x7y03abcEv();
extern void _ZN3ccc7CC7x7y03pqrEv();
extern void _ZN3ccc7CC7x7y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y03abcEv,_ZThn4_N3ccc7CC7x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y03pqrEv,_ZThn4_N3ccc7CC7x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y03abcEv,_ZThn4_N3ccc7CC7x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y03pqrEv,_ZThn4_N3ccc7CC7x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y0E[];
Class_Descriptor cd__ZN3ccc7CC7x7y0E = {  "_ZN3ccc7CC7x7y0E", // class name
  bases__ZN3ccc7CC7x7y0E, 2,
  &(vtc__ZN3ccc7CC7x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y1  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x7y13efgEv
  ~CC7x7y1(); // tgen
  CC7x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y1E[];
extern void _ZN3ccc7CC7x7y13abcEv();
extern void _ZN3ccc7CC7x7y13pqrEv();
extern void _ZN3ccc7CC7x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y13abcEv,_ZThn4_N3ccc7CC7x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y13pqrEv,_ZThn4_N3ccc7CC7x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y13abcEv,_ZThn4_N3ccc7CC7x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y13pqrEv,_ZThn4_N3ccc7CC7x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y1E[];
Class_Descriptor cd__ZN3ccc7CC7x7y1E = {  "_ZN3ccc7CC7x7y1E", // class name
  bases__ZN3ccc7CC7x7y1E, 2,
  &(vtc__ZN3ccc7CC7x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y2  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y23pqrEv
  ~CC7x7y2(); // tgen
  CC7x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y2E[];
extern void _ZN3ccc7CC7x7y23abcEv();
extern void _ZN3ccc7CC7x7y23pqrEv();
extern void _ZN3ccc7CC7x7y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y23abcEv,_ZThn4_N3ccc7CC7x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y23pqrEv,_ZThn4_N3ccc7CC7x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y23abcEv,_ZThn4_N3ccc7CC7x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y23pqrEv,_ZThn4_N3ccc7CC7x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y2E[];
Class_Descriptor cd__ZN3ccc7CC7x7y2E = {  "_ZN3ccc7CC7x7y2E", // class name
  bases__ZN3ccc7CC7x7y2E, 2,
  &(vtc__ZN3ccc7CC7x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y3  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x7y33abcEv
  ~CC7x7y3(); // tgen
  CC7x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y3E[];
extern void _ZN3ccc7CC7x7y33abcEv();
extern void _ZN3ccc7CC7x7y33pqrEv();
extern void _ZN3ccc7CC7x7y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y33abcEv,_ZThn4_N3ccc7CC7x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y33pqrEv,_ZThn4_N3ccc7CC7x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y33abcEv,_ZThn4_N3ccc7CC7x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y33pqrEv,_ZThn4_N3ccc7CC7x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y3E[];
Class_Descriptor cd__ZN3ccc7CC7x7y3E = {  "_ZN3ccc7CC7x7y3E", // class name
  bases__ZN3ccc7CC7x7y3E, 2,
  &(vtc__ZN3ccc7CC7x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y4  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC7x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y43efgEv
  ~CC7x7y4(); // tgen
  CC7x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y4E[];
extern void _ZN3ccc7CC7x7y43abcEv();
extern void _ZN3ccc7CC7x7y43pqrEv();
extern void _ZN3ccc7CC7x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y43abcEv,_ZThn4_N3ccc7CC7x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y43pqrEv,_ZThn4_N3ccc7CC7x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y43abcEv,_ZThn4_N3ccc7CC7x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y43pqrEv,_ZThn4_N3ccc7CC7x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y4E[];
Class_Descriptor cd__ZN3ccc7CC7x7y4E = {  "_ZN3ccc7CC7x7y4E", // class name
  bases__ZN3ccc7CC7x7y4E, 2,
  &(vtc__ZN3ccc7CC7x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y5  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC7x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y53abcEv
  ~CC7x7y5(); // tgen
  CC7x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y5E[];
extern void _ZN3ccc7CC7x7y53abcEv();
extern void _ZN3ccc7CC7x7y53pqrEv();
extern void _ZN3ccc7CC7x7y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y53abcEv,_ZThn4_N3ccc7CC7x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y53pqrEv,_ZThn4_N3ccc7CC7x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y53abcEv,_ZThn4_N3ccc7CC7x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y53pqrEv,_ZThn4_N3ccc7CC7x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y5E[];
Class_Descriptor cd__ZN3ccc7CC7x7y5E = {  "_ZN3ccc7CC7x7y5E", // class name
  bases__ZN3ccc7CC7x7y5E, 2,
  &(vtc__ZN3ccc7CC7x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y6  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y63efgEv
  ~CC7x7y6(); // tgen
  CC7x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y6E[];
extern void _ZN3ccc7CC7x7y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y63abcEv,_ZThn4_N3ccc7CC7x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y63abcEv,_ZThn4_N3ccc7CC7x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y6E[];
Class_Descriptor cd__ZN3ccc7CC7x7y6E = {  "_ZN3ccc7CC7x7y6E", // class name
  bases__ZN3ccc7CC7x7y6E, 2,
  &(vtc__ZN3ccc7CC7x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y7  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y73pqrEv
  ~CC7x7y7(); // tgen
  CC7x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y7E[];
extern void _ZN3ccc7CC7x7y73abcEv();
extern void _ZN3ccc7CC7x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y73abcEv,_ZThn4_N3ccc7CC7x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y73pqrEv,_ZThn4_N3ccc7CC7x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y73abcEv,_ZThn4_N3ccc7CC7x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y73pqrEv,_ZThn4_N3ccc7CC7x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y7E[];
Class_Descriptor cd__ZN3ccc7CC7x7y7E = {  "_ZN3ccc7CC7x7y7E", // class name
  bases__ZN3ccc7CC7x7y7E, 2,
  &(vtc__ZN3ccc7CC7x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y8  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y83abcEv
  ~CC7x7y8(); // tgen
  CC7x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y8E[];
extern void _ZN3ccc7CC7x7y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y83abcEv,_ZThn4_N3ccc7CC7x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y83abcEv,_ZThn4_N3ccc7CC7x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y8E[];
Class_Descriptor cd__ZN3ccc7CC7x7y8E = {  "_ZN3ccc7CC7x7y8E", // class name
  bases__ZN3ccc7CC7x7y8E, 2,
  &(vtc__ZN3ccc7CC7x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y9  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y93pqrEv
  ~CC7x7y9(); // tgen
  CC7x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x7y93pqrEv();
extern void _ZN3ccc7CC7x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y93pqrEv,_ZThn4_N3ccc7CC7x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x7y93pqrEv,_ZThn4_N3ccc7CC7x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y9E[];
Class_Descriptor cd__ZN3ccc7CC7x7y9E = {  "_ZN3ccc7CC7x7y9E", // class name
  bases__ZN3ccc7CC7x7y9E, 2,
  &(vtc__ZN3ccc7CC7x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y10  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x7y103abcEv
  ~CC7x7y10(); // tgen
  CC7x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y10E[];
extern void _ZN3ccc8CC7x7y103abcEv();
extern void _ZN3ccc8CC7x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y103abcEv,_ZThn4_N3ccc8CC7x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y103pqrEv,_ZThn4_N3ccc8CC7x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x7y103abcEv,_ZThn4_N3ccc8CC7x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x7y103pqrEv,_ZThn4_N3ccc8CC7x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y10E[];
Class_Descriptor cd__ZN3ccc8CC7x7y10E = {  "_ZN3ccc8CC7x7y10E", // class name
  bases__ZN3ccc8CC7x7y10E, 2,
  &(vtc__ZN3ccc8CC7x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y11  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x7y113efgEv
  ~CC7x7y11(); // tgen
  CC7x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x7y113pqrEv();
extern void _ZN3ccc8CC7x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y113pqrEv,_ZThn4_N3ccc8CC7x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x7y113pqrEv,_ZThn4_N3ccc8CC7x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y11E[];
Class_Descriptor cd__ZN3ccc8CC7x7y11E = {  "_ZN3ccc8CC7x7y11E", // class name
  bases__ZN3ccc8CC7x7y11E, 2,
  &(vtc__ZN3ccc8CC7x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y12  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC7x7y123abcEv
  ~CC7x7y12(); // tgen
  CC7x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y12E[];
extern void _ZN3ccc8CC7x7y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y123abcEv,_ZThn4_N3ccc8CC7x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x7y123abcEv,_ZThn4_N3ccc8CC7x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y12E[];
Class_Descriptor cd__ZN3ccc8CC7x7y12E = {  "_ZN3ccc8CC7x7y12E", // class name
  bases__ZN3ccc8CC7x7y12E, 2,
  &(vtc__ZN3ccc8CC7x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y13  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC7x7y133efgEv
  ~CC7x7y13(); // tgen
  CC7x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y13E[];
Class_Descriptor cd__ZN3ccc8CC7x7y13E = {  "_ZN3ccc8CC7x7y13E", // class name
  bases__ZN3ccc8CC7x7y13E, 2,
  &(vtc__ZN3ccc8CC7x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y14  : ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y143pqrEv
  ~CC7x7y14(); // tgen
  CC7x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y143pqrEv,_ZThn4_N3ccc8CC7x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x7y143pqrEv,_ZThn4_N3ccc8CC7x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y14E[];
Class_Descriptor cd__ZN3ccc8CC7x7y14E = {  "_ZN3ccc8CC7x7y14E", // class name
  bases__ZN3ccc8CC7x7y14E, 2,
  &(vtc__ZN3ccc8CC7x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x7y15  : ::ccc::AA7 , ::ccc::BB7 {
  ~CC7x7y15(); // tgen
  CC7x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y15E[];
Class_Descriptor cd__ZN3ccc8CC7x7y15E = {  "_ZN3ccc8CC7x7y15E", // class name
  bases__ZN3ccc8CC7x7y15E, 2,
  &(vtc__ZN3ccc8CC7x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y0  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y03pqrEv
  ~CC7x8y0(); // tgen
  CC7x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y0E[];
extern void _ZN3ccc7CC7x8y03abcEv();
extern void _ZN3ccc7CC7x8y03pqrEv();
extern void _ZN3ccc7CC7x8y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y03efgEv,_ZThn4_N3ccc7CC7x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y03abcEv,_ZThn4_N3ccc7CC7x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y03efgEv,_ZThn4_N3ccc7CC7x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y03abcEv,_ZThn4_N3ccc7CC7x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y0E[];
Class_Descriptor cd__ZN3ccc7CC7x8y0E = {  "_ZN3ccc7CC7x8y0E", // class name
  bases__ZN3ccc7CC7x8y0E, 2,
  &(vtc__ZN3ccc7CC7x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y1  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x8y13efgEv
  ~CC7x8y1(); // tgen
  CC7x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y1E[];
extern void _ZN3ccc7CC7x8y13abcEv();
extern void _ZN3ccc7CC7x8y13pqrEv();
extern void _ZN3ccc7CC7x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y13efgEv,_ZThn4_N3ccc7CC7x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y13abcEv,_ZThn4_N3ccc7CC7x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y13efgEv,_ZThn4_N3ccc7CC7x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y13abcEv,_ZThn4_N3ccc7CC7x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y1E[];
Class_Descriptor cd__ZN3ccc7CC7x8y1E = {  "_ZN3ccc7CC7x8y1E", // class name
  bases__ZN3ccc7CC7x8y1E, 2,
  &(vtc__ZN3ccc7CC7x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y2  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y23pqrEv
  ~CC7x8y2(); // tgen
  CC7x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y2E[];
extern void _ZN3ccc7CC7x8y23abcEv();
extern void _ZN3ccc7CC7x8y23pqrEv();
extern void _ZN3ccc7CC7x8y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y23efgEv,_ZThn4_N3ccc7CC7x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y23abcEv,_ZThn4_N3ccc7CC7x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y23efgEv,_ZThn4_N3ccc7CC7x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y23abcEv,_ZThn4_N3ccc7CC7x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y2E[];
Class_Descriptor cd__ZN3ccc7CC7x8y2E = {  "_ZN3ccc7CC7x8y2E", // class name
  bases__ZN3ccc7CC7x8y2E, 2,
  &(vtc__ZN3ccc7CC7x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y3  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x8y33abcEv
  ~CC7x8y3(); // tgen
  CC7x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y3E[];
extern void _ZN3ccc7CC7x8y33abcEv();
extern void _ZN3ccc7CC7x8y33pqrEv();
extern void _ZN3ccc7CC7x8y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y33efgEv,_ZThn4_N3ccc7CC7x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y33abcEv,_ZThn4_N3ccc7CC7x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y33efgEv,_ZThn4_N3ccc7CC7x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y33abcEv,_ZThn4_N3ccc7CC7x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y3E[];
Class_Descriptor cd__ZN3ccc7CC7x8y3E = {  "_ZN3ccc7CC7x8y3E", // class name
  bases__ZN3ccc7CC7x8y3E, 2,
  &(vtc__ZN3ccc7CC7x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y4  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC7x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y43efgEv
  ~CC7x8y4(); // tgen
  CC7x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y4E[];
extern void _ZN3ccc7CC7x8y43abcEv();
extern void _ZN3ccc7CC7x8y43pqrEv();
extern void _ZN3ccc7CC7x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y43efgEv,_ZThn4_N3ccc7CC7x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y43abcEv,_ZThn4_N3ccc7CC7x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y43efgEv,_ZThn4_N3ccc7CC7x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y43abcEv,_ZThn4_N3ccc7CC7x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y4E[];
Class_Descriptor cd__ZN3ccc7CC7x8y4E = {  "_ZN3ccc7CC7x8y4E", // class name
  bases__ZN3ccc7CC7x8y4E, 2,
  &(vtc__ZN3ccc7CC7x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y5  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC7x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y53abcEv
  ~CC7x8y5(); // tgen
  CC7x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y5E[];
extern void _ZN3ccc7CC7x8y53abcEv();
extern void _ZN3ccc7CC7x8y53pqrEv();
extern void _ZN3ccc7CC7x8y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y53efgEv,_ZThn4_N3ccc7CC7x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y53abcEv,_ZThn4_N3ccc7CC7x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y53efgEv,_ZThn4_N3ccc7CC7x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y53abcEv,_ZThn4_N3ccc7CC7x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y5E[];
Class_Descriptor cd__ZN3ccc7CC7x8y5E = {  "_ZN3ccc7CC7x8y5E", // class name
  bases__ZN3ccc7CC7x8y5E, 2,
  &(vtc__ZN3ccc7CC7x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y6  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y63efgEv
  ~CC7x8y6(); // tgen
  CC7x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y6E[];
extern void _ZN3ccc7CC7x8y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y63efgEv,_ZThn4_N3ccc7CC7x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y63abcEv,_ZThn4_N3ccc7CC7x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y63efgEv,_ZThn4_N3ccc7CC7x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y63abcEv,_ZThn4_N3ccc7CC7x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y6E[];
Class_Descriptor cd__ZN3ccc7CC7x8y6E = {  "_ZN3ccc7CC7x8y6E", // class name
  bases__ZN3ccc7CC7x8y6E, 2,
  &(vtc__ZN3ccc7CC7x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y7  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y73pqrEv
  ~CC7x8y7(); // tgen
  CC7x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y7E[];
extern void _ZN3ccc7CC7x8y73abcEv();
extern void _ZN3ccc7CC7x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y73abcEv,_ZThn4_N3ccc7CC7x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y73abcEv,_ZThn4_N3ccc7CC7x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y7E[];
Class_Descriptor cd__ZN3ccc7CC7x8y7E = {  "_ZN3ccc7CC7x8y7E", // class name
  bases__ZN3ccc7CC7x8y7E, 2,
  &(vtc__ZN3ccc7CC7x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y8  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y83abcEv
  ~CC7x8y8(); // tgen
  CC7x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y8E[];
extern void _ZN3ccc7CC7x8y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y83efgEv,_ZThn4_N3ccc7CC7x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y83abcEv,_ZThn4_N3ccc7CC7x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y83efgEv,_ZThn4_N3ccc7CC7x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y83abcEv,_ZThn4_N3ccc7CC7x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y8E[];
Class_Descriptor cd__ZN3ccc7CC7x8y8E = {  "_ZN3ccc7CC7x8y8E", // class name
  bases__ZN3ccc7CC7x8y8E, 2,
  &(vtc__ZN3ccc7CC7x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y9  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y93pqrEv
  ~CC7x8y9(); // tgen
  CC7x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x8y93pqrEv();
extern void _ZN3ccc7CC7x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y93efgEv,_ZThn4_N3ccc7CC7x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x8y93efgEv,_ZThn4_N3ccc7CC7x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y9E[];
Class_Descriptor cd__ZN3ccc7CC7x8y9E = {  "_ZN3ccc7CC7x8y9E", // class name
  bases__ZN3ccc7CC7x8y9E, 2,
  &(vtc__ZN3ccc7CC7x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y10  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x8y103abcEv
  ~CC7x8y10(); // tgen
  CC7x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y10E[];
extern void _ZN3ccc8CC7x8y103abcEv();
extern void _ZN3ccc8CC7x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y103abcEv,_ZThn4_N3ccc8CC7x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x8y103abcEv,_ZThn4_N3ccc8CC7x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y10E[];
Class_Descriptor cd__ZN3ccc8CC7x8y10E = {  "_ZN3ccc8CC7x8y10E", // class name
  bases__ZN3ccc8CC7x8y10E, 2,
  &(vtc__ZN3ccc8CC7x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y11  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x8y113efgEv
  ~CC7x8y11(); // tgen
  CC7x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x8y113pqrEv();
extern void _ZN3ccc8CC7x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y113efgEv,_ZThn4_N3ccc8CC7x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x8y113efgEv,_ZThn4_N3ccc8CC7x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y11E[];
Class_Descriptor cd__ZN3ccc8CC7x8y11E = {  "_ZN3ccc8CC7x8y11E", // class name
  bases__ZN3ccc8CC7x8y11E, 2,
  &(vtc__ZN3ccc8CC7x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y12  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC7x8y123abcEv
  ~CC7x8y12(); // tgen
  CC7x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y12E[];
extern void _ZN3ccc8CC7x8y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y123abcEv,_ZThn4_N3ccc8CC7x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x8y123abcEv,_ZThn4_N3ccc8CC7x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y12E[];
Class_Descriptor cd__ZN3ccc8CC7x8y12E = {  "_ZN3ccc8CC7x8y12E", // class name
  bases__ZN3ccc8CC7x8y12E, 2,
  &(vtc__ZN3ccc8CC7x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y13  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC7x8y133efgEv
  ~CC7x8y13(); // tgen
  CC7x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y133efgEv,_ZThn4_N3ccc8CC7x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x8y133efgEv,_ZThn4_N3ccc8CC7x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y13E[];
Class_Descriptor cd__ZN3ccc8CC7x8y13E = {  "_ZN3ccc8CC7x8y13E", // class name
  bases__ZN3ccc8CC7x8y13E, 2,
  &(vtc__ZN3ccc8CC7x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y14  : ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y143pqrEv
  ~CC7x8y14(); // tgen
  CC7x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y14E[];
Class_Descriptor cd__ZN3ccc8CC7x8y14E = {  "_ZN3ccc8CC7x8y14E", // class name
  bases__ZN3ccc8CC7x8y14E, 2,
  &(vtc__ZN3ccc8CC7x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x8y15  : ::ccc::AA7 , ::ccc::BB8 {
  ~CC7x8y15(); // tgen
  CC7x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y15E[];
Class_Descriptor cd__ZN3ccc8CC7x8y15E = {  "_ZN3ccc8CC7x8y15E", // class name
  bases__ZN3ccc8CC7x8y15E, 2,
  &(vtc__ZN3ccc8CC7x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y0  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y03pqrEv
  ~CC7x9y0(); // tgen
  CC7x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y0E[];
extern void _ZN3ccc7CC7x9y03abcEv();
extern void _ZN3ccc7CC7x9y03pqrEv();
extern void _ZN3ccc7CC7x9y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y03efgEv,_ZThn4_N3ccc7CC7x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y03pqrEv,_ZThn4_N3ccc7CC7x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y03efgEv,_ZThn4_N3ccc7CC7x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y03pqrEv,_ZThn4_N3ccc7CC7x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y0E[];
Class_Descriptor cd__ZN3ccc7CC7x9y0E = {  "_ZN3ccc7CC7x9y0E", // class name
  bases__ZN3ccc7CC7x9y0E, 2,
  &(vtc__ZN3ccc7CC7x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y1  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x9y13efgEv
  ~CC7x9y1(); // tgen
  CC7x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y1E[];
extern void _ZN3ccc7CC7x9y13abcEv();
extern void _ZN3ccc7CC7x9y13pqrEv();
extern void _ZN3ccc7CC7x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y13efgEv,_ZThn4_N3ccc7CC7x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y13pqrEv,_ZThn4_N3ccc7CC7x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y13efgEv,_ZThn4_N3ccc7CC7x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y13pqrEv,_ZThn4_N3ccc7CC7x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y1E[];
Class_Descriptor cd__ZN3ccc7CC7x9y1E = {  "_ZN3ccc7CC7x9y1E", // class name
  bases__ZN3ccc7CC7x9y1E, 2,
  &(vtc__ZN3ccc7CC7x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y2  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y23pqrEv
  ~CC7x9y2(); // tgen
  CC7x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y2E[];
extern void _ZN3ccc7CC7x9y23abcEv();
extern void _ZN3ccc7CC7x9y23pqrEv();
extern void _ZN3ccc7CC7x9y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y23efgEv,_ZThn4_N3ccc7CC7x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y23pqrEv,_ZThn4_N3ccc7CC7x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y23efgEv,_ZThn4_N3ccc7CC7x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y23pqrEv,_ZThn4_N3ccc7CC7x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y2E[];
Class_Descriptor cd__ZN3ccc7CC7x9y2E = {  "_ZN3ccc7CC7x9y2E", // class name
  bases__ZN3ccc7CC7x9y2E, 2,
  &(vtc__ZN3ccc7CC7x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y3  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x9y33abcEv
  ~CC7x9y3(); // tgen
  CC7x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y3E[];
extern void _ZN3ccc7CC7x9y33abcEv();
extern void _ZN3ccc7CC7x9y33pqrEv();
extern void _ZN3ccc7CC7x9y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y33efgEv,_ZThn4_N3ccc7CC7x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y33pqrEv,_ZThn4_N3ccc7CC7x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y33efgEv,_ZThn4_N3ccc7CC7x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y33pqrEv,_ZThn4_N3ccc7CC7x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y3E[];
Class_Descriptor cd__ZN3ccc7CC7x9y3E = {  "_ZN3ccc7CC7x9y3E", // class name
  bases__ZN3ccc7CC7x9y3E, 2,
  &(vtc__ZN3ccc7CC7x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y4  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC7x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y43efgEv
  ~CC7x9y4(); // tgen
  CC7x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y4E[];
extern void _ZN3ccc7CC7x9y43abcEv();
extern void _ZN3ccc7CC7x9y43pqrEv();
extern void _ZN3ccc7CC7x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y43efgEv,_ZThn4_N3ccc7CC7x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y43pqrEv,_ZThn4_N3ccc7CC7x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y43efgEv,_ZThn4_N3ccc7CC7x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y43pqrEv,_ZThn4_N3ccc7CC7x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y4E[];
Class_Descriptor cd__ZN3ccc7CC7x9y4E = {  "_ZN3ccc7CC7x9y4E", // class name
  bases__ZN3ccc7CC7x9y4E, 2,
  &(vtc__ZN3ccc7CC7x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y5  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC7x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y53abcEv
  ~CC7x9y5(); // tgen
  CC7x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y5E[];
extern void _ZN3ccc7CC7x9y53abcEv();
extern void _ZN3ccc7CC7x9y53pqrEv();
extern void _ZN3ccc7CC7x9y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y53efgEv,_ZThn4_N3ccc7CC7x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y53pqrEv,_ZThn4_N3ccc7CC7x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y53efgEv,_ZThn4_N3ccc7CC7x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y53pqrEv,_ZThn4_N3ccc7CC7x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y5E[];
Class_Descriptor cd__ZN3ccc7CC7x9y5E = {  "_ZN3ccc7CC7x9y5E", // class name
  bases__ZN3ccc7CC7x9y5E, 2,
  &(vtc__ZN3ccc7CC7x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y6  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y63efgEv
  ~CC7x9y6(); // tgen
  CC7x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y6E[];
extern void _ZN3ccc7CC7x9y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y63efgEv,_ZThn4_N3ccc7CC7x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y63efgEv,_ZThn4_N3ccc7CC7x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y6E[];
Class_Descriptor cd__ZN3ccc7CC7x9y6E = {  "_ZN3ccc7CC7x9y6E", // class name
  bases__ZN3ccc7CC7x9y6E, 2,
  &(vtc__ZN3ccc7CC7x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y7  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y73pqrEv
  ~CC7x9y7(); // tgen
  CC7x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y7E[];
extern void _ZN3ccc7CC7x9y73abcEv();
extern void _ZN3ccc7CC7x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y73pqrEv,_ZThn4_N3ccc7CC7x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y73pqrEv,_ZThn4_N3ccc7CC7x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y7E[];
Class_Descriptor cd__ZN3ccc7CC7x9y7E = {  "_ZN3ccc7CC7x9y7E", // class name
  bases__ZN3ccc7CC7x9y7E, 2,
  &(vtc__ZN3ccc7CC7x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y8  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y83abcEv
  ~CC7x9y8(); // tgen
  CC7x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y8E[];
extern void _ZN3ccc7CC7x9y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7CC7x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y83efgEv,_ZThn4_N3ccc7CC7x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y83efgEv,_ZThn4_N3ccc7CC7x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y8E[];
Class_Descriptor cd__ZN3ccc7CC7x9y8E = {  "_ZN3ccc7CC7x9y8E", // class name
  bases__ZN3ccc7CC7x9y8E, 2,
  &(vtc__ZN3ccc7CC7x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y9  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y93pqrEv
  ~CC7x9y9(); // tgen
  CC7x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC7x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7CC7x9y93pqrEv();
extern void _ZN3ccc7CC7x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y93efgEv,_ZThn4_N3ccc7CC7x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y93pqrEv,_ZThn4_N3ccc7CC7x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y93efgEv,_ZThn4_N3ccc7CC7x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC7x9y93pqrEv,_ZThn4_N3ccc7CC7x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y9E[];
Class_Descriptor cd__ZN3ccc7CC7x9y9E = {  "_ZN3ccc7CC7x9y9E", // class name
  bases__ZN3ccc7CC7x9y9E, 2,
  &(vtc__ZN3ccc7CC7x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y10  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x9y103abcEv
  ~CC7x9y10(); // tgen
  CC7x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y10E[];
extern void _ZN3ccc8CC7x9y103abcEv();
extern void _ZN3ccc8CC7x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y103pqrEv,_ZThn4_N3ccc8CC7x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x9y103pqrEv,_ZThn4_N3ccc8CC7x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y10E[];
Class_Descriptor cd__ZN3ccc8CC7x9y10E = {  "_ZN3ccc8CC7x9y10E", // class name
  bases__ZN3ccc8CC7x9y10E, 2,
  &(vtc__ZN3ccc8CC7x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y11  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x9y113efgEv
  ~CC7x9y11(); // tgen
  CC7x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x9y113pqrEv();
extern void _ZN3ccc8CC7x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y113efgEv,_ZThn4_N3ccc8CC7x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y113pqrEv,_ZThn4_N3ccc8CC7x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x9y113efgEv,_ZThn4_N3ccc8CC7x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x9y113pqrEv,_ZThn4_N3ccc8CC7x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y11E[];
Class_Descriptor cd__ZN3ccc8CC7x9y11E = {  "_ZN3ccc8CC7x9y11E", // class name
  bases__ZN3ccc8CC7x9y11E, 2,
  &(vtc__ZN3ccc8CC7x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y12  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC7x9y123abcEv
  ~CC7x9y12(); // tgen
  CC7x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y12E[];
extern void _ZN3ccc8CC7x9y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y12E[];
Class_Descriptor cd__ZN3ccc8CC7x9y12E = {  "_ZN3ccc8CC7x9y12E", // class name
  bases__ZN3ccc8CC7x9y12E, 2,
  &(vtc__ZN3ccc8CC7x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y13  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC7x9y133efgEv
  ~CC7x9y13(); // tgen
  CC7x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y133efgEv,_ZThn4_N3ccc8CC7x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x9y133efgEv,_ZThn4_N3ccc8CC7x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y13E[];
Class_Descriptor cd__ZN3ccc8CC7x9y13E = {  "_ZN3ccc8CC7x9y13E", // class name
  bases__ZN3ccc8CC7x9y13E, 2,
  &(vtc__ZN3ccc8CC7x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y14  : ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y143pqrEv
  ~CC7x9y14(); // tgen
  CC7x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y143pqrEv,_ZThn4_N3ccc8CC7x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x9y143pqrEv,_ZThn4_N3ccc8CC7x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y14E[];
Class_Descriptor cd__ZN3ccc8CC7x9y14E = {  "_ZN3ccc8CC7x9y14E", // class name
  bases__ZN3ccc8CC7x9y14E, 2,
  &(vtc__ZN3ccc8CC7x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x9y15  : ::ccc::AA7 , ::ccc::BB9 {
  ~CC7x9y15(); // tgen
  CC7x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y15E[];
Class_Descriptor cd__ZN3ccc8CC7x9y15E = {  "_ZN3ccc8CC7x9y15E", // class name
  bases__ZN3ccc8CC7x9y15E, 2,
  &(vtc__ZN3ccc8CC7x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y0  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y03pqrEv
  ~CC7x10y0(); // tgen
  CC7x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y0E[];
extern void _ZN3ccc8CC7x10y03abcEv();
extern void _ZN3ccc8CC7x10y03pqrEv();
extern void _ZN3ccc8CC7x10y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y03pqrEv,_ZThn4_N3ccc8CC7x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y03abcEv,_ZThn4_N3ccc8CC7x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y03pqrEv,_ZThn4_N3ccc8CC7x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y03abcEv,_ZThn4_N3ccc8CC7x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y0E[];
Class_Descriptor cd__ZN3ccc8CC7x10y0E = {  "_ZN3ccc8CC7x10y0E", // class name
  bases__ZN3ccc8CC7x10y0E, 2,
  &(vtc__ZN3ccc8CC7x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y1  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x10y13efgEv
  ~CC7x10y1(); // tgen
  CC7x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y1E[];
extern void _ZN3ccc8CC7x10y13abcEv();
extern void _ZN3ccc8CC7x10y13pqrEv();
extern void _ZN3ccc8CC7x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y13pqrEv,_ZThn4_N3ccc8CC7x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y13abcEv,_ZThn4_N3ccc8CC7x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y13pqrEv,_ZThn4_N3ccc8CC7x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y13abcEv,_ZThn4_N3ccc8CC7x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y1E[];
Class_Descriptor cd__ZN3ccc8CC7x10y1E = {  "_ZN3ccc8CC7x10y1E", // class name
  bases__ZN3ccc8CC7x10y1E, 2,
  &(vtc__ZN3ccc8CC7x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y2  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y23pqrEv
  ~CC7x10y2(); // tgen
  CC7x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y2E[];
extern void _ZN3ccc8CC7x10y23abcEv();
extern void _ZN3ccc8CC7x10y23pqrEv();
extern void _ZN3ccc8CC7x10y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y23pqrEv,_ZThn4_N3ccc8CC7x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y23abcEv,_ZThn4_N3ccc8CC7x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y23pqrEv,_ZThn4_N3ccc8CC7x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y23abcEv,_ZThn4_N3ccc8CC7x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y2E[];
Class_Descriptor cd__ZN3ccc8CC7x10y2E = {  "_ZN3ccc8CC7x10y2E", // class name
  bases__ZN3ccc8CC7x10y2E, 2,
  &(vtc__ZN3ccc8CC7x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y3  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x10y33abcEv
  ~CC7x10y3(); // tgen
  CC7x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y3E[];
extern void _ZN3ccc8CC7x10y33abcEv();
extern void _ZN3ccc8CC7x10y33pqrEv();
extern void _ZN3ccc8CC7x10y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y33pqrEv,_ZThn4_N3ccc8CC7x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y33abcEv,_ZThn4_N3ccc8CC7x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y33pqrEv,_ZThn4_N3ccc8CC7x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y33abcEv,_ZThn4_N3ccc8CC7x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y3E[];
Class_Descriptor cd__ZN3ccc8CC7x10y3E = {  "_ZN3ccc8CC7x10y3E", // class name
  bases__ZN3ccc8CC7x10y3E, 2,
  &(vtc__ZN3ccc8CC7x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y4  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC7x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y43efgEv
  ~CC7x10y4(); // tgen
  CC7x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y4E[];
extern void _ZN3ccc8CC7x10y43abcEv();
extern void _ZN3ccc8CC7x10y43pqrEv();
extern void _ZN3ccc8CC7x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y43pqrEv,_ZThn4_N3ccc8CC7x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y43abcEv,_ZThn4_N3ccc8CC7x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y43pqrEv,_ZThn4_N3ccc8CC7x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y43abcEv,_ZThn4_N3ccc8CC7x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y4E[];
Class_Descriptor cd__ZN3ccc8CC7x10y4E = {  "_ZN3ccc8CC7x10y4E", // class name
  bases__ZN3ccc8CC7x10y4E, 2,
  &(vtc__ZN3ccc8CC7x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y5  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC7x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y53abcEv
  ~CC7x10y5(); // tgen
  CC7x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y5E[];
extern void _ZN3ccc8CC7x10y53abcEv();
extern void _ZN3ccc8CC7x10y53pqrEv();
extern void _ZN3ccc8CC7x10y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y53pqrEv,_ZThn4_N3ccc8CC7x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y53abcEv,_ZThn4_N3ccc8CC7x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y53pqrEv,_ZThn4_N3ccc8CC7x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y53abcEv,_ZThn4_N3ccc8CC7x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y5E[];
Class_Descriptor cd__ZN3ccc8CC7x10y5E = {  "_ZN3ccc8CC7x10y5E", // class name
  bases__ZN3ccc8CC7x10y5E, 2,
  &(vtc__ZN3ccc8CC7x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y6  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y63efgEv
  ~CC7x10y6(); // tgen
  CC7x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y6E[];
extern void _ZN3ccc8CC7x10y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y63abcEv,_ZThn4_N3ccc8CC7x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y63abcEv,_ZThn4_N3ccc8CC7x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y6E[];
Class_Descriptor cd__ZN3ccc8CC7x10y6E = {  "_ZN3ccc8CC7x10y6E", // class name
  bases__ZN3ccc8CC7x10y6E, 2,
  &(vtc__ZN3ccc8CC7x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y7  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y73pqrEv
  ~CC7x10y7(); // tgen
  CC7x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y7E[];
extern void _ZN3ccc8CC7x10y73abcEv();
extern void _ZN3ccc8CC7x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y73pqrEv,_ZThn4_N3ccc8CC7x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y73abcEv,_ZThn4_N3ccc8CC7x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y73pqrEv,_ZThn4_N3ccc8CC7x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y73abcEv,_ZThn4_N3ccc8CC7x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y7E[];
Class_Descriptor cd__ZN3ccc8CC7x10y7E = {  "_ZN3ccc8CC7x10y7E", // class name
  bases__ZN3ccc8CC7x10y7E, 2,
  &(vtc__ZN3ccc8CC7x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y8  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y83abcEv
  ~CC7x10y8(); // tgen
  CC7x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y8E[];
extern void _ZN3ccc8CC7x10y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y83abcEv,_ZThn4_N3ccc8CC7x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y83abcEv,_ZThn4_N3ccc8CC7x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y8E[];
Class_Descriptor cd__ZN3ccc8CC7x10y8E = {  "_ZN3ccc8CC7x10y8E", // class name
  bases__ZN3ccc8CC7x10y8E, 2,
  &(vtc__ZN3ccc8CC7x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y9  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y93pqrEv
  ~CC7x10y9(); // tgen
  CC7x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x10y93pqrEv();
extern void _ZN3ccc8CC7x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y93pqrEv,_ZThn4_N3ccc8CC7x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x10y93pqrEv,_ZThn4_N3ccc8CC7x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y9E[];
Class_Descriptor cd__ZN3ccc8CC7x10y9E = {  "_ZN3ccc8CC7x10y9E", // class name
  bases__ZN3ccc8CC7x10y9E, 2,
  &(vtc__ZN3ccc8CC7x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y10  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x10y103abcEv
  ~CC7x10y10(); // tgen
  CC7x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y10E[];
extern void _ZN3ccc9CC7x10y103abcEv();
extern void _ZN3ccc9CC7x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y103pqrEv,_ZThn4_N3ccc9CC7x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y103abcEv,_ZThn4_N3ccc9CC7x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x10y103pqrEv,_ZThn4_N3ccc9CC7x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x10y103abcEv,_ZThn4_N3ccc9CC7x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y10E[];
Class_Descriptor cd__ZN3ccc9CC7x10y10E = {  "_ZN3ccc9CC7x10y10E", // class name
  bases__ZN3ccc9CC7x10y10E, 2,
  &(vtc__ZN3ccc9CC7x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y11  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x10y113efgEv
  ~CC7x10y11(); // tgen
  CC7x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x10y113pqrEv();
extern void _ZN3ccc9CC7x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y113pqrEv,_ZThn4_N3ccc9CC7x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x10y113pqrEv,_ZThn4_N3ccc9CC7x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y11E[];
Class_Descriptor cd__ZN3ccc9CC7x10y11E = {  "_ZN3ccc9CC7x10y11E", // class name
  bases__ZN3ccc9CC7x10y11E, 2,
  &(vtc__ZN3ccc9CC7x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y12  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC7x10y123abcEv
  ~CC7x10y12(); // tgen
  CC7x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y12E[];
extern void _ZN3ccc9CC7x10y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y123abcEv,_ZThn4_N3ccc9CC7x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x10y123abcEv,_ZThn4_N3ccc9CC7x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y12E[];
Class_Descriptor cd__ZN3ccc9CC7x10y12E = {  "_ZN3ccc9CC7x10y12E", // class name
  bases__ZN3ccc9CC7x10y12E, 2,
  &(vtc__ZN3ccc9CC7x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y13  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC7x10y133efgEv
  ~CC7x10y13(); // tgen
  CC7x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y13E[];
Class_Descriptor cd__ZN3ccc9CC7x10y13E = {  "_ZN3ccc9CC7x10y13E", // class name
  bases__ZN3ccc9CC7x10y13E, 2,
  &(vtc__ZN3ccc9CC7x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y14  : ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y143pqrEv
  ~CC7x10y14(); // tgen
  CC7x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y143pqrEv,_ZThn4_N3ccc9CC7x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x10y143pqrEv,_ZThn4_N3ccc9CC7x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y14E[];
Class_Descriptor cd__ZN3ccc9CC7x10y14E = {  "_ZN3ccc9CC7x10y14E", // class name
  bases__ZN3ccc9CC7x10y14E, 2,
  &(vtc__ZN3ccc9CC7x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x10y15  : ::ccc::AA7 , ::ccc::BB10 {
  ~CC7x10y15(); // tgen
  CC7x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y15E[];
Class_Descriptor cd__ZN3ccc9CC7x10y15E = {  "_ZN3ccc9CC7x10y15E", // class name
  bases__ZN3ccc9CC7x10y15E, 2,
  &(vtc__ZN3ccc9CC7x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y0  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y03pqrEv
  ~CC7x11y0(); // tgen
  CC7x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y0E[];
extern void _ZN3ccc8CC7x11y03abcEv();
extern void _ZN3ccc8CC7x11y03pqrEv();
extern void _ZN3ccc8CC7x11y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y03pqrEv,_ZThn4_N3ccc8CC7x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y03efgEv,_ZThn4_N3ccc8CC7x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y03pqrEv,_ZThn4_N3ccc8CC7x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y03efgEv,_ZThn4_N3ccc8CC7x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y0E[];
Class_Descriptor cd__ZN3ccc8CC7x11y0E = {  "_ZN3ccc8CC7x11y0E", // class name
  bases__ZN3ccc8CC7x11y0E, 2,
  &(vtc__ZN3ccc8CC7x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y1  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x11y13efgEv
  ~CC7x11y1(); // tgen
  CC7x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y1E[];
extern void _ZN3ccc8CC7x11y13abcEv();
extern void _ZN3ccc8CC7x11y13pqrEv();
extern void _ZN3ccc8CC7x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y13pqrEv,_ZThn4_N3ccc8CC7x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y13efgEv,_ZThn4_N3ccc8CC7x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y13pqrEv,_ZThn4_N3ccc8CC7x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y13efgEv,_ZThn4_N3ccc8CC7x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y1E[];
Class_Descriptor cd__ZN3ccc8CC7x11y1E = {  "_ZN3ccc8CC7x11y1E", // class name
  bases__ZN3ccc8CC7x11y1E, 2,
  &(vtc__ZN3ccc8CC7x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y2  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y23pqrEv
  ~CC7x11y2(); // tgen
  CC7x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y2E[];
extern void _ZN3ccc8CC7x11y23abcEv();
extern void _ZN3ccc8CC7x11y23pqrEv();
extern void _ZN3ccc8CC7x11y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y23pqrEv,_ZThn4_N3ccc8CC7x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y23efgEv,_ZThn4_N3ccc8CC7x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y23pqrEv,_ZThn4_N3ccc8CC7x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y23efgEv,_ZThn4_N3ccc8CC7x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y2E[];
Class_Descriptor cd__ZN3ccc8CC7x11y2E = {  "_ZN3ccc8CC7x11y2E", // class name
  bases__ZN3ccc8CC7x11y2E, 2,
  &(vtc__ZN3ccc8CC7x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y3  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x11y33abcEv
  ~CC7x11y3(); // tgen
  CC7x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y3E[];
extern void _ZN3ccc8CC7x11y33abcEv();
extern void _ZN3ccc8CC7x11y33pqrEv();
extern void _ZN3ccc8CC7x11y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y33pqrEv,_ZThn4_N3ccc8CC7x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y33efgEv,_ZThn4_N3ccc8CC7x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y33pqrEv,_ZThn4_N3ccc8CC7x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y33efgEv,_ZThn4_N3ccc8CC7x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y3E[];
Class_Descriptor cd__ZN3ccc8CC7x11y3E = {  "_ZN3ccc8CC7x11y3E", // class name
  bases__ZN3ccc8CC7x11y3E, 2,
  &(vtc__ZN3ccc8CC7x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y4  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC7x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y43efgEv
  ~CC7x11y4(); // tgen
  CC7x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y4E[];
extern void _ZN3ccc8CC7x11y43abcEv();
extern void _ZN3ccc8CC7x11y43pqrEv();
extern void _ZN3ccc8CC7x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y43pqrEv,_ZThn4_N3ccc8CC7x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y43efgEv,_ZThn4_N3ccc8CC7x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y43pqrEv,_ZThn4_N3ccc8CC7x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y43efgEv,_ZThn4_N3ccc8CC7x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y4E[];
Class_Descriptor cd__ZN3ccc8CC7x11y4E = {  "_ZN3ccc8CC7x11y4E", // class name
  bases__ZN3ccc8CC7x11y4E, 2,
  &(vtc__ZN3ccc8CC7x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y5  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC7x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y53abcEv
  ~CC7x11y5(); // tgen
  CC7x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y5E[];
extern void _ZN3ccc8CC7x11y53abcEv();
extern void _ZN3ccc8CC7x11y53pqrEv();
extern void _ZN3ccc8CC7x11y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y53pqrEv,_ZThn4_N3ccc8CC7x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y53efgEv,_ZThn4_N3ccc8CC7x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y53pqrEv,_ZThn4_N3ccc8CC7x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y53efgEv,_ZThn4_N3ccc8CC7x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y5E[];
Class_Descriptor cd__ZN3ccc8CC7x11y5E = {  "_ZN3ccc8CC7x11y5E", // class name
  bases__ZN3ccc8CC7x11y5E, 2,
  &(vtc__ZN3ccc8CC7x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y6  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y63efgEv
  ~CC7x11y6(); // tgen
  CC7x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y6E[];
extern void _ZN3ccc8CC7x11y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y63efgEv,_ZThn4_N3ccc8CC7x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y63efgEv,_ZThn4_N3ccc8CC7x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y6E[];
Class_Descriptor cd__ZN3ccc8CC7x11y6E = {  "_ZN3ccc8CC7x11y6E", // class name
  bases__ZN3ccc8CC7x11y6E, 2,
  &(vtc__ZN3ccc8CC7x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y7  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y73pqrEv
  ~CC7x11y7(); // tgen
  CC7x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y7E[];
extern void _ZN3ccc8CC7x11y73abcEv();
extern void _ZN3ccc8CC7x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y73pqrEv,_ZThn4_N3ccc8CC7x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y73pqrEv,_ZThn4_N3ccc8CC7x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y7E[];
Class_Descriptor cd__ZN3ccc8CC7x11y7E = {  "_ZN3ccc8CC7x11y7E", // class name
  bases__ZN3ccc8CC7x11y7E, 2,
  &(vtc__ZN3ccc8CC7x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y8  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y83abcEv
  ~CC7x11y8(); // tgen
  CC7x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y8E[];
extern void _ZN3ccc8CC7x11y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y83efgEv,_ZThn4_N3ccc8CC7x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y83efgEv,_ZThn4_N3ccc8CC7x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y8E[];
Class_Descriptor cd__ZN3ccc8CC7x11y8E = {  "_ZN3ccc8CC7x11y8E", // class name
  bases__ZN3ccc8CC7x11y8E, 2,
  &(vtc__ZN3ccc8CC7x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y9  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y93pqrEv
  ~CC7x11y9(); // tgen
  CC7x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x11y93pqrEv();
extern void _ZN3ccc8CC7x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y93pqrEv,_ZThn4_N3ccc8CC7x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y93efgEv,_ZThn4_N3ccc8CC7x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y93pqrEv,_ZThn4_N3ccc8CC7x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x11y93efgEv,_ZThn4_N3ccc8CC7x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y9E[];
Class_Descriptor cd__ZN3ccc8CC7x11y9E = {  "_ZN3ccc8CC7x11y9E", // class name
  bases__ZN3ccc8CC7x11y9E, 2,
  &(vtc__ZN3ccc8CC7x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y10  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x11y103abcEv
  ~CC7x11y10(); // tgen
  CC7x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y10E[];
extern void _ZN3ccc9CC7x11y103abcEv();
extern void _ZN3ccc9CC7x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y103pqrEv,_ZThn4_N3ccc9CC7x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x11y103pqrEv,_ZThn4_N3ccc9CC7x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y10E[];
Class_Descriptor cd__ZN3ccc9CC7x11y10E = {  "_ZN3ccc9CC7x11y10E", // class name
  bases__ZN3ccc9CC7x11y10E, 2,
  &(vtc__ZN3ccc9CC7x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y11  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x11y113efgEv
  ~CC7x11y11(); // tgen
  CC7x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x11y113pqrEv();
extern void _ZN3ccc9CC7x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y113pqrEv,_ZThn4_N3ccc9CC7x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y113efgEv,_ZThn4_N3ccc9CC7x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x11y113pqrEv,_ZThn4_N3ccc9CC7x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x11y113efgEv,_ZThn4_N3ccc9CC7x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y11E[];
Class_Descriptor cd__ZN3ccc9CC7x11y11E = {  "_ZN3ccc9CC7x11y11E", // class name
  bases__ZN3ccc9CC7x11y11E, 2,
  &(vtc__ZN3ccc9CC7x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y12  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC7x11y123abcEv
  ~CC7x11y12(); // tgen
  CC7x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y12E[];
extern void _ZN3ccc9CC7x11y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y12E[];
Class_Descriptor cd__ZN3ccc9CC7x11y12E = {  "_ZN3ccc9CC7x11y12E", // class name
  bases__ZN3ccc9CC7x11y12E, 2,
  &(vtc__ZN3ccc9CC7x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y13  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC7x11y133efgEv
  ~CC7x11y13(); // tgen
  CC7x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y133efgEv,_ZThn4_N3ccc9CC7x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x11y133efgEv,_ZThn4_N3ccc9CC7x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y13E[];
Class_Descriptor cd__ZN3ccc9CC7x11y13E = {  "_ZN3ccc9CC7x11y13E", // class name
  bases__ZN3ccc9CC7x11y13E, 2,
  &(vtc__ZN3ccc9CC7x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y14  : ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y143pqrEv
  ~CC7x11y14(); // tgen
  CC7x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y143pqrEv,_ZThn4_N3ccc9CC7x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x11y143pqrEv,_ZThn4_N3ccc9CC7x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y14E[];
Class_Descriptor cd__ZN3ccc9CC7x11y14E = {  "_ZN3ccc9CC7x11y14E", // class name
  bases__ZN3ccc9CC7x11y14E, 2,
  &(vtc__ZN3ccc9CC7x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x11y15  : ::ccc::AA7 , ::ccc::BB11 {
  ~CC7x11y15(); // tgen
  CC7x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y15E[];
Class_Descriptor cd__ZN3ccc9CC7x11y15E = {  "_ZN3ccc9CC7x11y15E", // class name
  bases__ZN3ccc9CC7x11y15E, 2,
  &(vtc__ZN3ccc9CC7x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y0  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y03pqrEv
  ~CC7x12y0(); // tgen
  CC7x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y0E[];
extern void _ZN3ccc8CC7x12y03abcEv();
extern void _ZN3ccc8CC7x12y03pqrEv();
extern void _ZN3ccc8CC7x12y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y03abcEv,_ZThn4_N3ccc8CC7x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y03abcEv,_ZThn4_N3ccc8CC7x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y0E[];
Class_Descriptor cd__ZN3ccc8CC7x12y0E = {  "_ZN3ccc8CC7x12y0E", // class name
  bases__ZN3ccc8CC7x12y0E, 2,
  &(vtc__ZN3ccc8CC7x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y1  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x12y13efgEv
  ~CC7x12y1(); // tgen
  CC7x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y1E[];
extern void _ZN3ccc8CC7x12y13abcEv();
extern void _ZN3ccc8CC7x12y13pqrEv();
extern void _ZN3ccc8CC7x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y13abcEv,_ZThn4_N3ccc8CC7x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y13abcEv,_ZThn4_N3ccc8CC7x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y1E[];
Class_Descriptor cd__ZN3ccc8CC7x12y1E = {  "_ZN3ccc8CC7x12y1E", // class name
  bases__ZN3ccc8CC7x12y1E, 2,
  &(vtc__ZN3ccc8CC7x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y2  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y23pqrEv
  ~CC7x12y2(); // tgen
  CC7x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y2E[];
extern void _ZN3ccc8CC7x12y23abcEv();
extern void _ZN3ccc8CC7x12y23pqrEv();
extern void _ZN3ccc8CC7x12y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y23abcEv,_ZThn4_N3ccc8CC7x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y23abcEv,_ZThn4_N3ccc8CC7x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y2E[];
Class_Descriptor cd__ZN3ccc8CC7x12y2E = {  "_ZN3ccc8CC7x12y2E", // class name
  bases__ZN3ccc8CC7x12y2E, 2,
  &(vtc__ZN3ccc8CC7x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y3  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x12y33abcEv
  ~CC7x12y3(); // tgen
  CC7x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y3E[];
extern void _ZN3ccc8CC7x12y33abcEv();
extern void _ZN3ccc8CC7x12y33pqrEv();
extern void _ZN3ccc8CC7x12y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y33abcEv,_ZThn4_N3ccc8CC7x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y33abcEv,_ZThn4_N3ccc8CC7x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y3E[];
Class_Descriptor cd__ZN3ccc8CC7x12y3E = {  "_ZN3ccc8CC7x12y3E", // class name
  bases__ZN3ccc8CC7x12y3E, 2,
  &(vtc__ZN3ccc8CC7x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y4  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC7x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y43efgEv
  ~CC7x12y4(); // tgen
  CC7x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y4E[];
extern void _ZN3ccc8CC7x12y43abcEv();
extern void _ZN3ccc8CC7x12y43pqrEv();
extern void _ZN3ccc8CC7x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y43abcEv,_ZThn4_N3ccc8CC7x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y43abcEv,_ZThn4_N3ccc8CC7x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y4E[];
Class_Descriptor cd__ZN3ccc8CC7x12y4E = {  "_ZN3ccc8CC7x12y4E", // class name
  bases__ZN3ccc8CC7x12y4E, 2,
  &(vtc__ZN3ccc8CC7x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y5  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC7x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y53abcEv
  ~CC7x12y5(); // tgen
  CC7x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y5E[];
extern void _ZN3ccc8CC7x12y53abcEv();
extern void _ZN3ccc8CC7x12y53pqrEv();
extern void _ZN3ccc8CC7x12y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y53abcEv,_ZThn4_N3ccc8CC7x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y53abcEv,_ZThn4_N3ccc8CC7x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y5E[];
Class_Descriptor cd__ZN3ccc8CC7x12y5E = {  "_ZN3ccc8CC7x12y5E", // class name
  bases__ZN3ccc8CC7x12y5E, 2,
  &(vtc__ZN3ccc8CC7x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y6  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y63efgEv
  ~CC7x12y6(); // tgen
  CC7x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y6E[];
extern void _ZN3ccc8CC7x12y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y63abcEv,_ZThn4_N3ccc8CC7x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y63abcEv,_ZThn4_N3ccc8CC7x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y6E[];
Class_Descriptor cd__ZN3ccc8CC7x12y6E = {  "_ZN3ccc8CC7x12y6E", // class name
  bases__ZN3ccc8CC7x12y6E, 2,
  &(vtc__ZN3ccc8CC7x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y7  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y73pqrEv
  ~CC7x12y7(); // tgen
  CC7x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y7E[];
extern void _ZN3ccc8CC7x12y73abcEv();
extern void _ZN3ccc8CC7x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y73abcEv,_ZThn4_N3ccc8CC7x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y73abcEv,_ZThn4_N3ccc8CC7x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y7E[];
Class_Descriptor cd__ZN3ccc8CC7x12y7E = {  "_ZN3ccc8CC7x12y7E", // class name
  bases__ZN3ccc8CC7x12y7E, 2,
  &(vtc__ZN3ccc8CC7x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y8  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y83abcEv
  ~CC7x12y8(); // tgen
  CC7x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y8E[];
extern void _ZN3ccc8CC7x12y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y83abcEv,_ZThn4_N3ccc8CC7x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x12y83abcEv,_ZThn4_N3ccc8CC7x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y8E[];
Class_Descriptor cd__ZN3ccc8CC7x12y8E = {  "_ZN3ccc8CC7x12y8E", // class name
  bases__ZN3ccc8CC7x12y8E, 2,
  &(vtc__ZN3ccc8CC7x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y9  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y93pqrEv
  ~CC7x12y9(); // tgen
  CC7x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x12y93pqrEv();
extern void _ZN3ccc8CC7x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y9E[];
Class_Descriptor cd__ZN3ccc8CC7x12y9E = {  "_ZN3ccc8CC7x12y9E", // class name
  bases__ZN3ccc8CC7x12y9E, 2,
  &(vtc__ZN3ccc8CC7x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y10  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x12y103abcEv
  ~CC7x12y10(); // tgen
  CC7x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y10E[];
extern void _ZN3ccc9CC7x12y103abcEv();
extern void _ZN3ccc9CC7x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y103abcEv,_ZThn4_N3ccc9CC7x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x12y103abcEv,_ZThn4_N3ccc9CC7x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y10E[];
Class_Descriptor cd__ZN3ccc9CC7x12y10E = {  "_ZN3ccc9CC7x12y10E", // class name
  bases__ZN3ccc9CC7x12y10E, 2,
  &(vtc__ZN3ccc9CC7x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y11  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x12y113efgEv
  ~CC7x12y11(); // tgen
  CC7x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x12y113pqrEv();
extern void _ZN3ccc9CC7x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y11E[];
Class_Descriptor cd__ZN3ccc9CC7x12y11E = {  "_ZN3ccc9CC7x12y11E", // class name
  bases__ZN3ccc9CC7x12y11E, 2,
  &(vtc__ZN3ccc9CC7x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y12  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC7x12y123abcEv
  ~CC7x12y12(); // tgen
  CC7x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y12E[];
extern void _ZN3ccc9CC7x12y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y123abcEv,_ZThn4_N3ccc9CC7x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x12y123abcEv,_ZThn4_N3ccc9CC7x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y12E[];
Class_Descriptor cd__ZN3ccc9CC7x12y12E = {  "_ZN3ccc9CC7x12y12E", // class name
  bases__ZN3ccc9CC7x12y12E, 2,
  &(vtc__ZN3ccc9CC7x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y13  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC7x12y133efgEv
  ~CC7x12y13(); // tgen
  CC7x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y13E[];
Class_Descriptor cd__ZN3ccc9CC7x12y13E = {  "_ZN3ccc9CC7x12y13E", // class name
  bases__ZN3ccc9CC7x12y13E, 2,
  &(vtc__ZN3ccc9CC7x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y14  : ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y143pqrEv
  ~CC7x12y14(); // tgen
  CC7x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y14E[];
Class_Descriptor cd__ZN3ccc9CC7x12y14E = {  "_ZN3ccc9CC7x12y14E", // class name
  bases__ZN3ccc9CC7x12y14E, 2,
  &(vtc__ZN3ccc9CC7x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x12y15  : ::ccc::AA7 , ::ccc::BB12 {
  ~CC7x12y15(); // tgen
  CC7x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y15E[];
Class_Descriptor cd__ZN3ccc9CC7x12y15E = {  "_ZN3ccc9CC7x12y15E", // class name
  bases__ZN3ccc9CC7x12y15E, 2,
  &(vtc__ZN3ccc9CC7x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y0  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y03pqrEv
  ~CC7x13y0(); // tgen
  CC7x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y0E[];
extern void _ZN3ccc8CC7x13y03abcEv();
extern void _ZN3ccc8CC7x13y03pqrEv();
extern void _ZN3ccc8CC7x13y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y03efgEv,_ZThn4_N3ccc8CC7x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y03efgEv,_ZThn4_N3ccc8CC7x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y0E[];
Class_Descriptor cd__ZN3ccc8CC7x13y0E = {  "_ZN3ccc8CC7x13y0E", // class name
  bases__ZN3ccc8CC7x13y0E, 2,
  &(vtc__ZN3ccc8CC7x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y1  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x13y13efgEv
  ~CC7x13y1(); // tgen
  CC7x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y1E[];
extern void _ZN3ccc8CC7x13y13abcEv();
extern void _ZN3ccc8CC7x13y13pqrEv();
extern void _ZN3ccc8CC7x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y13efgEv,_ZThn4_N3ccc8CC7x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y13efgEv,_ZThn4_N3ccc8CC7x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y1E[];
Class_Descriptor cd__ZN3ccc8CC7x13y1E = {  "_ZN3ccc8CC7x13y1E", // class name
  bases__ZN3ccc8CC7x13y1E, 2,
  &(vtc__ZN3ccc8CC7x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y2  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y23pqrEv
  ~CC7x13y2(); // tgen
  CC7x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y2E[];
extern void _ZN3ccc8CC7x13y23abcEv();
extern void _ZN3ccc8CC7x13y23pqrEv();
extern void _ZN3ccc8CC7x13y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y23efgEv,_ZThn4_N3ccc8CC7x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y23efgEv,_ZThn4_N3ccc8CC7x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y2E[];
Class_Descriptor cd__ZN3ccc8CC7x13y2E = {  "_ZN3ccc8CC7x13y2E", // class name
  bases__ZN3ccc8CC7x13y2E, 2,
  &(vtc__ZN3ccc8CC7x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y3  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x13y33abcEv
  ~CC7x13y3(); // tgen
  CC7x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y3E[];
extern void _ZN3ccc8CC7x13y33abcEv();
extern void _ZN3ccc8CC7x13y33pqrEv();
extern void _ZN3ccc8CC7x13y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y33efgEv,_ZThn4_N3ccc8CC7x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y33efgEv,_ZThn4_N3ccc8CC7x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y3E[];
Class_Descriptor cd__ZN3ccc8CC7x13y3E = {  "_ZN3ccc8CC7x13y3E", // class name
  bases__ZN3ccc8CC7x13y3E, 2,
  &(vtc__ZN3ccc8CC7x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y4  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC7x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y43efgEv
  ~CC7x13y4(); // tgen
  CC7x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y4E[];
extern void _ZN3ccc8CC7x13y43abcEv();
extern void _ZN3ccc8CC7x13y43pqrEv();
extern void _ZN3ccc8CC7x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y43efgEv,_ZThn4_N3ccc8CC7x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y43efgEv,_ZThn4_N3ccc8CC7x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y4E[];
Class_Descriptor cd__ZN3ccc8CC7x13y4E = {  "_ZN3ccc8CC7x13y4E", // class name
  bases__ZN3ccc8CC7x13y4E, 2,
  &(vtc__ZN3ccc8CC7x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y5  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC7x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y53abcEv
  ~CC7x13y5(); // tgen
  CC7x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y5E[];
extern void _ZN3ccc8CC7x13y53abcEv();
extern void _ZN3ccc8CC7x13y53pqrEv();
extern void _ZN3ccc8CC7x13y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y53efgEv,_ZThn4_N3ccc8CC7x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y53efgEv,_ZThn4_N3ccc8CC7x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y5E[];
Class_Descriptor cd__ZN3ccc8CC7x13y5E = {  "_ZN3ccc8CC7x13y5E", // class name
  bases__ZN3ccc8CC7x13y5E, 2,
  &(vtc__ZN3ccc8CC7x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y6  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y63efgEv
  ~CC7x13y6(); // tgen
  CC7x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y6E[];
extern void _ZN3ccc8CC7x13y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y63efgEv,_ZThn4_N3ccc8CC7x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y63efgEv,_ZThn4_N3ccc8CC7x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y6E[];
Class_Descriptor cd__ZN3ccc8CC7x13y6E = {  "_ZN3ccc8CC7x13y6E", // class name
  bases__ZN3ccc8CC7x13y6E, 2,
  &(vtc__ZN3ccc8CC7x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y7  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y73pqrEv
  ~CC7x13y7(); // tgen
  CC7x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y7E[];
extern void _ZN3ccc8CC7x13y73abcEv();
extern void _ZN3ccc8CC7x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y7E[];
Class_Descriptor cd__ZN3ccc8CC7x13y7E = {  "_ZN3ccc8CC7x13y7E", // class name
  bases__ZN3ccc8CC7x13y7E, 2,
  &(vtc__ZN3ccc8CC7x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y8  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y83abcEv
  ~CC7x13y8(); // tgen
  CC7x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y8E[];
extern void _ZN3ccc8CC7x13y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y83efgEv,_ZThn4_N3ccc8CC7x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y83efgEv,_ZThn4_N3ccc8CC7x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y8E[];
Class_Descriptor cd__ZN3ccc8CC7x13y8E = {  "_ZN3ccc8CC7x13y8E", // class name
  bases__ZN3ccc8CC7x13y8E, 2,
  &(vtc__ZN3ccc8CC7x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y9  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y93pqrEv
  ~CC7x13y9(); // tgen
  CC7x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x13y93pqrEv();
extern void _ZN3ccc8CC7x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y93efgEv,_ZThn4_N3ccc8CC7x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x13y93efgEv,_ZThn4_N3ccc8CC7x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y9E[];
Class_Descriptor cd__ZN3ccc8CC7x13y9E = {  "_ZN3ccc8CC7x13y9E", // class name
  bases__ZN3ccc8CC7x13y9E, 2,
  &(vtc__ZN3ccc8CC7x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y10  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x13y103abcEv
  ~CC7x13y10(); // tgen
  CC7x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y10E[];
extern void _ZN3ccc9CC7x13y103abcEv();
extern void _ZN3ccc9CC7x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y10E[];
Class_Descriptor cd__ZN3ccc9CC7x13y10E = {  "_ZN3ccc9CC7x13y10E", // class name
  bases__ZN3ccc9CC7x13y10E, 2,
  &(vtc__ZN3ccc9CC7x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y11  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x13y113efgEv
  ~CC7x13y11(); // tgen
  CC7x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x13y113pqrEv();
extern void _ZN3ccc9CC7x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y113efgEv,_ZThn4_N3ccc9CC7x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x13y113efgEv,_ZThn4_N3ccc9CC7x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y11E[];
Class_Descriptor cd__ZN3ccc9CC7x13y11E = {  "_ZN3ccc9CC7x13y11E", // class name
  bases__ZN3ccc9CC7x13y11E, 2,
  &(vtc__ZN3ccc9CC7x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y12  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC7x13y123abcEv
  ~CC7x13y12(); // tgen
  CC7x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y12E[];
extern void _ZN3ccc9CC7x13y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y12E[];
Class_Descriptor cd__ZN3ccc9CC7x13y12E = {  "_ZN3ccc9CC7x13y12E", // class name
  bases__ZN3ccc9CC7x13y12E, 2,
  &(vtc__ZN3ccc9CC7x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y13  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC7x13y133efgEv
  ~CC7x13y13(); // tgen
  CC7x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y133efgEv,_ZThn4_N3ccc9CC7x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x13y133efgEv,_ZThn4_N3ccc9CC7x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y13E[];
Class_Descriptor cd__ZN3ccc9CC7x13y13E = {  "_ZN3ccc9CC7x13y13E", // class name
  bases__ZN3ccc9CC7x13y13E, 2,
  &(vtc__ZN3ccc9CC7x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y14  : ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y143pqrEv
  ~CC7x13y14(); // tgen
  CC7x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y14E[];
Class_Descriptor cd__ZN3ccc9CC7x13y14E = {  "_ZN3ccc9CC7x13y14E", // class name
  bases__ZN3ccc9CC7x13y14E, 2,
  &(vtc__ZN3ccc9CC7x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x13y15  : ::ccc::AA7 , ::ccc::BB13 {
  ~CC7x13y15(); // tgen
  CC7x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y15E[];
Class_Descriptor cd__ZN3ccc9CC7x13y15E = {  "_ZN3ccc9CC7x13y15E", // class name
  bases__ZN3ccc9CC7x13y15E, 2,
  &(vtc__ZN3ccc9CC7x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y0  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y03pqrEv
  ~CC7x14y0(); // tgen
  CC7x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y0E[];
extern void _ZN3ccc8CC7x14y03abcEv();
extern void _ZN3ccc8CC7x14y03pqrEv();
extern void _ZN3ccc8CC7x14y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y03pqrEv,_ZThn4_N3ccc8CC7x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y03pqrEv,_ZThn4_N3ccc8CC7x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y0E[];
Class_Descriptor cd__ZN3ccc8CC7x14y0E = {  "_ZN3ccc8CC7x14y0E", // class name
  bases__ZN3ccc8CC7x14y0E, 2,
  &(vtc__ZN3ccc8CC7x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y1  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x14y13efgEv
  ~CC7x14y1(); // tgen
  CC7x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y1E[];
extern void _ZN3ccc8CC7x14y13abcEv();
extern void _ZN3ccc8CC7x14y13pqrEv();
extern void _ZN3ccc8CC7x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y13pqrEv,_ZThn4_N3ccc8CC7x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y13pqrEv,_ZThn4_N3ccc8CC7x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y1E[];
Class_Descriptor cd__ZN3ccc8CC7x14y1E = {  "_ZN3ccc8CC7x14y1E", // class name
  bases__ZN3ccc8CC7x14y1E, 2,
  &(vtc__ZN3ccc8CC7x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y2  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y23pqrEv
  ~CC7x14y2(); // tgen
  CC7x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y2E[];
extern void _ZN3ccc8CC7x14y23abcEv();
extern void _ZN3ccc8CC7x14y23pqrEv();
extern void _ZN3ccc8CC7x14y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y23pqrEv,_ZThn4_N3ccc8CC7x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y23pqrEv,_ZThn4_N3ccc8CC7x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y2E[];
Class_Descriptor cd__ZN3ccc8CC7x14y2E = {  "_ZN3ccc8CC7x14y2E", // class name
  bases__ZN3ccc8CC7x14y2E, 2,
  &(vtc__ZN3ccc8CC7x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y3  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x14y33abcEv
  ~CC7x14y3(); // tgen
  CC7x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y3E[];
extern void _ZN3ccc8CC7x14y33abcEv();
extern void _ZN3ccc8CC7x14y33pqrEv();
extern void _ZN3ccc8CC7x14y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y33pqrEv,_ZThn4_N3ccc8CC7x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y33pqrEv,_ZThn4_N3ccc8CC7x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y3E[];
Class_Descriptor cd__ZN3ccc8CC7x14y3E = {  "_ZN3ccc8CC7x14y3E", // class name
  bases__ZN3ccc8CC7x14y3E, 2,
  &(vtc__ZN3ccc8CC7x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y4  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC7x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y43efgEv
  ~CC7x14y4(); // tgen
  CC7x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y4E[];
extern void _ZN3ccc8CC7x14y43abcEv();
extern void _ZN3ccc8CC7x14y43pqrEv();
extern void _ZN3ccc8CC7x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y43pqrEv,_ZThn4_N3ccc8CC7x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y43pqrEv,_ZThn4_N3ccc8CC7x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y4E[];
Class_Descriptor cd__ZN3ccc8CC7x14y4E = {  "_ZN3ccc8CC7x14y4E", // class name
  bases__ZN3ccc8CC7x14y4E, 2,
  &(vtc__ZN3ccc8CC7x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y5  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC7x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y53abcEv
  ~CC7x14y5(); // tgen
  CC7x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y5E[];
extern void _ZN3ccc8CC7x14y53abcEv();
extern void _ZN3ccc8CC7x14y53pqrEv();
extern void _ZN3ccc8CC7x14y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y53pqrEv,_ZThn4_N3ccc8CC7x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y53pqrEv,_ZThn4_N3ccc8CC7x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y5E[];
Class_Descriptor cd__ZN3ccc8CC7x14y5E = {  "_ZN3ccc8CC7x14y5E", // class name
  bases__ZN3ccc8CC7x14y5E, 2,
  &(vtc__ZN3ccc8CC7x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y6  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y63efgEv
  ~CC7x14y6(); // tgen
  CC7x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y6E[];
extern void _ZN3ccc8CC7x14y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y6E[];
Class_Descriptor cd__ZN3ccc8CC7x14y6E = {  "_ZN3ccc8CC7x14y6E", // class name
  bases__ZN3ccc8CC7x14y6E, 2,
  &(vtc__ZN3ccc8CC7x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y7  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y73pqrEv
  ~CC7x14y7(); // tgen
  CC7x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y7E[];
extern void _ZN3ccc8CC7x14y73abcEv();
extern void _ZN3ccc8CC7x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y73pqrEv,_ZThn4_N3ccc8CC7x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y73pqrEv,_ZThn4_N3ccc8CC7x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y7E[];
Class_Descriptor cd__ZN3ccc8CC7x14y7E = {  "_ZN3ccc8CC7x14y7E", // class name
  bases__ZN3ccc8CC7x14y7E, 2,
  &(vtc__ZN3ccc8CC7x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y8  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y83abcEv
  ~CC7x14y8(); // tgen
  CC7x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y8E[];
extern void _ZN3ccc8CC7x14y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y8E[];
Class_Descriptor cd__ZN3ccc8CC7x14y8E = {  "_ZN3ccc8CC7x14y8E", // class name
  bases__ZN3ccc8CC7x14y8E, 2,
  &(vtc__ZN3ccc8CC7x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y9  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y93pqrEv
  ~CC7x14y9(); // tgen
  CC7x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC7x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x14y93pqrEv();
extern void _ZN3ccc8CC7x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y93pqrEv,_ZThn4_N3ccc8CC7x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC7x14y93pqrEv,_ZThn4_N3ccc8CC7x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y9E[];
Class_Descriptor cd__ZN3ccc8CC7x14y9E = {  "_ZN3ccc8CC7x14y9E", // class name
  bases__ZN3ccc8CC7x14y9E, 2,
  &(vtc__ZN3ccc8CC7x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y10  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x14y103abcEv
  ~CC7x14y10(); // tgen
  CC7x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y10E[];
extern void _ZN3ccc9CC7x14y103abcEv();
extern void _ZN3ccc9CC7x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y103pqrEv,_ZThn4_N3ccc9CC7x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x14y103pqrEv,_ZThn4_N3ccc9CC7x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y10E[];
Class_Descriptor cd__ZN3ccc9CC7x14y10E = {  "_ZN3ccc9CC7x14y10E", // class name
  bases__ZN3ccc9CC7x14y10E, 2,
  &(vtc__ZN3ccc9CC7x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y11  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x14y113efgEv
  ~CC7x14y11(); // tgen
  CC7x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x14y113pqrEv();
extern void _ZN3ccc9CC7x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y113pqrEv,_ZThn4_N3ccc9CC7x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x14y113pqrEv,_ZThn4_N3ccc9CC7x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y11E[];
Class_Descriptor cd__ZN3ccc9CC7x14y11E = {  "_ZN3ccc9CC7x14y11E", // class name
  bases__ZN3ccc9CC7x14y11E, 2,
  &(vtc__ZN3ccc9CC7x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y12  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC7x14y123abcEv
  ~CC7x14y12(); // tgen
  CC7x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y12E[];
extern void _ZN3ccc9CC7x14y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y12E[];
Class_Descriptor cd__ZN3ccc9CC7x14y12E = {  "_ZN3ccc9CC7x14y12E", // class name
  bases__ZN3ccc9CC7x14y12E, 2,
  &(vtc__ZN3ccc9CC7x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y13  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC7x14y133efgEv
  ~CC7x14y13(); // tgen
  CC7x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y13E[];
Class_Descriptor cd__ZN3ccc9CC7x14y13E = {  "_ZN3ccc9CC7x14y13E", // class name
  bases__ZN3ccc9CC7x14y13E, 2,
  &(vtc__ZN3ccc9CC7x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y14  : ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y143pqrEv
  ~CC7x14y14(); // tgen
  CC7x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y143pqrEv,_ZThn4_N3ccc9CC7x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC7x14y143pqrEv,_ZThn4_N3ccc9CC7x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y14E[];
Class_Descriptor cd__ZN3ccc9CC7x14y14E = {  "_ZN3ccc9CC7x14y14E", // class name
  bases__ZN3ccc9CC7x14y14E, 2,
  &(vtc__ZN3ccc9CC7x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x14y15  : ::ccc::AA7 , ::ccc::BB14 {
  ~CC7x14y15(); // tgen
  CC7x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC7x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y15E[];
Class_Descriptor cd__ZN3ccc9CC7x14y15E = {  "_ZN3ccc9CC7x14y15E", // class name
  bases__ZN3ccc9CC7x14y15E, 2,
  &(vtc__ZN3ccc9CC7x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y0  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y03pqrEv
  ~CC7x15y0(); // tgen
  CC7x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y0E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y0E[];
Class_Descriptor cd__ZN3ccc8CC7x15y0E = {  "_ZN3ccc8CC7x15y0E", // class name
  bases__ZN3ccc8CC7x15y0E, 2,
  &(vtc__ZN3ccc8CC7x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y1  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x15y13efgEv
  ~CC7x15y1(); // tgen
  CC7x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y1E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y1E[];
Class_Descriptor cd__ZN3ccc8CC7x15y1E = {  "_ZN3ccc8CC7x15y1E", // class name
  bases__ZN3ccc8CC7x15y1E, 2,
  &(vtc__ZN3ccc8CC7x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y2  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y23pqrEv
  ~CC7x15y2(); // tgen
  CC7x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y2E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y2E[];
Class_Descriptor cd__ZN3ccc8CC7x15y2E = {  "_ZN3ccc8CC7x15y2E", // class name
  bases__ZN3ccc8CC7x15y2E, 2,
  &(vtc__ZN3ccc8CC7x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y3  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x15y33abcEv
  ~CC7x15y3(); // tgen
  CC7x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y3E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y3E[];
Class_Descriptor cd__ZN3ccc8CC7x15y3E = {  "_ZN3ccc8CC7x15y3E", // class name
  bases__ZN3ccc8CC7x15y3E, 2,
  &(vtc__ZN3ccc8CC7x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y4  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC7x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y43efgEv
  ~CC7x15y4(); // tgen
  CC7x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y4E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y4E[];
Class_Descriptor cd__ZN3ccc8CC7x15y4E = {  "_ZN3ccc8CC7x15y4E", // class name
  bases__ZN3ccc8CC7x15y4E, 2,
  &(vtc__ZN3ccc8CC7x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y5  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC7x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y53abcEv
  ~CC7x15y5(); // tgen
  CC7x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y5E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y5E[];
Class_Descriptor cd__ZN3ccc8CC7x15y5E = {  "_ZN3ccc8CC7x15y5E", // class name
  bases__ZN3ccc8CC7x15y5E, 2,
  &(vtc__ZN3ccc8CC7x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y6  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y63efgEv
  ~CC7x15y6(); // tgen
  CC7x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y6E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y6E[];
Class_Descriptor cd__ZN3ccc8CC7x15y6E = {  "_ZN3ccc8CC7x15y6E", // class name
  bases__ZN3ccc8CC7x15y6E, 2,
  &(vtc__ZN3ccc8CC7x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y7  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y73pqrEv
  ~CC7x15y7(); // tgen
  CC7x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y7E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y7E[];
Class_Descriptor cd__ZN3ccc8CC7x15y7E = {  "_ZN3ccc8CC7x15y7E", // class name
  bases__ZN3ccc8CC7x15y7E, 2,
  &(vtc__ZN3ccc8CC7x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y8  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y83abcEv
  ~CC7x15y8(); // tgen
  CC7x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y8E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y8E[];
Class_Descriptor cd__ZN3ccc8CC7x15y8E = {  "_ZN3ccc8CC7x15y8E", // class name
  bases__ZN3ccc8CC7x15y8E, 2,
  &(vtc__ZN3ccc8CC7x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y9  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y93pqrEv
  ~CC7x15y9(); // tgen
  CC7x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y9E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y9E[];
Class_Descriptor cd__ZN3ccc8CC7x15y9E = {  "_ZN3ccc8CC7x15y9E", // class name
  bases__ZN3ccc8CC7x15y9E, 2,
  &(vtc__ZN3ccc8CC7x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y10  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x15y103abcEv
  ~CC7x15y10(); // tgen
  CC7x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y10E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y10E[];
Class_Descriptor cd__ZN3ccc9CC7x15y10E = {  "_ZN3ccc9CC7x15y10E", // class name
  bases__ZN3ccc9CC7x15y10E, 2,
  &(vtc__ZN3ccc9CC7x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y11  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x15y113efgEv
  ~CC7x15y11(); // tgen
  CC7x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y11E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y11E[];
Class_Descriptor cd__ZN3ccc9CC7x15y11E = {  "_ZN3ccc9CC7x15y11E", // class name
  bases__ZN3ccc9CC7x15y11E, 2,
  &(vtc__ZN3ccc9CC7x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y12  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC7x15y123abcEv
  ~CC7x15y12(); // tgen
  CC7x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y12E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y12E[];
Class_Descriptor cd__ZN3ccc9CC7x15y12E = {  "_ZN3ccc9CC7x15y12E", // class name
  bases__ZN3ccc9CC7x15y12E, 2,
  &(vtc__ZN3ccc9CC7x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y13  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC7x15y133efgEv
  ~CC7x15y13(); // tgen
  CC7x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y13E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y13E[];
Class_Descriptor cd__ZN3ccc9CC7x15y13E = {  "_ZN3ccc9CC7x15y13E", // class name
  bases__ZN3ccc9CC7x15y13E, 2,
  &(vtc__ZN3ccc9CC7x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y14  : ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y143pqrEv
  ~CC7x15y14(); // tgen
  CC7x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y14E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y14E[];
Class_Descriptor cd__ZN3ccc9CC7x15y14E = {  "_ZN3ccc9CC7x15y14E", // class name
  bases__ZN3ccc9CC7x15y14E, 2,
  &(vtc__ZN3ccc9CC7x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y15  : ::ccc::AA7 , ::ccc::BB15 {
  ~CC7x15y15(); // tgen
  CC7x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y15E) C1{ BC2{ 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
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y15E[];
Class_Descriptor cd__ZN3ccc9CC7x15y15E = {  "_ZN3ccc9CC7x15y15E", // class name
  bases__ZN3ccc9CC7x15y15E, 2,
  &(vtc__ZN3ccc9CC7x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y0  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y03pqrEv
  ~CC8x0y0(); // tgen
  CC8x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y0E[];
extern void _ZN3ccc7CC8x0y03efgEv();
extern void _ZN3ccc7CC8x0y03abcEv();
extern void _ZN3ccc7CC8x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y03abcEv,_ZThn4_N3ccc7CC8x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y03efgEv,_ZThn4_N3ccc7CC8x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y03pqrEv,_ZThn4_N3ccc7CC8x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y03abcEv,_ZThn4_N3ccc7CC8x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y03efgEv,_ZThn4_N3ccc7CC8x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y03pqrEv,_ZThn4_N3ccc7CC8x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y0E[];
Class_Descriptor cd__ZN3ccc7CC8x0y0E = {  "_ZN3ccc7CC8x0y0E", // class name
  bases__ZN3ccc7CC8x0y0E, 2,
  &(vtc__ZN3ccc7CC8x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y1  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x0y13efgEv
  ~CC8x0y1(); // tgen
  CC8x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y1E[];
extern void _ZN3ccc7CC8x0y13efgEv();
extern void _ZN3ccc7CC8x0y13abcEv();
extern void _ZN3ccc7CC8x0y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y13abcEv,_ZThn4_N3ccc7CC8x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y13efgEv,_ZThn4_N3ccc7CC8x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y13pqrEv,_ZThn4_N3ccc7CC8x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y13abcEv,_ZThn4_N3ccc7CC8x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y13efgEv,_ZThn4_N3ccc7CC8x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y13pqrEv,_ZThn4_N3ccc7CC8x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y1E[];
Class_Descriptor cd__ZN3ccc7CC8x0y1E = {  "_ZN3ccc7CC8x0y1E", // class name
  bases__ZN3ccc7CC8x0y1E, 2,
  &(vtc__ZN3ccc7CC8x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y2  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y23pqrEv
  ~CC8x0y2(); // tgen
  CC8x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y2E[];
extern void _ZN3ccc7CC8x0y23efgEv();
extern void _ZN3ccc7CC8x0y23abcEv();
extern void _ZN3ccc7CC8x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y23abcEv,_ZThn4_N3ccc7CC8x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y23efgEv,_ZThn4_N3ccc7CC8x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y23pqrEv,_ZThn4_N3ccc7CC8x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y23abcEv,_ZThn4_N3ccc7CC8x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y23efgEv,_ZThn4_N3ccc7CC8x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y23pqrEv,_ZThn4_N3ccc7CC8x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y2E[];
Class_Descriptor cd__ZN3ccc7CC8x0y2E = {  "_ZN3ccc7CC8x0y2E", // class name
  bases__ZN3ccc7CC8x0y2E, 2,
  &(vtc__ZN3ccc7CC8x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y3  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x0y33abcEv
  ~CC8x0y3(); // tgen
  CC8x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y3E[];
extern void _ZN3ccc7CC8x0y33efgEv();
extern void _ZN3ccc7CC8x0y33abcEv();
extern void _ZN3ccc7CC8x0y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y33abcEv,_ZThn4_N3ccc7CC8x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y33efgEv,_ZThn4_N3ccc7CC8x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y33pqrEv,_ZThn4_N3ccc7CC8x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y33abcEv,_ZThn4_N3ccc7CC8x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y33efgEv,_ZThn4_N3ccc7CC8x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y33pqrEv,_ZThn4_N3ccc7CC8x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y3E[];
Class_Descriptor cd__ZN3ccc7CC8x0y3E = {  "_ZN3ccc7CC8x0y3E", // class name
  bases__ZN3ccc7CC8x0y3E, 2,
  &(vtc__ZN3ccc7CC8x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y4  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC8x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y43efgEv
  ~CC8x0y4(); // tgen
  CC8x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y4E[];
extern void _ZN3ccc7CC8x0y43efgEv();
extern void _ZN3ccc7CC8x0y43abcEv();
extern void _ZN3ccc7CC8x0y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y43abcEv,_ZThn4_N3ccc7CC8x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y43efgEv,_ZThn4_N3ccc7CC8x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y43pqrEv,_ZThn4_N3ccc7CC8x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y43abcEv,_ZThn4_N3ccc7CC8x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y43efgEv,_ZThn4_N3ccc7CC8x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y43pqrEv,_ZThn4_N3ccc7CC8x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y4E[];
Class_Descriptor cd__ZN3ccc7CC8x0y4E = {  "_ZN3ccc7CC8x0y4E", // class name
  bases__ZN3ccc7CC8x0y4E, 2,
  &(vtc__ZN3ccc7CC8x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y5  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC8x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y53abcEv
  ~CC8x0y5(); // tgen
  CC8x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y5E[];
extern void _ZN3ccc7CC8x0y53efgEv();
extern void _ZN3ccc7CC8x0y53abcEv();
extern void _ZN3ccc7CC8x0y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y53abcEv,_ZThn4_N3ccc7CC8x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y53efgEv,_ZThn4_N3ccc7CC8x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y53pqrEv,_ZThn4_N3ccc7CC8x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y53abcEv,_ZThn4_N3ccc7CC8x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y53efgEv,_ZThn4_N3ccc7CC8x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y53pqrEv,_ZThn4_N3ccc7CC8x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y5E[];
Class_Descriptor cd__ZN3ccc7CC8x0y5E = {  "_ZN3ccc7CC8x0y5E", // class name
  bases__ZN3ccc7CC8x0y5E, 2,
  &(vtc__ZN3ccc7CC8x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y6  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y63efgEv
  ~CC8x0y6(); // tgen
  CC8x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y6E[];
extern void _ZN3ccc7CC8x0y63efgEv();
extern void _ZN3ccc7CC8x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y63abcEv,_ZThn4_N3ccc7CC8x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y63efgEv,_ZThn4_N3ccc7CC8x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y63abcEv,_ZThn4_N3ccc7CC8x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y63efgEv,_ZThn4_N3ccc7CC8x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y6E[];
Class_Descriptor cd__ZN3ccc7CC8x0y6E = {  "_ZN3ccc7CC8x0y6E", // class name
  bases__ZN3ccc7CC8x0y6E, 2,
  &(vtc__ZN3ccc7CC8x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y7  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y73pqrEv
  ~CC8x0y7(); // tgen
  CC8x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x0y73abcEv();
extern void _ZN3ccc7CC8x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y73abcEv,_ZThn4_N3ccc7CC8x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y73pqrEv,_ZThn4_N3ccc7CC8x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y73abcEv,_ZThn4_N3ccc7CC8x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y73pqrEv,_ZThn4_N3ccc7CC8x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y7E[];
Class_Descriptor cd__ZN3ccc7CC8x0y7E = {  "_ZN3ccc7CC8x0y7E", // class name
  bases__ZN3ccc7CC8x0y7E, 2,
  &(vtc__ZN3ccc7CC8x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y8  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y83abcEv
  ~CC8x0y8(); // tgen
  CC8x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y8E[];
extern void _ZN3ccc7CC8x0y83efgEv();
extern void _ZN3ccc7CC8x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y83abcEv,_ZThn4_N3ccc7CC8x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y83efgEv,_ZThn4_N3ccc7CC8x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y83abcEv,_ZThn4_N3ccc7CC8x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y83efgEv,_ZThn4_N3ccc7CC8x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y8E[];
Class_Descriptor cd__ZN3ccc7CC8x0y8E = {  "_ZN3ccc7CC8x0y8E", // class name
  bases__ZN3ccc7CC8x0y8E, 2,
  &(vtc__ZN3ccc7CC8x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y9  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y93pqrEv
  ~CC8x0y9(); // tgen
  CC8x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y9E[];
extern void _ZN3ccc7CC8x0y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y93efgEv,_ZThn4_N3ccc7CC8x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y93pqrEv,_ZThn4_N3ccc7CC8x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y93efgEv,_ZThn4_N3ccc7CC8x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x0y93pqrEv,_ZThn4_N3ccc7CC8x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y9E[];
Class_Descriptor cd__ZN3ccc7CC8x0y9E = {  "_ZN3ccc7CC8x0y9E", // class name
  bases__ZN3ccc7CC8x0y9E, 2,
  &(vtc__ZN3ccc7CC8x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y10  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x0y103abcEv
  ~CC8x0y10(); // tgen
  CC8x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x0y103abcEv();
extern void _ZN3ccc8CC8x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y103abcEv,_ZThn4_N3ccc8CC8x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y103pqrEv,_ZThn4_N3ccc8CC8x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y103abcEv,_ZThn4_N3ccc8CC8x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y103pqrEv,_ZThn4_N3ccc8CC8x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y10E[];
Class_Descriptor cd__ZN3ccc8CC8x0y10E = {  "_ZN3ccc8CC8x0y10E", // class name
  bases__ZN3ccc8CC8x0y10E, 2,
  &(vtc__ZN3ccc8CC8x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y11  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x0y113efgEv
  ~CC8x0y11(); // tgen
  CC8x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y11E[];
extern void _ZN3ccc8CC8x0y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y113efgEv,_ZThn4_N3ccc8CC8x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y113pqrEv,_ZThn4_N3ccc8CC8x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y113efgEv,_ZThn4_N3ccc8CC8x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y113pqrEv,_ZThn4_N3ccc8CC8x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y11E[];
Class_Descriptor cd__ZN3ccc8CC8x0y11E = {  "_ZN3ccc8CC8x0y11E", // class name
  bases__ZN3ccc8CC8x0y11E, 2,
  &(vtc__ZN3ccc8CC8x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y12  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC8x0y123abcEv
  ~CC8x0y12(); // tgen
  CC8x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y123abcEv,_ZThn4_N3ccc8CC8x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y123abcEv,_ZThn4_N3ccc8CC8x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y12E[];
Class_Descriptor cd__ZN3ccc8CC8x0y12E = {  "_ZN3ccc8CC8x0y12E", // class name
  bases__ZN3ccc8CC8x0y12E, 2,
  &(vtc__ZN3ccc8CC8x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y13  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC8x0y133efgEv
  ~CC8x0y13(); // tgen
  CC8x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y13E[];
extern void _ZN3ccc8CC8x0y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y133efgEv,_ZThn4_N3ccc8CC8x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y133efgEv,_ZThn4_N3ccc8CC8x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y13E[];
Class_Descriptor cd__ZN3ccc8CC8x0y13E = {  "_ZN3ccc8CC8x0y13E", // class name
  bases__ZN3ccc8CC8x0y13E, 2,
  &(vtc__ZN3ccc8CC8x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y14  : ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y143pqrEv
  ~CC8x0y14(); // tgen
  CC8x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y143pqrEv,_ZThn4_N3ccc8CC8x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x0y143pqrEv,_ZThn4_N3ccc8CC8x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y14E[];
Class_Descriptor cd__ZN3ccc8CC8x0y14E = {  "_ZN3ccc8CC8x0y14E", // class name
  bases__ZN3ccc8CC8x0y14E, 2,
  &(vtc__ZN3ccc8CC8x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y15  : ::ccc::AA8 , ::ccc::BB0 {
  ~CC8x0y15(); // tgen
  CC8x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y15E[];
Class_Descriptor cd__ZN3ccc8CC8x0y15E = {  "_ZN3ccc8CC8x0y15E", // class name
  bases__ZN3ccc8CC8x0y15E, 2,
  &(vtc__ZN3ccc8CC8x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y0  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y03pqrEv
  ~CC8x1y0(); // tgen
  CC8x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y0E[];
extern void _ZN3ccc7CC8x1y03efgEv();
extern void _ZN3ccc7CC8x1y03abcEv();
extern void _ZN3ccc7CC8x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y03abcEv,_ZThn4_N3ccc7CC8x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y03pqrEv,_ZThn4_N3ccc7CC8x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y03efgEv,_ZThn4_N3ccc7CC8x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y03abcEv,_ZThn4_N3ccc7CC8x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y03pqrEv,_ZThn4_N3ccc7CC8x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y03efgEv,_ZThn4_N3ccc7CC8x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y0E[];
Class_Descriptor cd__ZN3ccc7CC8x1y0E = {  "_ZN3ccc7CC8x1y0E", // class name
  bases__ZN3ccc7CC8x1y0E, 2,
  &(vtc__ZN3ccc7CC8x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y1  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x1y13efgEv
  ~CC8x1y1(); // tgen
  CC8x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y1E[];
extern void _ZN3ccc7CC8x1y13efgEv();
extern void _ZN3ccc7CC8x1y13abcEv();
extern void _ZN3ccc7CC8x1y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y13abcEv,_ZThn4_N3ccc7CC8x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y13pqrEv,_ZThn4_N3ccc7CC8x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y13efgEv,_ZThn4_N3ccc7CC8x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y13abcEv,_ZThn4_N3ccc7CC8x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y13pqrEv,_ZThn4_N3ccc7CC8x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y13efgEv,_ZThn4_N3ccc7CC8x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y1E[];
Class_Descriptor cd__ZN3ccc7CC8x1y1E = {  "_ZN3ccc7CC8x1y1E", // class name
  bases__ZN3ccc7CC8x1y1E, 2,
  &(vtc__ZN3ccc7CC8x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y2  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y23pqrEv
  ~CC8x1y2(); // tgen
  CC8x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y2E[];
extern void _ZN3ccc7CC8x1y23efgEv();
extern void _ZN3ccc7CC8x1y23abcEv();
extern void _ZN3ccc7CC8x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y23abcEv,_ZThn4_N3ccc7CC8x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y23pqrEv,_ZThn4_N3ccc7CC8x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y23efgEv,_ZThn4_N3ccc7CC8x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y23abcEv,_ZThn4_N3ccc7CC8x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y23pqrEv,_ZThn4_N3ccc7CC8x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y23efgEv,_ZThn4_N3ccc7CC8x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y2E[];
Class_Descriptor cd__ZN3ccc7CC8x1y2E = {  "_ZN3ccc7CC8x1y2E", // class name
  bases__ZN3ccc7CC8x1y2E, 2,
  &(vtc__ZN3ccc7CC8x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y3  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x1y33abcEv
  ~CC8x1y3(); // tgen
  CC8x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y3E[];
extern void _ZN3ccc7CC8x1y33efgEv();
extern void _ZN3ccc7CC8x1y33abcEv();
extern void _ZN3ccc7CC8x1y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y33abcEv,_ZThn4_N3ccc7CC8x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y33pqrEv,_ZThn4_N3ccc7CC8x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y33efgEv,_ZThn4_N3ccc7CC8x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y33abcEv,_ZThn4_N3ccc7CC8x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y33pqrEv,_ZThn4_N3ccc7CC8x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y33efgEv,_ZThn4_N3ccc7CC8x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y3E[];
Class_Descriptor cd__ZN3ccc7CC8x1y3E = {  "_ZN3ccc7CC8x1y3E", // class name
  bases__ZN3ccc7CC8x1y3E, 2,
  &(vtc__ZN3ccc7CC8x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y4  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC8x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y43efgEv
  ~CC8x1y4(); // tgen
  CC8x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y4E[];
extern void _ZN3ccc7CC8x1y43efgEv();
extern void _ZN3ccc7CC8x1y43abcEv();
extern void _ZN3ccc7CC8x1y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y43abcEv,_ZThn4_N3ccc7CC8x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y43pqrEv,_ZThn4_N3ccc7CC8x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y43efgEv,_ZThn4_N3ccc7CC8x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y43abcEv,_ZThn4_N3ccc7CC8x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y43pqrEv,_ZThn4_N3ccc7CC8x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y43efgEv,_ZThn4_N3ccc7CC8x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y4E[];
Class_Descriptor cd__ZN3ccc7CC8x1y4E = {  "_ZN3ccc7CC8x1y4E", // class name
  bases__ZN3ccc7CC8x1y4E, 2,
  &(vtc__ZN3ccc7CC8x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y5  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC8x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y53abcEv
  ~CC8x1y5(); // tgen
  CC8x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y5E[];
extern void _ZN3ccc7CC8x1y53efgEv();
extern void _ZN3ccc7CC8x1y53abcEv();
extern void _ZN3ccc7CC8x1y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y53abcEv,_ZThn4_N3ccc7CC8x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y53pqrEv,_ZThn4_N3ccc7CC8x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y53efgEv,_ZThn4_N3ccc7CC8x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y53abcEv,_ZThn4_N3ccc7CC8x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y53pqrEv,_ZThn4_N3ccc7CC8x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y53efgEv,_ZThn4_N3ccc7CC8x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y5E[];
Class_Descriptor cd__ZN3ccc7CC8x1y5E = {  "_ZN3ccc7CC8x1y5E", // class name
  bases__ZN3ccc7CC8x1y5E, 2,
  &(vtc__ZN3ccc7CC8x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y6  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y63efgEv
  ~CC8x1y6(); // tgen
  CC8x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y6E[];
extern void _ZN3ccc7CC8x1y63efgEv();
extern void _ZN3ccc7CC8x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y63abcEv,_ZThn4_N3ccc7CC8x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y63efgEv,_ZThn4_N3ccc7CC8x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y63abcEv,_ZThn4_N3ccc7CC8x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y63efgEv,_ZThn4_N3ccc7CC8x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y6E[];
Class_Descriptor cd__ZN3ccc7CC8x1y6E = {  "_ZN3ccc7CC8x1y6E", // class name
  bases__ZN3ccc7CC8x1y6E, 2,
  &(vtc__ZN3ccc7CC8x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y7  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y73pqrEv
  ~CC8x1y7(); // tgen
  CC8x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x1y73abcEv();
extern void _ZN3ccc7CC8x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y73abcEv,_ZThn4_N3ccc7CC8x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y73pqrEv,_ZThn4_N3ccc7CC8x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y73abcEv,_ZThn4_N3ccc7CC8x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y73pqrEv,_ZThn4_N3ccc7CC8x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y7E[];
Class_Descriptor cd__ZN3ccc7CC8x1y7E = {  "_ZN3ccc7CC8x1y7E", // class name
  bases__ZN3ccc7CC8x1y7E, 2,
  &(vtc__ZN3ccc7CC8x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y8  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y83abcEv
  ~CC8x1y8(); // tgen
  CC8x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y8E[];
extern void _ZN3ccc7CC8x1y83efgEv();
extern void _ZN3ccc7CC8x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y83abcEv,_ZThn4_N3ccc7CC8x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y83efgEv,_ZThn4_N3ccc7CC8x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y83abcEv,_ZThn4_N3ccc7CC8x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y83efgEv,_ZThn4_N3ccc7CC8x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y8E[];
Class_Descriptor cd__ZN3ccc7CC8x1y8E = {  "_ZN3ccc7CC8x1y8E", // class name
  bases__ZN3ccc7CC8x1y8E, 2,
  &(vtc__ZN3ccc7CC8x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y9  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y93pqrEv
  ~CC8x1y9(); // tgen
  CC8x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y9E[];
extern void _ZN3ccc7CC8x1y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y93pqrEv,_ZThn4_N3ccc7CC8x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y93efgEv,_ZThn4_N3ccc7CC8x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y93pqrEv,_ZThn4_N3ccc7CC8x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x1y93efgEv,_ZThn4_N3ccc7CC8x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y9E[];
Class_Descriptor cd__ZN3ccc7CC8x1y9E = {  "_ZN3ccc7CC8x1y9E", // class name
  bases__ZN3ccc7CC8x1y9E, 2,
  &(vtc__ZN3ccc7CC8x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y10  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x1y103abcEv
  ~CC8x1y10(); // tgen
  CC8x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x1y103abcEv();
extern void _ZN3ccc8CC8x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y103abcEv,_ZThn4_N3ccc8CC8x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y103pqrEv,_ZThn4_N3ccc8CC8x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y103abcEv,_ZThn4_N3ccc8CC8x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y103pqrEv,_ZThn4_N3ccc8CC8x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y10E[];
Class_Descriptor cd__ZN3ccc8CC8x1y10E = {  "_ZN3ccc8CC8x1y10E", // class name
  bases__ZN3ccc8CC8x1y10E, 2,
  &(vtc__ZN3ccc8CC8x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y11  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x1y113efgEv
  ~CC8x1y11(); // tgen
  CC8x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y11E[];
extern void _ZN3ccc8CC8x1y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y113pqrEv,_ZThn4_N3ccc8CC8x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y113efgEv,_ZThn4_N3ccc8CC8x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y113pqrEv,_ZThn4_N3ccc8CC8x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y113efgEv,_ZThn4_N3ccc8CC8x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y11E[];
Class_Descriptor cd__ZN3ccc8CC8x1y11E = {  "_ZN3ccc8CC8x1y11E", // class name
  bases__ZN3ccc8CC8x1y11E, 2,
  &(vtc__ZN3ccc8CC8x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y12  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC8x1y123abcEv
  ~CC8x1y12(); // tgen
  CC8x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y123abcEv,_ZThn4_N3ccc8CC8x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y123abcEv,_ZThn4_N3ccc8CC8x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y12E[];
Class_Descriptor cd__ZN3ccc8CC8x1y12E = {  "_ZN3ccc8CC8x1y12E", // class name
  bases__ZN3ccc8CC8x1y12E, 2,
  &(vtc__ZN3ccc8CC8x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y13  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC8x1y133efgEv
  ~CC8x1y13(); // tgen
  CC8x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y13E[];
extern void _ZN3ccc8CC8x1y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y133efgEv,_ZThn4_N3ccc8CC8x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y133efgEv,_ZThn4_N3ccc8CC8x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y13E[];
Class_Descriptor cd__ZN3ccc8CC8x1y13E = {  "_ZN3ccc8CC8x1y13E", // class name
  bases__ZN3ccc8CC8x1y13E, 2,
  &(vtc__ZN3ccc8CC8x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y14  : ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y143pqrEv
  ~CC8x1y14(); // tgen
  CC8x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y143pqrEv,_ZThn4_N3ccc8CC8x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x1y143pqrEv,_ZThn4_N3ccc8CC8x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y14E[];
Class_Descriptor cd__ZN3ccc8CC8x1y14E = {  "_ZN3ccc8CC8x1y14E", // class name
  bases__ZN3ccc8CC8x1y14E, 2,
  &(vtc__ZN3ccc8CC8x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x1y15  : ::ccc::AA8 , ::ccc::BB1 {
  ~CC8x1y15(); // tgen
  CC8x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y15E[];
Class_Descriptor cd__ZN3ccc8CC8x1y15E = {  "_ZN3ccc8CC8x1y15E", // class name
  bases__ZN3ccc8CC8x1y15E, 2,
  &(vtc__ZN3ccc8CC8x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y0  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y03pqrEv
  ~CC8x2y0(); // tgen
  CC8x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y0E[];
extern void _ZN3ccc7CC8x2y03efgEv();
extern void _ZN3ccc7CC8x2y03abcEv();
extern void _ZN3ccc7CC8x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y03efgEv,_ZThn4_N3ccc7CC8x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y03abcEv,_ZThn4_N3ccc7CC8x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y03pqrEv,_ZThn4_N3ccc7CC8x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y03efgEv,_ZThn4_N3ccc7CC8x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y03abcEv,_ZThn4_N3ccc7CC8x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y03pqrEv,_ZThn4_N3ccc7CC8x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y0E[];
Class_Descriptor cd__ZN3ccc7CC8x2y0E = {  "_ZN3ccc7CC8x2y0E", // class name
  bases__ZN3ccc7CC8x2y0E, 2,
  &(vtc__ZN3ccc7CC8x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y1  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x2y13efgEv
  ~CC8x2y1(); // tgen
  CC8x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y1E[];
extern void _ZN3ccc7CC8x2y13efgEv();
extern void _ZN3ccc7CC8x2y13abcEv();
extern void _ZN3ccc7CC8x2y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y13efgEv,_ZThn4_N3ccc7CC8x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y13abcEv,_ZThn4_N3ccc7CC8x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y13pqrEv,_ZThn4_N3ccc7CC8x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y13efgEv,_ZThn4_N3ccc7CC8x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y13abcEv,_ZThn4_N3ccc7CC8x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y13pqrEv,_ZThn4_N3ccc7CC8x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y1E[];
Class_Descriptor cd__ZN3ccc7CC8x2y1E = {  "_ZN3ccc7CC8x2y1E", // class name
  bases__ZN3ccc7CC8x2y1E, 2,
  &(vtc__ZN3ccc7CC8x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y2  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y23pqrEv
  ~CC8x2y2(); // tgen
  CC8x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y2E[];
extern void _ZN3ccc7CC8x2y23efgEv();
extern void _ZN3ccc7CC8x2y23abcEv();
extern void _ZN3ccc7CC8x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y23efgEv,_ZThn4_N3ccc7CC8x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y23abcEv,_ZThn4_N3ccc7CC8x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y23pqrEv,_ZThn4_N3ccc7CC8x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y23efgEv,_ZThn4_N3ccc7CC8x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y23abcEv,_ZThn4_N3ccc7CC8x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y23pqrEv,_ZThn4_N3ccc7CC8x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y2E[];
Class_Descriptor cd__ZN3ccc7CC8x2y2E = {  "_ZN3ccc7CC8x2y2E", // class name
  bases__ZN3ccc7CC8x2y2E, 2,
  &(vtc__ZN3ccc7CC8x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y3  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x2y33abcEv
  ~CC8x2y3(); // tgen
  CC8x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y3E[];
extern void _ZN3ccc7CC8x2y33efgEv();
extern void _ZN3ccc7CC8x2y33abcEv();
extern void _ZN3ccc7CC8x2y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y33efgEv,_ZThn4_N3ccc7CC8x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y33abcEv,_ZThn4_N3ccc7CC8x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y33pqrEv,_ZThn4_N3ccc7CC8x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y33efgEv,_ZThn4_N3ccc7CC8x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y33abcEv,_ZThn4_N3ccc7CC8x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y33pqrEv,_ZThn4_N3ccc7CC8x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y3E[];
Class_Descriptor cd__ZN3ccc7CC8x2y3E = {  "_ZN3ccc7CC8x2y3E", // class name
  bases__ZN3ccc7CC8x2y3E, 2,
  &(vtc__ZN3ccc7CC8x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y4  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC8x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y43efgEv
  ~CC8x2y4(); // tgen
  CC8x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y4E[];
extern void _ZN3ccc7CC8x2y43efgEv();
extern void _ZN3ccc7CC8x2y43abcEv();
extern void _ZN3ccc7CC8x2y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y43efgEv,_ZThn4_N3ccc7CC8x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y43abcEv,_ZThn4_N3ccc7CC8x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y43pqrEv,_ZThn4_N3ccc7CC8x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y43efgEv,_ZThn4_N3ccc7CC8x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y43abcEv,_ZThn4_N3ccc7CC8x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y43pqrEv,_ZThn4_N3ccc7CC8x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y4E[];
Class_Descriptor cd__ZN3ccc7CC8x2y4E = {  "_ZN3ccc7CC8x2y4E", // class name
  bases__ZN3ccc7CC8x2y4E, 2,
  &(vtc__ZN3ccc7CC8x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y5  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC8x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y53abcEv
  ~CC8x2y5(); // tgen
  CC8x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y5E[];
extern void _ZN3ccc7CC8x2y53efgEv();
extern void _ZN3ccc7CC8x2y53abcEv();
extern void _ZN3ccc7CC8x2y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y53efgEv,_ZThn4_N3ccc7CC8x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y53abcEv,_ZThn4_N3ccc7CC8x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y53pqrEv,_ZThn4_N3ccc7CC8x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y53efgEv,_ZThn4_N3ccc7CC8x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y53abcEv,_ZThn4_N3ccc7CC8x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y53pqrEv,_ZThn4_N3ccc7CC8x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y5E[];
Class_Descriptor cd__ZN3ccc7CC8x2y5E = {  "_ZN3ccc7CC8x2y5E", // class name
  bases__ZN3ccc7CC8x2y5E, 2,
  &(vtc__ZN3ccc7CC8x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y6  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y63efgEv
  ~CC8x2y6(); // tgen
  CC8x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y6E[];
extern void _ZN3ccc7CC8x2y63efgEv();
extern void _ZN3ccc7CC8x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y63efgEv,_ZThn4_N3ccc7CC8x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y63abcEv,_ZThn4_N3ccc7CC8x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y63efgEv,_ZThn4_N3ccc7CC8x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y63abcEv,_ZThn4_N3ccc7CC8x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y6E[];
Class_Descriptor cd__ZN3ccc7CC8x2y6E = {  "_ZN3ccc7CC8x2y6E", // class name
  bases__ZN3ccc7CC8x2y6E, 2,
  &(vtc__ZN3ccc7CC8x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y7  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y73pqrEv
  ~CC8x2y7(); // tgen
  CC8x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x2y73abcEv();
extern void _ZN3ccc7CC8x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y73abcEv,_ZThn4_N3ccc7CC8x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y73pqrEv,_ZThn4_N3ccc7CC8x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y73abcEv,_ZThn4_N3ccc7CC8x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y73pqrEv,_ZThn4_N3ccc7CC8x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y7E[];
Class_Descriptor cd__ZN3ccc7CC8x2y7E = {  "_ZN3ccc7CC8x2y7E", // class name
  bases__ZN3ccc7CC8x2y7E, 2,
  &(vtc__ZN3ccc7CC8x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y8  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y83abcEv
  ~CC8x2y8(); // tgen
  CC8x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y8E[];
extern void _ZN3ccc7CC8x2y83efgEv();
extern void _ZN3ccc7CC8x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y83efgEv,_ZThn4_N3ccc7CC8x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y83abcEv,_ZThn4_N3ccc7CC8x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y83efgEv,_ZThn4_N3ccc7CC8x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y83abcEv,_ZThn4_N3ccc7CC8x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y8E[];
Class_Descriptor cd__ZN3ccc7CC8x2y8E = {  "_ZN3ccc7CC8x2y8E", // class name
  bases__ZN3ccc7CC8x2y8E, 2,
  &(vtc__ZN3ccc7CC8x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y9  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y93pqrEv
  ~CC8x2y9(); // tgen
  CC8x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y9E[];
extern void _ZN3ccc7CC8x2y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y93efgEv,_ZThn4_N3ccc7CC8x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y93pqrEv,_ZThn4_N3ccc7CC8x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y93efgEv,_ZThn4_N3ccc7CC8x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x2y93pqrEv,_ZThn4_N3ccc7CC8x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y9E[];
Class_Descriptor cd__ZN3ccc7CC8x2y9E = {  "_ZN3ccc7CC8x2y9E", // class name
  bases__ZN3ccc7CC8x2y9E, 2,
  &(vtc__ZN3ccc7CC8x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y10  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x2y103abcEv
  ~CC8x2y10(); // tgen
  CC8x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x2y103abcEv();
extern void _ZN3ccc8CC8x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y103abcEv,_ZThn4_N3ccc8CC8x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y103pqrEv,_ZThn4_N3ccc8CC8x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y103abcEv,_ZThn4_N3ccc8CC8x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y103pqrEv,_ZThn4_N3ccc8CC8x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y10E[];
Class_Descriptor cd__ZN3ccc8CC8x2y10E = {  "_ZN3ccc8CC8x2y10E", // class name
  bases__ZN3ccc8CC8x2y10E, 2,
  &(vtc__ZN3ccc8CC8x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y11  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x2y113efgEv
  ~CC8x2y11(); // tgen
  CC8x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y11E[];
extern void _ZN3ccc8CC8x2y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y113efgEv,_ZThn4_N3ccc8CC8x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y113pqrEv,_ZThn4_N3ccc8CC8x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y113efgEv,_ZThn4_N3ccc8CC8x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y113pqrEv,_ZThn4_N3ccc8CC8x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y11E[];
Class_Descriptor cd__ZN3ccc8CC8x2y11E = {  "_ZN3ccc8CC8x2y11E", // class name
  bases__ZN3ccc8CC8x2y11E, 2,
  &(vtc__ZN3ccc8CC8x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y12  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC8x2y123abcEv
  ~CC8x2y12(); // tgen
  CC8x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y123abcEv,_ZThn4_N3ccc8CC8x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y123abcEv,_ZThn4_N3ccc8CC8x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y12E[];
Class_Descriptor cd__ZN3ccc8CC8x2y12E = {  "_ZN3ccc8CC8x2y12E", // class name
  bases__ZN3ccc8CC8x2y12E, 2,
  &(vtc__ZN3ccc8CC8x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y13  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC8x2y133efgEv
  ~CC8x2y13(); // tgen
  CC8x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y13E[];
extern void _ZN3ccc8CC8x2y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y133efgEv,_ZThn4_N3ccc8CC8x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y133efgEv,_ZThn4_N3ccc8CC8x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y13E[];
Class_Descriptor cd__ZN3ccc8CC8x2y13E = {  "_ZN3ccc8CC8x2y13E", // class name
  bases__ZN3ccc8CC8x2y13E, 2,
  &(vtc__ZN3ccc8CC8x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y14  : ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y143pqrEv
  ~CC8x2y14(); // tgen
  CC8x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y143pqrEv,_ZThn4_N3ccc8CC8x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x2y143pqrEv,_ZThn4_N3ccc8CC8x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y14E[];
Class_Descriptor cd__ZN3ccc8CC8x2y14E = {  "_ZN3ccc8CC8x2y14E", // class name
  bases__ZN3ccc8CC8x2y14E, 2,
  &(vtc__ZN3ccc8CC8x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x2y15  : ::ccc::AA8 , ::ccc::BB2 {
  ~CC8x2y15(); // tgen
  CC8x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y15E[];
Class_Descriptor cd__ZN3ccc8CC8x2y15E = {  "_ZN3ccc8CC8x2y15E", // class name
  bases__ZN3ccc8CC8x2y15E, 2,
  &(vtc__ZN3ccc8CC8x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y0  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y03pqrEv
  ~CC8x3y0(); // tgen
  CC8x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y0E[];
extern void _ZN3ccc7CC8x3y03efgEv();
extern void _ZN3ccc7CC8x3y03abcEv();
extern void _ZN3ccc7CC8x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y03efgEv,_ZThn4_N3ccc7CC8x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y03pqrEv,_ZThn4_N3ccc7CC8x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y03abcEv,_ZThn4_N3ccc7CC8x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y03efgEv,_ZThn4_N3ccc7CC8x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y03pqrEv,_ZThn4_N3ccc7CC8x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y03abcEv,_ZThn4_N3ccc7CC8x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y0E[];
Class_Descriptor cd__ZN3ccc7CC8x3y0E = {  "_ZN3ccc7CC8x3y0E", // class name
  bases__ZN3ccc7CC8x3y0E, 2,
  &(vtc__ZN3ccc7CC8x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y1  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x3y13efgEv
  ~CC8x3y1(); // tgen
  CC8x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y1E[];
extern void _ZN3ccc7CC8x3y13efgEv();
extern void _ZN3ccc7CC8x3y13abcEv();
extern void _ZN3ccc7CC8x3y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y13efgEv,_ZThn4_N3ccc7CC8x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y13pqrEv,_ZThn4_N3ccc7CC8x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y13abcEv,_ZThn4_N3ccc7CC8x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y13efgEv,_ZThn4_N3ccc7CC8x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y13pqrEv,_ZThn4_N3ccc7CC8x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y13abcEv,_ZThn4_N3ccc7CC8x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y1E[];
Class_Descriptor cd__ZN3ccc7CC8x3y1E = {  "_ZN3ccc7CC8x3y1E", // class name
  bases__ZN3ccc7CC8x3y1E, 2,
  &(vtc__ZN3ccc7CC8x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y2  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y23pqrEv
  ~CC8x3y2(); // tgen
  CC8x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y2E[];
extern void _ZN3ccc7CC8x3y23efgEv();
extern void _ZN3ccc7CC8x3y23abcEv();
extern void _ZN3ccc7CC8x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y23efgEv,_ZThn4_N3ccc7CC8x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y23pqrEv,_ZThn4_N3ccc7CC8x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y23abcEv,_ZThn4_N3ccc7CC8x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y23efgEv,_ZThn4_N3ccc7CC8x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y23pqrEv,_ZThn4_N3ccc7CC8x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y23abcEv,_ZThn4_N3ccc7CC8x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y2E[];
Class_Descriptor cd__ZN3ccc7CC8x3y2E = {  "_ZN3ccc7CC8x3y2E", // class name
  bases__ZN3ccc7CC8x3y2E, 2,
  &(vtc__ZN3ccc7CC8x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y3  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x3y33abcEv
  ~CC8x3y3(); // tgen
  CC8x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y3E[];
extern void _ZN3ccc7CC8x3y33efgEv();
extern void _ZN3ccc7CC8x3y33abcEv();
extern void _ZN3ccc7CC8x3y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y33efgEv,_ZThn4_N3ccc7CC8x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y33pqrEv,_ZThn4_N3ccc7CC8x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y33abcEv,_ZThn4_N3ccc7CC8x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y33efgEv,_ZThn4_N3ccc7CC8x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y33pqrEv,_ZThn4_N3ccc7CC8x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y33abcEv,_ZThn4_N3ccc7CC8x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y3E[];
Class_Descriptor cd__ZN3ccc7CC8x3y3E = {  "_ZN3ccc7CC8x3y3E", // class name
  bases__ZN3ccc7CC8x3y3E, 2,
  &(vtc__ZN3ccc7CC8x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y4  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC8x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y43efgEv
  ~CC8x3y4(); // tgen
  CC8x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y4E[];
extern void _ZN3ccc7CC8x3y43efgEv();
extern void _ZN3ccc7CC8x3y43abcEv();
extern void _ZN3ccc7CC8x3y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y43efgEv,_ZThn4_N3ccc7CC8x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y43pqrEv,_ZThn4_N3ccc7CC8x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y43abcEv,_ZThn4_N3ccc7CC8x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y43efgEv,_ZThn4_N3ccc7CC8x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y43pqrEv,_ZThn4_N3ccc7CC8x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y43abcEv,_ZThn4_N3ccc7CC8x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y4E[];
Class_Descriptor cd__ZN3ccc7CC8x3y4E = {  "_ZN3ccc7CC8x3y4E", // class name
  bases__ZN3ccc7CC8x3y4E, 2,
  &(vtc__ZN3ccc7CC8x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y5  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC8x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y53abcEv
  ~CC8x3y5(); // tgen
  CC8x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y5E[];
extern void _ZN3ccc7CC8x3y53efgEv();
extern void _ZN3ccc7CC8x3y53abcEv();
extern void _ZN3ccc7CC8x3y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y53efgEv,_ZThn4_N3ccc7CC8x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y53pqrEv,_ZThn4_N3ccc7CC8x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y53abcEv,_ZThn4_N3ccc7CC8x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y53efgEv,_ZThn4_N3ccc7CC8x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y53pqrEv,_ZThn4_N3ccc7CC8x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y53abcEv,_ZThn4_N3ccc7CC8x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y5E[];
Class_Descriptor cd__ZN3ccc7CC8x3y5E = {  "_ZN3ccc7CC8x3y5E", // class name
  bases__ZN3ccc7CC8x3y5E, 2,
  &(vtc__ZN3ccc7CC8x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y6  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y63efgEv
  ~CC8x3y6(); // tgen
  CC8x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y6E[];
extern void _ZN3ccc7CC8x3y63efgEv();
extern void _ZN3ccc7CC8x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y63efgEv,_ZThn4_N3ccc7CC8x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y63abcEv,_ZThn4_N3ccc7CC8x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y63efgEv,_ZThn4_N3ccc7CC8x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y63abcEv,_ZThn4_N3ccc7CC8x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y6E[];
Class_Descriptor cd__ZN3ccc7CC8x3y6E = {  "_ZN3ccc7CC8x3y6E", // class name
  bases__ZN3ccc7CC8x3y6E, 2,
  &(vtc__ZN3ccc7CC8x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y7  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y73pqrEv
  ~CC8x3y7(); // tgen
  CC8x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x3y73abcEv();
extern void _ZN3ccc7CC8x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y73pqrEv,_ZThn4_N3ccc7CC8x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y73abcEv,_ZThn4_N3ccc7CC8x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y73pqrEv,_ZThn4_N3ccc7CC8x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y73abcEv,_ZThn4_N3ccc7CC8x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y7E[];
Class_Descriptor cd__ZN3ccc7CC8x3y7E = {  "_ZN3ccc7CC8x3y7E", // class name
  bases__ZN3ccc7CC8x3y7E, 2,
  &(vtc__ZN3ccc7CC8x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y8  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y83abcEv
  ~CC8x3y8(); // tgen
  CC8x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y8E[];
extern void _ZN3ccc7CC8x3y83efgEv();
extern void _ZN3ccc7CC8x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y83efgEv,_ZThn4_N3ccc7CC8x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y83abcEv,_ZThn4_N3ccc7CC8x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y83efgEv,_ZThn4_N3ccc7CC8x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y83abcEv,_ZThn4_N3ccc7CC8x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y8E[];
Class_Descriptor cd__ZN3ccc7CC8x3y8E = {  "_ZN3ccc7CC8x3y8E", // class name
  bases__ZN3ccc7CC8x3y8E, 2,
  &(vtc__ZN3ccc7CC8x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y9  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y93pqrEv
  ~CC8x3y9(); // tgen
  CC8x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y9E[];
extern void _ZN3ccc7CC8x3y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y93efgEv,_ZThn4_N3ccc7CC8x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y93pqrEv,_ZThn4_N3ccc7CC8x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y93efgEv,_ZThn4_N3ccc7CC8x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x3y93pqrEv,_ZThn4_N3ccc7CC8x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y9E[];
Class_Descriptor cd__ZN3ccc7CC8x3y9E = {  "_ZN3ccc7CC8x3y9E", // class name
  bases__ZN3ccc7CC8x3y9E, 2,
  &(vtc__ZN3ccc7CC8x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y10  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x3y103abcEv
  ~CC8x3y10(); // tgen
  CC8x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x3y103abcEv();
extern void _ZN3ccc8CC8x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y103pqrEv,_ZThn4_N3ccc8CC8x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y103abcEv,_ZThn4_N3ccc8CC8x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y103pqrEv,_ZThn4_N3ccc8CC8x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y103abcEv,_ZThn4_N3ccc8CC8x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y10E[];
Class_Descriptor cd__ZN3ccc8CC8x3y10E = {  "_ZN3ccc8CC8x3y10E", // class name
  bases__ZN3ccc8CC8x3y10E, 2,
  &(vtc__ZN3ccc8CC8x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y11  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x3y113efgEv
  ~CC8x3y11(); // tgen
  CC8x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y11E[];
extern void _ZN3ccc8CC8x3y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y113efgEv,_ZThn4_N3ccc8CC8x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y113pqrEv,_ZThn4_N3ccc8CC8x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y113efgEv,_ZThn4_N3ccc8CC8x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y113pqrEv,_ZThn4_N3ccc8CC8x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y11E[];
Class_Descriptor cd__ZN3ccc8CC8x3y11E = {  "_ZN3ccc8CC8x3y11E", // class name
  bases__ZN3ccc8CC8x3y11E, 2,
  &(vtc__ZN3ccc8CC8x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y12  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC8x3y123abcEv
  ~CC8x3y12(); // tgen
  CC8x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y123abcEv,_ZThn4_N3ccc8CC8x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y123abcEv,_ZThn4_N3ccc8CC8x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y12E[];
Class_Descriptor cd__ZN3ccc8CC8x3y12E = {  "_ZN3ccc8CC8x3y12E", // class name
  bases__ZN3ccc8CC8x3y12E, 2,
  &(vtc__ZN3ccc8CC8x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y13  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC8x3y133efgEv
  ~CC8x3y13(); // tgen
  CC8x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y13E[];
extern void _ZN3ccc8CC8x3y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y133efgEv,_ZThn4_N3ccc8CC8x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y133efgEv,_ZThn4_N3ccc8CC8x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y13E[];
Class_Descriptor cd__ZN3ccc8CC8x3y13E = {  "_ZN3ccc8CC8x3y13E", // class name
  bases__ZN3ccc8CC8x3y13E, 2,
  &(vtc__ZN3ccc8CC8x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y14  : ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y143pqrEv
  ~CC8x3y14(); // tgen
  CC8x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y143pqrEv,_ZThn4_N3ccc8CC8x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x3y143pqrEv,_ZThn4_N3ccc8CC8x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y14E[];
Class_Descriptor cd__ZN3ccc8CC8x3y14E = {  "_ZN3ccc8CC8x3y14E", // class name
  bases__ZN3ccc8CC8x3y14E, 2,
  &(vtc__ZN3ccc8CC8x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x3y15  : ::ccc::AA8 , ::ccc::BB3 {
  ~CC8x3y15(); // tgen
  CC8x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y15E[];
Class_Descriptor cd__ZN3ccc8CC8x3y15E = {  "_ZN3ccc8CC8x3y15E", // class name
  bases__ZN3ccc8CC8x3y15E, 2,
  &(vtc__ZN3ccc8CC8x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y0  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y03pqrEv
  ~CC8x4y0(); // tgen
  CC8x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y0E[];
extern void _ZN3ccc7CC8x4y03efgEv();
extern void _ZN3ccc7CC8x4y03abcEv();
extern void _ZN3ccc7CC8x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y03pqrEv,_ZThn4_N3ccc7CC8x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y03abcEv,_ZThn4_N3ccc7CC8x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y03efgEv,_ZThn4_N3ccc7CC8x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y03pqrEv,_ZThn4_N3ccc7CC8x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y03abcEv,_ZThn4_N3ccc7CC8x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y03efgEv,_ZThn4_N3ccc7CC8x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y0E[];
Class_Descriptor cd__ZN3ccc7CC8x4y0E = {  "_ZN3ccc7CC8x4y0E", // class name
  bases__ZN3ccc7CC8x4y0E, 2,
  &(vtc__ZN3ccc7CC8x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y1  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x4y13efgEv
  ~CC8x4y1(); // tgen
  CC8x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y1E[];
extern void _ZN3ccc7CC8x4y13efgEv();
extern void _ZN3ccc7CC8x4y13abcEv();
extern void _ZN3ccc7CC8x4y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y13pqrEv,_ZThn4_N3ccc7CC8x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y13abcEv,_ZThn4_N3ccc7CC8x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y13efgEv,_ZThn4_N3ccc7CC8x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y13pqrEv,_ZThn4_N3ccc7CC8x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y13abcEv,_ZThn4_N3ccc7CC8x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y13efgEv,_ZThn4_N3ccc7CC8x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y1E[];
Class_Descriptor cd__ZN3ccc7CC8x4y1E = {  "_ZN3ccc7CC8x4y1E", // class name
  bases__ZN3ccc7CC8x4y1E, 2,
  &(vtc__ZN3ccc7CC8x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y2  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y23pqrEv
  ~CC8x4y2(); // tgen
  CC8x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y2E[];
extern void _ZN3ccc7CC8x4y23efgEv();
extern void _ZN3ccc7CC8x4y23abcEv();
extern void _ZN3ccc7CC8x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y23pqrEv,_ZThn4_N3ccc7CC8x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y23abcEv,_ZThn4_N3ccc7CC8x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y23efgEv,_ZThn4_N3ccc7CC8x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y23pqrEv,_ZThn4_N3ccc7CC8x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y23abcEv,_ZThn4_N3ccc7CC8x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y23efgEv,_ZThn4_N3ccc7CC8x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y2E[];
Class_Descriptor cd__ZN3ccc7CC8x4y2E = {  "_ZN3ccc7CC8x4y2E", // class name
  bases__ZN3ccc7CC8x4y2E, 2,
  &(vtc__ZN3ccc7CC8x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y3  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x4y33abcEv
  ~CC8x4y3(); // tgen
  CC8x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y3E[];
extern void _ZN3ccc7CC8x4y33efgEv();
extern void _ZN3ccc7CC8x4y33abcEv();
extern void _ZN3ccc7CC8x4y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y33pqrEv,_ZThn4_N3ccc7CC8x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y33abcEv,_ZThn4_N3ccc7CC8x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y33efgEv,_ZThn4_N3ccc7CC8x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y33pqrEv,_ZThn4_N3ccc7CC8x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y33abcEv,_ZThn4_N3ccc7CC8x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y33efgEv,_ZThn4_N3ccc7CC8x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y3E[];
Class_Descriptor cd__ZN3ccc7CC8x4y3E = {  "_ZN3ccc7CC8x4y3E", // class name
  bases__ZN3ccc7CC8x4y3E, 2,
  &(vtc__ZN3ccc7CC8x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y4  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC8x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y43efgEv
  ~CC8x4y4(); // tgen
  CC8x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y4E[];
extern void _ZN3ccc7CC8x4y43efgEv();
extern void _ZN3ccc7CC8x4y43abcEv();
extern void _ZN3ccc7CC8x4y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y43pqrEv,_ZThn4_N3ccc7CC8x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y43abcEv,_ZThn4_N3ccc7CC8x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y43efgEv,_ZThn4_N3ccc7CC8x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y43pqrEv,_ZThn4_N3ccc7CC8x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y43abcEv,_ZThn4_N3ccc7CC8x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y43efgEv,_ZThn4_N3ccc7CC8x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y4E[];
Class_Descriptor cd__ZN3ccc7CC8x4y4E = {  "_ZN3ccc7CC8x4y4E", // class name
  bases__ZN3ccc7CC8x4y4E, 2,
  &(vtc__ZN3ccc7CC8x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y5  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC8x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y53abcEv
  ~CC8x4y5(); // tgen
  CC8x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y5E[];
extern void _ZN3ccc7CC8x4y53efgEv();
extern void _ZN3ccc7CC8x4y53abcEv();
extern void _ZN3ccc7CC8x4y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y53pqrEv,_ZThn4_N3ccc7CC8x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y53abcEv,_ZThn4_N3ccc7CC8x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y53efgEv,_ZThn4_N3ccc7CC8x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y53pqrEv,_ZThn4_N3ccc7CC8x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y53abcEv,_ZThn4_N3ccc7CC8x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y53efgEv,_ZThn4_N3ccc7CC8x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y5E[];
Class_Descriptor cd__ZN3ccc7CC8x4y5E = {  "_ZN3ccc7CC8x4y5E", // class name
  bases__ZN3ccc7CC8x4y5E, 2,
  &(vtc__ZN3ccc7CC8x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y6  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y63efgEv
  ~CC8x4y6(); // tgen
  CC8x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y6E[];
extern void _ZN3ccc7CC8x4y63efgEv();
extern void _ZN3ccc7CC8x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y63abcEv,_ZThn4_N3ccc7CC8x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y63efgEv,_ZThn4_N3ccc7CC8x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y63abcEv,_ZThn4_N3ccc7CC8x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y63efgEv,_ZThn4_N3ccc7CC8x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y6E[];
Class_Descriptor cd__ZN3ccc7CC8x4y6E = {  "_ZN3ccc7CC8x4y6E", // class name
  bases__ZN3ccc7CC8x4y6E, 2,
  &(vtc__ZN3ccc7CC8x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y7  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y73pqrEv
  ~CC8x4y7(); // tgen
  CC8x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x4y73abcEv();
extern void _ZN3ccc7CC8x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y73pqrEv,_ZThn4_N3ccc7CC8x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y73abcEv,_ZThn4_N3ccc7CC8x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y73pqrEv,_ZThn4_N3ccc7CC8x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y73abcEv,_ZThn4_N3ccc7CC8x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y7E[];
Class_Descriptor cd__ZN3ccc7CC8x4y7E = {  "_ZN3ccc7CC8x4y7E", // class name
  bases__ZN3ccc7CC8x4y7E, 2,
  &(vtc__ZN3ccc7CC8x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y8  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y83abcEv
  ~CC8x4y8(); // tgen
  CC8x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y8E[];
extern void _ZN3ccc7CC8x4y83efgEv();
extern void _ZN3ccc7CC8x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y83abcEv,_ZThn4_N3ccc7CC8x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y83efgEv,_ZThn4_N3ccc7CC8x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y83abcEv,_ZThn4_N3ccc7CC8x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y83efgEv,_ZThn4_N3ccc7CC8x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y8E[];
Class_Descriptor cd__ZN3ccc7CC8x4y8E = {  "_ZN3ccc7CC8x4y8E", // class name
  bases__ZN3ccc7CC8x4y8E, 2,
  &(vtc__ZN3ccc7CC8x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y9  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y93pqrEv
  ~CC8x4y9(); // tgen
  CC8x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y9E[];
extern void _ZN3ccc7CC8x4y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y93pqrEv,_ZThn4_N3ccc7CC8x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y93efgEv,_ZThn4_N3ccc7CC8x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y93pqrEv,_ZThn4_N3ccc7CC8x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x4y93efgEv,_ZThn4_N3ccc7CC8x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y9E[];
Class_Descriptor cd__ZN3ccc7CC8x4y9E = {  "_ZN3ccc7CC8x4y9E", // class name
  bases__ZN3ccc7CC8x4y9E, 2,
  &(vtc__ZN3ccc7CC8x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y10  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x4y103abcEv
  ~CC8x4y10(); // tgen
  CC8x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x4y103abcEv();
extern void _ZN3ccc8CC8x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y103pqrEv,_ZThn4_N3ccc8CC8x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y103abcEv,_ZThn4_N3ccc8CC8x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y103pqrEv,_ZThn4_N3ccc8CC8x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y103abcEv,_ZThn4_N3ccc8CC8x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y10E[];
Class_Descriptor cd__ZN3ccc8CC8x4y10E = {  "_ZN3ccc8CC8x4y10E", // class name
  bases__ZN3ccc8CC8x4y10E, 2,
  &(vtc__ZN3ccc8CC8x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y11  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x4y113efgEv
  ~CC8x4y11(); // tgen
  CC8x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y11E[];
extern void _ZN3ccc8CC8x4y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y113pqrEv,_ZThn4_N3ccc8CC8x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y113efgEv,_ZThn4_N3ccc8CC8x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y113pqrEv,_ZThn4_N3ccc8CC8x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y113efgEv,_ZThn4_N3ccc8CC8x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y11E[];
Class_Descriptor cd__ZN3ccc8CC8x4y11E = {  "_ZN3ccc8CC8x4y11E", // class name
  bases__ZN3ccc8CC8x4y11E, 2,
  &(vtc__ZN3ccc8CC8x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y12  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC8x4y123abcEv
  ~CC8x4y12(); // tgen
  CC8x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y123abcEv,_ZThn4_N3ccc8CC8x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y123abcEv,_ZThn4_N3ccc8CC8x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y12E[];
Class_Descriptor cd__ZN3ccc8CC8x4y12E = {  "_ZN3ccc8CC8x4y12E", // class name
  bases__ZN3ccc8CC8x4y12E, 2,
  &(vtc__ZN3ccc8CC8x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y13  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC8x4y133efgEv
  ~CC8x4y13(); // tgen
  CC8x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y13E[];
extern void _ZN3ccc8CC8x4y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y133efgEv,_ZThn4_N3ccc8CC8x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y133efgEv,_ZThn4_N3ccc8CC8x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y13E[];
Class_Descriptor cd__ZN3ccc8CC8x4y13E = {  "_ZN3ccc8CC8x4y13E", // class name
  bases__ZN3ccc8CC8x4y13E, 2,
  &(vtc__ZN3ccc8CC8x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y14  : ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y143pqrEv
  ~CC8x4y14(); // tgen
  CC8x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y143pqrEv,_ZThn4_N3ccc8CC8x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x4y143pqrEv,_ZThn4_N3ccc8CC8x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y14E[];
Class_Descriptor cd__ZN3ccc8CC8x4y14E = {  "_ZN3ccc8CC8x4y14E", // class name
  bases__ZN3ccc8CC8x4y14E, 2,
  &(vtc__ZN3ccc8CC8x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x4y15  : ::ccc::AA8 , ::ccc::BB4 {
  ~CC8x4y15(); // tgen
  CC8x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y15E[];
Class_Descriptor cd__ZN3ccc8CC8x4y15E = {  "_ZN3ccc8CC8x4y15E", // class name
  bases__ZN3ccc8CC8x4y15E, 2,
  &(vtc__ZN3ccc8CC8x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y0  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y03pqrEv
  ~CC8x5y0(); // tgen
  CC8x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y0E[];
extern void _ZN3ccc7CC8x5y03efgEv();
extern void _ZN3ccc7CC8x5y03abcEv();
extern void _ZN3ccc7CC8x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y03pqrEv,_ZThn4_N3ccc7CC8x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y03efgEv,_ZThn4_N3ccc7CC8x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y03abcEv,_ZThn4_N3ccc7CC8x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y03pqrEv,_ZThn4_N3ccc7CC8x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y03efgEv,_ZThn4_N3ccc7CC8x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y03abcEv,_ZThn4_N3ccc7CC8x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y0E[];
Class_Descriptor cd__ZN3ccc7CC8x5y0E = {  "_ZN3ccc7CC8x5y0E", // class name
  bases__ZN3ccc7CC8x5y0E, 2,
  &(vtc__ZN3ccc7CC8x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y1  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x5y13efgEv
  ~CC8x5y1(); // tgen
  CC8x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y1E[];
extern void _ZN3ccc7CC8x5y13efgEv();
extern void _ZN3ccc7CC8x5y13abcEv();
extern void _ZN3ccc7CC8x5y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y13pqrEv,_ZThn4_N3ccc7CC8x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y13efgEv,_ZThn4_N3ccc7CC8x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y13abcEv,_ZThn4_N3ccc7CC8x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y13pqrEv,_ZThn4_N3ccc7CC8x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y13efgEv,_ZThn4_N3ccc7CC8x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y13abcEv,_ZThn4_N3ccc7CC8x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y1E[];
Class_Descriptor cd__ZN3ccc7CC8x5y1E = {  "_ZN3ccc7CC8x5y1E", // class name
  bases__ZN3ccc7CC8x5y1E, 2,
  &(vtc__ZN3ccc7CC8x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y2  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y23pqrEv
  ~CC8x5y2(); // tgen
  CC8x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y2E[];
extern void _ZN3ccc7CC8x5y23efgEv();
extern void _ZN3ccc7CC8x5y23abcEv();
extern void _ZN3ccc7CC8x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y23pqrEv,_ZThn4_N3ccc7CC8x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y23efgEv,_ZThn4_N3ccc7CC8x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y23abcEv,_ZThn4_N3ccc7CC8x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y23pqrEv,_ZThn4_N3ccc7CC8x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y23efgEv,_ZThn4_N3ccc7CC8x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y23abcEv,_ZThn4_N3ccc7CC8x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y2E[];
Class_Descriptor cd__ZN3ccc7CC8x5y2E = {  "_ZN3ccc7CC8x5y2E", // class name
  bases__ZN3ccc7CC8x5y2E, 2,
  &(vtc__ZN3ccc7CC8x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y3  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x5y33abcEv
  ~CC8x5y3(); // tgen
  CC8x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y3E[];
extern void _ZN3ccc7CC8x5y33efgEv();
extern void _ZN3ccc7CC8x5y33abcEv();
extern void _ZN3ccc7CC8x5y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y33pqrEv,_ZThn4_N3ccc7CC8x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y33efgEv,_ZThn4_N3ccc7CC8x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y33abcEv,_ZThn4_N3ccc7CC8x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y33pqrEv,_ZThn4_N3ccc7CC8x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y33efgEv,_ZThn4_N3ccc7CC8x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y33abcEv,_ZThn4_N3ccc7CC8x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y3E[];
Class_Descriptor cd__ZN3ccc7CC8x5y3E = {  "_ZN3ccc7CC8x5y3E", // class name
  bases__ZN3ccc7CC8x5y3E, 2,
  &(vtc__ZN3ccc7CC8x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y4  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC8x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y43efgEv
  ~CC8x5y4(); // tgen
  CC8x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y4E[];
extern void _ZN3ccc7CC8x5y43efgEv();
extern void _ZN3ccc7CC8x5y43abcEv();
extern void _ZN3ccc7CC8x5y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y43pqrEv,_ZThn4_N3ccc7CC8x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y43efgEv,_ZThn4_N3ccc7CC8x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y43abcEv,_ZThn4_N3ccc7CC8x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y43pqrEv,_ZThn4_N3ccc7CC8x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y43efgEv,_ZThn4_N3ccc7CC8x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y43abcEv,_ZThn4_N3ccc7CC8x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y4E[];
Class_Descriptor cd__ZN3ccc7CC8x5y4E = {  "_ZN3ccc7CC8x5y4E", // class name
  bases__ZN3ccc7CC8x5y4E, 2,
  &(vtc__ZN3ccc7CC8x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y5  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC8x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y53abcEv
  ~CC8x5y5(); // tgen
  CC8x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y5E[];
extern void _ZN3ccc7CC8x5y53efgEv();
extern void _ZN3ccc7CC8x5y53abcEv();
extern void _ZN3ccc7CC8x5y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y53pqrEv,_ZThn4_N3ccc7CC8x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y53efgEv,_ZThn4_N3ccc7CC8x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y53abcEv,_ZThn4_N3ccc7CC8x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y53pqrEv,_ZThn4_N3ccc7CC8x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y53efgEv,_ZThn4_N3ccc7CC8x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y53abcEv,_ZThn4_N3ccc7CC8x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y5E[];
Class_Descriptor cd__ZN3ccc7CC8x5y5E = {  "_ZN3ccc7CC8x5y5E", // class name
  bases__ZN3ccc7CC8x5y5E, 2,
  &(vtc__ZN3ccc7CC8x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y6  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y63efgEv
  ~CC8x5y6(); // tgen
  CC8x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y6E[];
extern void _ZN3ccc7CC8x5y63efgEv();
extern void _ZN3ccc7CC8x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y63efgEv,_ZThn4_N3ccc7CC8x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y63abcEv,_ZThn4_N3ccc7CC8x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y63efgEv,_ZThn4_N3ccc7CC8x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y63abcEv,_ZThn4_N3ccc7CC8x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y6E[];
Class_Descriptor cd__ZN3ccc7CC8x5y6E = {  "_ZN3ccc7CC8x5y6E", // class name
  bases__ZN3ccc7CC8x5y6E, 2,
  &(vtc__ZN3ccc7CC8x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y7  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y73pqrEv
  ~CC8x5y7(); // tgen
  CC8x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x5y73abcEv();
extern void _ZN3ccc7CC8x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y73pqrEv,_ZThn4_N3ccc7CC8x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y73abcEv,_ZThn4_N3ccc7CC8x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y73pqrEv,_ZThn4_N3ccc7CC8x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y73abcEv,_ZThn4_N3ccc7CC8x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y7E[];
Class_Descriptor cd__ZN3ccc7CC8x5y7E = {  "_ZN3ccc7CC8x5y7E", // class name
  bases__ZN3ccc7CC8x5y7E, 2,
  &(vtc__ZN3ccc7CC8x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y8  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y83abcEv
  ~CC8x5y8(); // tgen
  CC8x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y8E[];
extern void _ZN3ccc7CC8x5y83efgEv();
extern void _ZN3ccc7CC8x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y83efgEv,_ZThn4_N3ccc7CC8x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y83abcEv,_ZThn4_N3ccc7CC8x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y83efgEv,_ZThn4_N3ccc7CC8x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y83abcEv,_ZThn4_N3ccc7CC8x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y8E[];
Class_Descriptor cd__ZN3ccc7CC8x5y8E = {  "_ZN3ccc7CC8x5y8E", // class name
  bases__ZN3ccc7CC8x5y8E, 2,
  &(vtc__ZN3ccc7CC8x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y9  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y93pqrEv
  ~CC8x5y9(); // tgen
  CC8x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y9E[];
extern void _ZN3ccc7CC8x5y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y93pqrEv,_ZThn4_N3ccc7CC8x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y93efgEv,_ZThn4_N3ccc7CC8x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y93pqrEv,_ZThn4_N3ccc7CC8x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x5y93efgEv,_ZThn4_N3ccc7CC8x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y9E[];
Class_Descriptor cd__ZN3ccc7CC8x5y9E = {  "_ZN3ccc7CC8x5y9E", // class name
  bases__ZN3ccc7CC8x5y9E, 2,
  &(vtc__ZN3ccc7CC8x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y10  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x5y103abcEv
  ~CC8x5y10(); // tgen
  CC8x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x5y103abcEv();
extern void _ZN3ccc8CC8x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y103pqrEv,_ZThn4_N3ccc8CC8x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y103abcEv,_ZThn4_N3ccc8CC8x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y103pqrEv,_ZThn4_N3ccc8CC8x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y103abcEv,_ZThn4_N3ccc8CC8x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y10E[];
Class_Descriptor cd__ZN3ccc8CC8x5y10E = {  "_ZN3ccc8CC8x5y10E", // class name
  bases__ZN3ccc8CC8x5y10E, 2,
  &(vtc__ZN3ccc8CC8x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y11  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x5y113efgEv
  ~CC8x5y11(); // tgen
  CC8x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y11E[];
extern void _ZN3ccc8CC8x5y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y113pqrEv,_ZThn4_N3ccc8CC8x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y113efgEv,_ZThn4_N3ccc8CC8x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y113pqrEv,_ZThn4_N3ccc8CC8x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y113efgEv,_ZThn4_N3ccc8CC8x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y11E[];
Class_Descriptor cd__ZN3ccc8CC8x5y11E = {  "_ZN3ccc8CC8x5y11E", // class name
  bases__ZN3ccc8CC8x5y11E, 2,
  &(vtc__ZN3ccc8CC8x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y12  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC8x5y123abcEv
  ~CC8x5y12(); // tgen
  CC8x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y123abcEv,_ZThn4_N3ccc8CC8x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y123abcEv,_ZThn4_N3ccc8CC8x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y12E[];
Class_Descriptor cd__ZN3ccc8CC8x5y12E = {  "_ZN3ccc8CC8x5y12E", // class name
  bases__ZN3ccc8CC8x5y12E, 2,
  &(vtc__ZN3ccc8CC8x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y13  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC8x5y133efgEv
  ~CC8x5y13(); // tgen
  CC8x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y13E[];
extern void _ZN3ccc8CC8x5y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y133efgEv,_ZThn4_N3ccc8CC8x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y133efgEv,_ZThn4_N3ccc8CC8x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y13E[];
Class_Descriptor cd__ZN3ccc8CC8x5y13E = {  "_ZN3ccc8CC8x5y13E", // class name
  bases__ZN3ccc8CC8x5y13E, 2,
  &(vtc__ZN3ccc8CC8x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y14  : ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y143pqrEv
  ~CC8x5y14(); // tgen
  CC8x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y143pqrEv,_ZThn4_N3ccc8CC8x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x5y143pqrEv,_ZThn4_N3ccc8CC8x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y14E[];
Class_Descriptor cd__ZN3ccc8CC8x5y14E = {  "_ZN3ccc8CC8x5y14E", // class name
  bases__ZN3ccc8CC8x5y14E, 2,
  &(vtc__ZN3ccc8CC8x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y14E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x5y15  : ::ccc::AA8 , ::ccc::BB5 {
  ~CC8x5y15(); // tgen
  CC8x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y15E[];
Class_Descriptor cd__ZN3ccc8CC8x5y15E = {  "_ZN3ccc8CC8x5y15E", // class name
  bases__ZN3ccc8CC8x5y15E, 2,
  &(vtc__ZN3ccc8CC8x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y0  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y03pqrEv
  ~CC8x6y0(); // tgen
  CC8x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y0E[];
extern void _ZN3ccc7CC8x6y03efgEv();
extern void _ZN3ccc7CC8x6y03abcEv();
extern void _ZN3ccc7CC8x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y03abcEv,_ZThn4_N3ccc7CC8x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y03efgEv,_ZThn4_N3ccc7CC8x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y03abcEv,_ZThn4_N3ccc7CC8x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y03efgEv,_ZThn4_N3ccc7CC8x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y0E[];
Class_Descriptor cd__ZN3ccc7CC8x6y0E = {  "_ZN3ccc7CC8x6y0E", // class name
  bases__ZN3ccc7CC8x6y0E, 2,
  &(vtc__ZN3ccc7CC8x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y1  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x6y13efgEv
  ~CC8x6y1(); // tgen
  CC8x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y1E[];
extern void _ZN3ccc7CC8x6y13efgEv();
extern void _ZN3ccc7CC8x6y13abcEv();
extern void _ZN3ccc7CC8x6y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y13abcEv,_ZThn4_N3ccc7CC8x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y13efgEv,_ZThn4_N3ccc7CC8x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y13abcEv,_ZThn4_N3ccc7CC8x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y13efgEv,_ZThn4_N3ccc7CC8x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y1E[];
Class_Descriptor cd__ZN3ccc7CC8x6y1E = {  "_ZN3ccc7CC8x6y1E", // class name
  bases__ZN3ccc7CC8x6y1E, 2,
  &(vtc__ZN3ccc7CC8x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y2  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y23pqrEv
  ~CC8x6y2(); // tgen
  CC8x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y2E[];
extern void _ZN3ccc7CC8x6y23efgEv();
extern void _ZN3ccc7CC8x6y23abcEv();
extern void _ZN3ccc7CC8x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y23abcEv,_ZThn4_N3ccc7CC8x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y23efgEv,_ZThn4_N3ccc7CC8x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y23abcEv,_ZThn4_N3ccc7CC8x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y23efgEv,_ZThn4_N3ccc7CC8x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y2E[];
Class_Descriptor cd__ZN3ccc7CC8x6y2E = {  "_ZN3ccc7CC8x6y2E", // class name
  bases__ZN3ccc7CC8x6y2E, 2,
  &(vtc__ZN3ccc7CC8x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y3  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x6y33abcEv
  ~CC8x6y3(); // tgen
  CC8x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y3E[];
extern void _ZN3ccc7CC8x6y33efgEv();
extern void _ZN3ccc7CC8x6y33abcEv();
extern void _ZN3ccc7CC8x6y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y33abcEv,_ZThn4_N3ccc7CC8x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y33efgEv,_ZThn4_N3ccc7CC8x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y33abcEv,_ZThn4_N3ccc7CC8x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y33efgEv,_ZThn4_N3ccc7CC8x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y3E[];
Class_Descriptor cd__ZN3ccc7CC8x6y3E = {  "_ZN3ccc7CC8x6y3E", // class name
  bases__ZN3ccc7CC8x6y3E, 2,
  &(vtc__ZN3ccc7CC8x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y4  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC8x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y43efgEv
  ~CC8x6y4(); // tgen
  CC8x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y4E[];
extern void _ZN3ccc7CC8x6y43efgEv();
extern void _ZN3ccc7CC8x6y43abcEv();
extern void _ZN3ccc7CC8x6y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y43abcEv,_ZThn4_N3ccc7CC8x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y43efgEv,_ZThn4_N3ccc7CC8x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y43abcEv,_ZThn4_N3ccc7CC8x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y43efgEv,_ZThn4_N3ccc7CC8x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y4E[];
Class_Descriptor cd__ZN3ccc7CC8x6y4E = {  "_ZN3ccc7CC8x6y4E", // class name
  bases__ZN3ccc7CC8x6y4E, 2,
  &(vtc__ZN3ccc7CC8x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y5  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC8x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y53abcEv
  ~CC8x6y5(); // tgen
  CC8x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y5E[];
extern void _ZN3ccc7CC8x6y53efgEv();
extern void _ZN3ccc7CC8x6y53abcEv();
extern void _ZN3ccc7CC8x6y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y53abcEv,_ZThn4_N3ccc7CC8x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y53efgEv,_ZThn4_N3ccc7CC8x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y53abcEv,_ZThn4_N3ccc7CC8x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y53efgEv,_ZThn4_N3ccc7CC8x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y5E[];
Class_Descriptor cd__ZN3ccc7CC8x6y5E = {  "_ZN3ccc7CC8x6y5E", // class name
  bases__ZN3ccc7CC8x6y5E, 2,
  &(vtc__ZN3ccc7CC8x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y6  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y63efgEv
  ~CC8x6y6(); // tgen
  CC8x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y6E[];
extern void _ZN3ccc7CC8x6y63efgEv();
extern void _ZN3ccc7CC8x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y63abcEv,_ZThn4_N3ccc7CC8x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y63efgEv,_ZThn4_N3ccc7CC8x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y63abcEv,_ZThn4_N3ccc7CC8x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y63efgEv,_ZThn4_N3ccc7CC8x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y6E[];
Class_Descriptor cd__ZN3ccc7CC8x6y6E = {  "_ZN3ccc7CC8x6y6E", // class name
  bases__ZN3ccc7CC8x6y6E, 2,
  &(vtc__ZN3ccc7CC8x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y7  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y73pqrEv
  ~CC8x6y7(); // tgen
  CC8x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x6y73abcEv();
extern void _ZN3ccc7CC8x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y73abcEv,_ZThn4_N3ccc7CC8x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y73abcEv,_ZThn4_N3ccc7CC8x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y7E[];
Class_Descriptor cd__ZN3ccc7CC8x6y7E = {  "_ZN3ccc7CC8x6y7E", // class name
  bases__ZN3ccc7CC8x6y7E, 2,
  &(vtc__ZN3ccc7CC8x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y8  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y83abcEv
  ~CC8x6y8(); // tgen
  CC8x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y8E[];
extern void _ZN3ccc7CC8x6y83efgEv();
extern void _ZN3ccc7CC8x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y83abcEv,_ZThn4_N3ccc7CC8x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y83efgEv,_ZThn4_N3ccc7CC8x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y83abcEv,_ZThn4_N3ccc7CC8x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y83efgEv,_ZThn4_N3ccc7CC8x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y8E[];
Class_Descriptor cd__ZN3ccc7CC8x6y8E = {  "_ZN3ccc7CC8x6y8E", // class name
  bases__ZN3ccc7CC8x6y8E, 2,
  &(vtc__ZN3ccc7CC8x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y9  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y93pqrEv
  ~CC8x6y9(); // tgen
  CC8x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y9E[];
extern void _ZN3ccc7CC8x6y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y93efgEv,_ZThn4_N3ccc7CC8x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x6y93efgEv,_ZThn4_N3ccc7CC8x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y9E[];
Class_Descriptor cd__ZN3ccc7CC8x6y9E = {  "_ZN3ccc7CC8x6y9E", // class name
  bases__ZN3ccc7CC8x6y9E, 2,
  &(vtc__ZN3ccc7CC8x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y10  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x6y103abcEv
  ~CC8x6y10(); // tgen
  CC8x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x6y103abcEv();
extern void _ZN3ccc8CC8x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y103abcEv,_ZThn4_N3ccc8CC8x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x6y103abcEv,_ZThn4_N3ccc8CC8x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y10E[];
Class_Descriptor cd__ZN3ccc8CC8x6y10E = {  "_ZN3ccc8CC8x6y10E", // class name
  bases__ZN3ccc8CC8x6y10E, 2,
  &(vtc__ZN3ccc8CC8x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y11  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x6y113efgEv
  ~CC8x6y11(); // tgen
  CC8x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y11E[];
extern void _ZN3ccc8CC8x6y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y113efgEv,_ZThn4_N3ccc8CC8x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x6y113efgEv,_ZThn4_N3ccc8CC8x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y11E[];
Class_Descriptor cd__ZN3ccc8CC8x6y11E = {  "_ZN3ccc8CC8x6y11E", // class name
  bases__ZN3ccc8CC8x6y11E, 2,
  &(vtc__ZN3ccc8CC8x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y12  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC8x6y123abcEv
  ~CC8x6y12(); // tgen
  CC8x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y123abcEv,_ZThn4_N3ccc8CC8x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x6y123abcEv,_ZThn4_N3ccc8CC8x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y12E[];
Class_Descriptor cd__ZN3ccc8CC8x6y12E = {  "_ZN3ccc8CC8x6y12E", // class name
  bases__ZN3ccc8CC8x6y12E, 2,
  &(vtc__ZN3ccc8CC8x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y13  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC8x6y133efgEv
  ~CC8x6y13(); // tgen
  CC8x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y13E[];
extern void _ZN3ccc8CC8x6y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y133efgEv,_ZThn4_N3ccc8CC8x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x6y133efgEv,_ZThn4_N3ccc8CC8x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y13E[];
Class_Descriptor cd__ZN3ccc8CC8x6y13E = {  "_ZN3ccc8CC8x6y13E", // class name
  bases__ZN3ccc8CC8x6y13E, 2,
  &(vtc__ZN3ccc8CC8x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y14  : ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y143pqrEv
  ~CC8x6y14(); // tgen
  CC8x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y14E[];
Class_Descriptor cd__ZN3ccc8CC8x6y14E = {  "_ZN3ccc8CC8x6y14E", // class name
  bases__ZN3ccc8CC8x6y14E, 2,
  &(vtc__ZN3ccc8CC8x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x6y15  : ::ccc::AA8 , ::ccc::BB6 {
  ~CC8x6y15(); // tgen
  CC8x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y15E[];
Class_Descriptor cd__ZN3ccc8CC8x6y15E = {  "_ZN3ccc8CC8x6y15E", // class name
  bases__ZN3ccc8CC8x6y15E, 2,
  &(vtc__ZN3ccc8CC8x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y0  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y03pqrEv
  ~CC8x7y0(); // tgen
  CC8x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y0E[];
extern void _ZN3ccc7CC8x7y03efgEv();
extern void _ZN3ccc7CC8x7y03abcEv();
extern void _ZN3ccc7CC8x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y03abcEv,_ZThn4_N3ccc7CC8x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y03pqrEv,_ZThn4_N3ccc7CC8x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y03abcEv,_ZThn4_N3ccc7CC8x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y03pqrEv,_ZThn4_N3ccc7CC8x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y0E[];
Class_Descriptor cd__ZN3ccc7CC8x7y0E = {  "_ZN3ccc7CC8x7y0E", // class name
  bases__ZN3ccc7CC8x7y0E, 2,
  &(vtc__ZN3ccc7CC8x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y1  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x7y13efgEv
  ~CC8x7y1(); // tgen
  CC8x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y1E[];
extern void _ZN3ccc7CC8x7y13efgEv();
extern void _ZN3ccc7CC8x7y13abcEv();
extern void _ZN3ccc7CC8x7y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y13abcEv,_ZThn4_N3ccc7CC8x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y13pqrEv,_ZThn4_N3ccc7CC8x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y13abcEv,_ZThn4_N3ccc7CC8x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y13pqrEv,_ZThn4_N3ccc7CC8x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y1E[];
Class_Descriptor cd__ZN3ccc7CC8x7y1E = {  "_ZN3ccc7CC8x7y1E", // class name
  bases__ZN3ccc7CC8x7y1E, 2,
  &(vtc__ZN3ccc7CC8x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y2  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y23pqrEv
  ~CC8x7y2(); // tgen
  CC8x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y2E[];
extern void _ZN3ccc7CC8x7y23efgEv();
extern void _ZN3ccc7CC8x7y23abcEv();
extern void _ZN3ccc7CC8x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y23abcEv,_ZThn4_N3ccc7CC8x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y23pqrEv,_ZThn4_N3ccc7CC8x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y23abcEv,_ZThn4_N3ccc7CC8x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y23pqrEv,_ZThn4_N3ccc7CC8x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y2E[];
Class_Descriptor cd__ZN3ccc7CC8x7y2E = {  "_ZN3ccc7CC8x7y2E", // class name
  bases__ZN3ccc7CC8x7y2E, 2,
  &(vtc__ZN3ccc7CC8x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y3  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x7y33abcEv
  ~CC8x7y3(); // tgen
  CC8x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y3E[];
extern void _ZN3ccc7CC8x7y33efgEv();
extern void _ZN3ccc7CC8x7y33abcEv();
extern void _ZN3ccc7CC8x7y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y33abcEv,_ZThn4_N3ccc7CC8x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y33pqrEv,_ZThn4_N3ccc7CC8x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y33abcEv,_ZThn4_N3ccc7CC8x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y33pqrEv,_ZThn4_N3ccc7CC8x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y3E[];
Class_Descriptor cd__ZN3ccc7CC8x7y3E = {  "_ZN3ccc7CC8x7y3E", // class name
  bases__ZN3ccc7CC8x7y3E, 2,
  &(vtc__ZN3ccc7CC8x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y4  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC8x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y43efgEv
  ~CC8x7y4(); // tgen
  CC8x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y4E[];
extern void _ZN3ccc7CC8x7y43efgEv();
extern void _ZN3ccc7CC8x7y43abcEv();
extern void _ZN3ccc7CC8x7y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y43abcEv,_ZThn4_N3ccc7CC8x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y43pqrEv,_ZThn4_N3ccc7CC8x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y43abcEv,_ZThn4_N3ccc7CC8x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y43pqrEv,_ZThn4_N3ccc7CC8x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y4E[];
Class_Descriptor cd__ZN3ccc7CC8x7y4E = {  "_ZN3ccc7CC8x7y4E", // class name
  bases__ZN3ccc7CC8x7y4E, 2,
  &(vtc__ZN3ccc7CC8x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y5  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC8x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y53abcEv
  ~CC8x7y5(); // tgen
  CC8x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y5E[];
extern void _ZN3ccc7CC8x7y53efgEv();
extern void _ZN3ccc7CC8x7y53abcEv();
extern void _ZN3ccc7CC8x7y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y53abcEv,_ZThn4_N3ccc7CC8x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y53pqrEv,_ZThn4_N3ccc7CC8x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y53abcEv,_ZThn4_N3ccc7CC8x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y53pqrEv,_ZThn4_N3ccc7CC8x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y5E[];
Class_Descriptor cd__ZN3ccc7CC8x7y5E = {  "_ZN3ccc7CC8x7y5E", // class name
  bases__ZN3ccc7CC8x7y5E, 2,
  &(vtc__ZN3ccc7CC8x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y6  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y63efgEv
  ~CC8x7y6(); // tgen
  CC8x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y6E[];
extern void _ZN3ccc7CC8x7y63efgEv();
extern void _ZN3ccc7CC8x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y63abcEv,_ZThn4_N3ccc7CC8x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y63abcEv,_ZThn4_N3ccc7CC8x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y6E[];
Class_Descriptor cd__ZN3ccc7CC8x7y6E = {  "_ZN3ccc7CC8x7y6E", // class name
  bases__ZN3ccc7CC8x7y6E, 2,
  &(vtc__ZN3ccc7CC8x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y7  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y73pqrEv
  ~CC8x7y7(); // tgen
  CC8x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x7y73abcEv();
extern void _ZN3ccc7CC8x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y73abcEv,_ZThn4_N3ccc7CC8x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y73pqrEv,_ZThn4_N3ccc7CC8x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y73abcEv,_ZThn4_N3ccc7CC8x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y73pqrEv,_ZThn4_N3ccc7CC8x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y7E[];
Class_Descriptor cd__ZN3ccc7CC8x7y7E = {  "_ZN3ccc7CC8x7y7E", // class name
  bases__ZN3ccc7CC8x7y7E, 2,
  &(vtc__ZN3ccc7CC8x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y8  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y83abcEv
  ~CC8x7y8(); // tgen
  CC8x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y8E[];
extern void _ZN3ccc7CC8x7y83efgEv();
extern void _ZN3ccc7CC8x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y83abcEv,_ZThn4_N3ccc7CC8x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y83abcEv,_ZThn4_N3ccc7CC8x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y8E[];
Class_Descriptor cd__ZN3ccc7CC8x7y8E = {  "_ZN3ccc7CC8x7y8E", // class name
  bases__ZN3ccc7CC8x7y8E, 2,
  &(vtc__ZN3ccc7CC8x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y9  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y93pqrEv
  ~CC8x7y9(); // tgen
  CC8x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y9E[];
extern void _ZN3ccc7CC8x7y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y93pqrEv,_ZThn4_N3ccc7CC8x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x7y93pqrEv,_ZThn4_N3ccc7CC8x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y9E[];
Class_Descriptor cd__ZN3ccc7CC8x7y9E = {  "_ZN3ccc7CC8x7y9E", // class name
  bases__ZN3ccc7CC8x7y9E, 2,
  &(vtc__ZN3ccc7CC8x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y10  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x7y103abcEv
  ~CC8x7y10(); // tgen
  CC8x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x7y103abcEv();
extern void _ZN3ccc8CC8x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y103abcEv,_ZThn4_N3ccc8CC8x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y103pqrEv,_ZThn4_N3ccc8CC8x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x7y103abcEv,_ZThn4_N3ccc8CC8x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x7y103pqrEv,_ZThn4_N3ccc8CC8x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y10E[];
Class_Descriptor cd__ZN3ccc8CC8x7y10E = {  "_ZN3ccc8CC8x7y10E", // class name
  bases__ZN3ccc8CC8x7y10E, 2,
  &(vtc__ZN3ccc8CC8x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y11  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x7y113efgEv
  ~CC8x7y11(); // tgen
  CC8x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y11E[];
extern void _ZN3ccc8CC8x7y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y113pqrEv,_ZThn4_N3ccc8CC8x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x7y113pqrEv,_ZThn4_N3ccc8CC8x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y11E[];
Class_Descriptor cd__ZN3ccc8CC8x7y11E = {  "_ZN3ccc8CC8x7y11E", // class name
  bases__ZN3ccc8CC8x7y11E, 2,
  &(vtc__ZN3ccc8CC8x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y12  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC8x7y123abcEv
  ~CC8x7y12(); // tgen
  CC8x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y123abcEv,_ZThn4_N3ccc8CC8x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x7y123abcEv,_ZThn4_N3ccc8CC8x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y12E[];
Class_Descriptor cd__ZN3ccc8CC8x7y12E = {  "_ZN3ccc8CC8x7y12E", // class name
  bases__ZN3ccc8CC8x7y12E, 2,
  &(vtc__ZN3ccc8CC8x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y13  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC8x7y133efgEv
  ~CC8x7y13(); // tgen
  CC8x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y13E[];
extern void _ZN3ccc8CC8x7y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y13E[];
Class_Descriptor cd__ZN3ccc8CC8x7y13E = {  "_ZN3ccc8CC8x7y13E", // class name
  bases__ZN3ccc8CC8x7y13E, 2,
  &(vtc__ZN3ccc8CC8x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y14  : ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y143pqrEv
  ~CC8x7y14(); // tgen
  CC8x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y143pqrEv,_ZThn4_N3ccc8CC8x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x7y143pqrEv,_ZThn4_N3ccc8CC8x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y14E[];
Class_Descriptor cd__ZN3ccc8CC8x7y14E = {  "_ZN3ccc8CC8x7y14E", // class name
  bases__ZN3ccc8CC8x7y14E, 2,
  &(vtc__ZN3ccc8CC8x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x7y15  : ::ccc::AA8 , ::ccc::BB7 {
  ~CC8x7y15(); // tgen
  CC8x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y15E[];
Class_Descriptor cd__ZN3ccc8CC8x7y15E = {  "_ZN3ccc8CC8x7y15E", // class name
  bases__ZN3ccc8CC8x7y15E, 2,
  &(vtc__ZN3ccc8CC8x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y0  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y03pqrEv
  ~CC8x8y0(); // tgen
  CC8x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y0E[];
extern void _ZN3ccc7CC8x8y03efgEv();
extern void _ZN3ccc7CC8x8y03abcEv();
extern void _ZN3ccc7CC8x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y03efgEv,_ZThn4_N3ccc7CC8x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y03abcEv,_ZThn4_N3ccc7CC8x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y03efgEv,_ZThn4_N3ccc7CC8x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y03abcEv,_ZThn4_N3ccc7CC8x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y0E[];
Class_Descriptor cd__ZN3ccc7CC8x8y0E = {  "_ZN3ccc7CC8x8y0E", // class name
  bases__ZN3ccc7CC8x8y0E, 2,
  &(vtc__ZN3ccc7CC8x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y1  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x8y13efgEv
  ~CC8x8y1(); // tgen
  CC8x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y1E[];
extern void _ZN3ccc7CC8x8y13efgEv();
extern void _ZN3ccc7CC8x8y13abcEv();
extern void _ZN3ccc7CC8x8y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y13efgEv,_ZThn4_N3ccc7CC8x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y13abcEv,_ZThn4_N3ccc7CC8x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y13efgEv,_ZThn4_N3ccc7CC8x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y13abcEv,_ZThn4_N3ccc7CC8x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y1E[];
Class_Descriptor cd__ZN3ccc7CC8x8y1E = {  "_ZN3ccc7CC8x8y1E", // class name
  bases__ZN3ccc7CC8x8y1E, 2,
  &(vtc__ZN3ccc7CC8x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y2  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y23pqrEv
  ~CC8x8y2(); // tgen
  CC8x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y2E[];
extern void _ZN3ccc7CC8x8y23efgEv();
extern void _ZN3ccc7CC8x8y23abcEv();
extern void _ZN3ccc7CC8x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y23efgEv,_ZThn4_N3ccc7CC8x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y23abcEv,_ZThn4_N3ccc7CC8x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y23efgEv,_ZThn4_N3ccc7CC8x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y23abcEv,_ZThn4_N3ccc7CC8x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y2E[];
Class_Descriptor cd__ZN3ccc7CC8x8y2E = {  "_ZN3ccc7CC8x8y2E", // class name
  bases__ZN3ccc7CC8x8y2E, 2,
  &(vtc__ZN3ccc7CC8x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y3  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x8y33abcEv
  ~CC8x8y3(); // tgen
  CC8x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y3E[];
extern void _ZN3ccc7CC8x8y33efgEv();
extern void _ZN3ccc7CC8x8y33abcEv();
extern void _ZN3ccc7CC8x8y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y33efgEv,_ZThn4_N3ccc7CC8x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y33abcEv,_ZThn4_N3ccc7CC8x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y33efgEv,_ZThn4_N3ccc7CC8x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y33abcEv,_ZThn4_N3ccc7CC8x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y3E[];
Class_Descriptor cd__ZN3ccc7CC8x8y3E = {  "_ZN3ccc7CC8x8y3E", // class name
  bases__ZN3ccc7CC8x8y3E, 2,
  &(vtc__ZN3ccc7CC8x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y4  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC8x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y43efgEv
  ~CC8x8y4(); // tgen
  CC8x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y4E[];
extern void _ZN3ccc7CC8x8y43efgEv();
extern void _ZN3ccc7CC8x8y43abcEv();
extern void _ZN3ccc7CC8x8y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y43efgEv,_ZThn4_N3ccc7CC8x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y43abcEv,_ZThn4_N3ccc7CC8x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y43efgEv,_ZThn4_N3ccc7CC8x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y43abcEv,_ZThn4_N3ccc7CC8x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y4E[];
Class_Descriptor cd__ZN3ccc7CC8x8y4E = {  "_ZN3ccc7CC8x8y4E", // class name
  bases__ZN3ccc7CC8x8y4E, 2,
  &(vtc__ZN3ccc7CC8x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y5  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC8x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y53abcEv
  ~CC8x8y5(); // tgen
  CC8x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y5E[];
extern void _ZN3ccc7CC8x8y53efgEv();
extern void _ZN3ccc7CC8x8y53abcEv();
extern void _ZN3ccc7CC8x8y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y53efgEv,_ZThn4_N3ccc7CC8x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y53abcEv,_ZThn4_N3ccc7CC8x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y53efgEv,_ZThn4_N3ccc7CC8x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y53abcEv,_ZThn4_N3ccc7CC8x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y5E[];
Class_Descriptor cd__ZN3ccc7CC8x8y5E = {  "_ZN3ccc7CC8x8y5E", // class name
  bases__ZN3ccc7CC8x8y5E, 2,
  &(vtc__ZN3ccc7CC8x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y6  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y63efgEv
  ~CC8x8y6(); // tgen
  CC8x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y6E[];
extern void _ZN3ccc7CC8x8y63efgEv();
extern void _ZN3ccc7CC8x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y63efgEv,_ZThn4_N3ccc7CC8x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y63abcEv,_ZThn4_N3ccc7CC8x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y63efgEv,_ZThn4_N3ccc7CC8x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y63abcEv,_ZThn4_N3ccc7CC8x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y6E[];
Class_Descriptor cd__ZN3ccc7CC8x8y6E = {  "_ZN3ccc7CC8x8y6E", // class name
  bases__ZN3ccc7CC8x8y6E, 2,
  &(vtc__ZN3ccc7CC8x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y7  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y73pqrEv
  ~CC8x8y7(); // tgen
  CC8x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x8y73abcEv();
extern void _ZN3ccc7CC8x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y73abcEv,_ZThn4_N3ccc7CC8x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y73abcEv,_ZThn4_N3ccc7CC8x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y7E[];
Class_Descriptor cd__ZN3ccc7CC8x8y7E = {  "_ZN3ccc7CC8x8y7E", // class name
  bases__ZN3ccc7CC8x8y7E, 2,
  &(vtc__ZN3ccc7CC8x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y8  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y83abcEv
  ~CC8x8y8(); // tgen
  CC8x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y8E[];
extern void _ZN3ccc7CC8x8y83efgEv();
extern void _ZN3ccc7CC8x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y83efgEv,_ZThn4_N3ccc7CC8x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y83abcEv,_ZThn4_N3ccc7CC8x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y83efgEv,_ZThn4_N3ccc7CC8x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y83abcEv,_ZThn4_N3ccc7CC8x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y8E[];
Class_Descriptor cd__ZN3ccc7CC8x8y8E = {  "_ZN3ccc7CC8x8y8E", // class name
  bases__ZN3ccc7CC8x8y8E, 2,
  &(vtc__ZN3ccc7CC8x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y9  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y93pqrEv
  ~CC8x8y9(); // tgen
  CC8x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y9E[];
extern void _ZN3ccc7CC8x8y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y93efgEv,_ZThn4_N3ccc7CC8x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x8y93efgEv,_ZThn4_N3ccc7CC8x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y9E[];
Class_Descriptor cd__ZN3ccc7CC8x8y9E = {  "_ZN3ccc7CC8x8y9E", // class name
  bases__ZN3ccc7CC8x8y9E, 2,
  &(vtc__ZN3ccc7CC8x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y10  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x8y103abcEv
  ~CC8x8y10(); // tgen
  CC8x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x8y103abcEv();
extern void _ZN3ccc8CC8x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y103abcEv,_ZThn4_N3ccc8CC8x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x8y103abcEv,_ZThn4_N3ccc8CC8x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y10E[];
Class_Descriptor cd__ZN3ccc8CC8x8y10E = {  "_ZN3ccc8CC8x8y10E", // class name
  bases__ZN3ccc8CC8x8y10E, 2,
  &(vtc__ZN3ccc8CC8x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y11  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x8y113efgEv
  ~CC8x8y11(); // tgen
  CC8x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y11E[];
extern void _ZN3ccc8CC8x8y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y113efgEv,_ZThn4_N3ccc8CC8x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x8y113efgEv,_ZThn4_N3ccc8CC8x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y11E[];
Class_Descriptor cd__ZN3ccc8CC8x8y11E = {  "_ZN3ccc8CC8x8y11E", // class name
  bases__ZN3ccc8CC8x8y11E, 2,
  &(vtc__ZN3ccc8CC8x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y12  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC8x8y123abcEv
  ~CC8x8y12(); // tgen
  CC8x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y123abcEv,_ZThn4_N3ccc8CC8x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x8y123abcEv,_ZThn4_N3ccc8CC8x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y12E[];
Class_Descriptor cd__ZN3ccc8CC8x8y12E = {  "_ZN3ccc8CC8x8y12E", // class name
  bases__ZN3ccc8CC8x8y12E, 2,
  &(vtc__ZN3ccc8CC8x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y13  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC8x8y133efgEv
  ~CC8x8y13(); // tgen
  CC8x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y13E[];
extern void _ZN3ccc8CC8x8y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y133efgEv,_ZThn4_N3ccc8CC8x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x8y133efgEv,_ZThn4_N3ccc8CC8x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y13E[];
Class_Descriptor cd__ZN3ccc8CC8x8y13E = {  "_ZN3ccc8CC8x8y13E", // class name
  bases__ZN3ccc8CC8x8y13E, 2,
  &(vtc__ZN3ccc8CC8x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y14  : ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y143pqrEv
  ~CC8x8y14(); // tgen
  CC8x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y14E[];
Class_Descriptor cd__ZN3ccc8CC8x8y14E = {  "_ZN3ccc8CC8x8y14E", // class name
  bases__ZN3ccc8CC8x8y14E, 2,
  &(vtc__ZN3ccc8CC8x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x8y15  : ::ccc::AA8 , ::ccc::BB8 {
  ~CC8x8y15(); // tgen
  CC8x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y15E[];
Class_Descriptor cd__ZN3ccc8CC8x8y15E = {  "_ZN3ccc8CC8x8y15E", // class name
  bases__ZN3ccc8CC8x8y15E, 2,
  &(vtc__ZN3ccc8CC8x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y0  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y03pqrEv
  ~CC8x9y0(); // tgen
  CC8x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y0E[];
extern void _ZN3ccc7CC8x9y03efgEv();
extern void _ZN3ccc7CC8x9y03abcEv();
extern void _ZN3ccc7CC8x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y03efgEv,_ZThn4_N3ccc7CC8x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y03pqrEv,_ZThn4_N3ccc7CC8x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y03efgEv,_ZThn4_N3ccc7CC8x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y03pqrEv,_ZThn4_N3ccc7CC8x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y0E[];
Class_Descriptor cd__ZN3ccc7CC8x9y0E = {  "_ZN3ccc7CC8x9y0E", // class name
  bases__ZN3ccc7CC8x9y0E, 2,
  &(vtc__ZN3ccc7CC8x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y1  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x9y13efgEv
  ~CC8x9y1(); // tgen
  CC8x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y1E[];
extern void _ZN3ccc7CC8x9y13efgEv();
extern void _ZN3ccc7CC8x9y13abcEv();
extern void _ZN3ccc7CC8x9y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y13efgEv,_ZThn4_N3ccc7CC8x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y13pqrEv,_ZThn4_N3ccc7CC8x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y13efgEv,_ZThn4_N3ccc7CC8x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y13pqrEv,_ZThn4_N3ccc7CC8x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y1E[];
Class_Descriptor cd__ZN3ccc7CC8x9y1E = {  "_ZN3ccc7CC8x9y1E", // class name
  bases__ZN3ccc7CC8x9y1E, 2,
  &(vtc__ZN3ccc7CC8x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y2  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y23pqrEv
  ~CC8x9y2(); // tgen
  CC8x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y2E[];
extern void _ZN3ccc7CC8x9y23efgEv();
extern void _ZN3ccc7CC8x9y23abcEv();
extern void _ZN3ccc7CC8x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y23efgEv,_ZThn4_N3ccc7CC8x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y23pqrEv,_ZThn4_N3ccc7CC8x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y23efgEv,_ZThn4_N3ccc7CC8x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y23pqrEv,_ZThn4_N3ccc7CC8x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y2E[];
Class_Descriptor cd__ZN3ccc7CC8x9y2E = {  "_ZN3ccc7CC8x9y2E", // class name
  bases__ZN3ccc7CC8x9y2E, 2,
  &(vtc__ZN3ccc7CC8x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y3  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x9y33abcEv
  ~CC8x9y3(); // tgen
  CC8x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y3E[];
extern void _ZN3ccc7CC8x9y33efgEv();
extern void _ZN3ccc7CC8x9y33abcEv();
extern void _ZN3ccc7CC8x9y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y33efgEv,_ZThn4_N3ccc7CC8x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y33pqrEv,_ZThn4_N3ccc7CC8x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y33efgEv,_ZThn4_N3ccc7CC8x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y33pqrEv,_ZThn4_N3ccc7CC8x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y3E[];
Class_Descriptor cd__ZN3ccc7CC8x9y3E = {  "_ZN3ccc7CC8x9y3E", // class name
  bases__ZN3ccc7CC8x9y3E, 2,
  &(vtc__ZN3ccc7CC8x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y4  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC8x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y43efgEv
  ~CC8x9y4(); // tgen
  CC8x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y4E[];
extern void _ZN3ccc7CC8x9y43efgEv();
extern void _ZN3ccc7CC8x9y43abcEv();
extern void _ZN3ccc7CC8x9y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y43efgEv,_ZThn4_N3ccc7CC8x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y43pqrEv,_ZThn4_N3ccc7CC8x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y43efgEv,_ZThn4_N3ccc7CC8x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y43pqrEv,_ZThn4_N3ccc7CC8x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y4E[];
Class_Descriptor cd__ZN3ccc7CC8x9y4E = {  "_ZN3ccc7CC8x9y4E", // class name
  bases__ZN3ccc7CC8x9y4E, 2,
  &(vtc__ZN3ccc7CC8x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y5  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC8x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y53abcEv
  ~CC8x9y5(); // tgen
  CC8x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y5E[];
extern void _ZN3ccc7CC8x9y53efgEv();
extern void _ZN3ccc7CC8x9y53abcEv();
extern void _ZN3ccc7CC8x9y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y53efgEv,_ZThn4_N3ccc7CC8x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y53pqrEv,_ZThn4_N3ccc7CC8x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y53efgEv,_ZThn4_N3ccc7CC8x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y53pqrEv,_ZThn4_N3ccc7CC8x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y5E[];
Class_Descriptor cd__ZN3ccc7CC8x9y5E = {  "_ZN3ccc7CC8x9y5E", // class name
  bases__ZN3ccc7CC8x9y5E, 2,
  &(vtc__ZN3ccc7CC8x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y6  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y63efgEv
  ~CC8x9y6(); // tgen
  CC8x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y6E[];
extern void _ZN3ccc7CC8x9y63efgEv();
extern void _ZN3ccc7CC8x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y63efgEv,_ZThn4_N3ccc7CC8x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y63efgEv,_ZThn4_N3ccc7CC8x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y6E[];
Class_Descriptor cd__ZN3ccc7CC8x9y6E = {  "_ZN3ccc7CC8x9y6E", // class name
  bases__ZN3ccc7CC8x9y6E, 2,
  &(vtc__ZN3ccc7CC8x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y7  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y73pqrEv
  ~CC8x9y7(); // tgen
  CC8x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7CC8x9y73abcEv();
extern void _ZN3ccc7CC8x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y73pqrEv,_ZThn4_N3ccc7CC8x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y73pqrEv,_ZThn4_N3ccc7CC8x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y7E[];
Class_Descriptor cd__ZN3ccc7CC8x9y7E = {  "_ZN3ccc7CC8x9y7E", // class name
  bases__ZN3ccc7CC8x9y7E, 2,
  &(vtc__ZN3ccc7CC8x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y8  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y83abcEv
  ~CC8x9y8(); // tgen
  CC8x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y8E[];
extern void _ZN3ccc7CC8x9y83efgEv();
extern void _ZN3ccc7CC8x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y83efgEv,_ZThn4_N3ccc7CC8x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y83efgEv,_ZThn4_N3ccc7CC8x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y8E[];
Class_Descriptor cd__ZN3ccc7CC8x9y8E = {  "_ZN3ccc7CC8x9y8E", // class name
  bases__ZN3ccc7CC8x9y8E, 2,
  &(vtc__ZN3ccc7CC8x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y9  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y93pqrEv
  ~CC8x9y9(); // tgen
  CC8x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC8x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y9E[];
extern void _ZN3ccc7CC8x9y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7CC8x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y93efgEv,_ZThn4_N3ccc7CC8x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y93pqrEv,_ZThn4_N3ccc7CC8x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y93efgEv,_ZThn4_N3ccc7CC8x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC8x9y93pqrEv,_ZThn4_N3ccc7CC8x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y9E[];
Class_Descriptor cd__ZN3ccc7CC8x9y9E = {  "_ZN3ccc7CC8x9y9E", // class name
  bases__ZN3ccc7CC8x9y9E, 2,
  &(vtc__ZN3ccc7CC8x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y10  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x9y103abcEv
  ~CC8x9y10(); // tgen
  CC8x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x9y103abcEv();
extern void _ZN3ccc8CC8x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y103pqrEv,_ZThn4_N3ccc8CC8x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x9y103pqrEv,_ZThn4_N3ccc8CC8x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y10E[];
Class_Descriptor cd__ZN3ccc8CC8x9y10E = {  "_ZN3ccc8CC8x9y10E", // class name
  bases__ZN3ccc8CC8x9y10E, 2,
  &(vtc__ZN3ccc8CC8x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y11  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x9y113efgEv
  ~CC8x9y11(); // tgen
  CC8x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y11E[];
extern void _ZN3ccc8CC8x9y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y113efgEv,_ZThn4_N3ccc8CC8x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y113pqrEv,_ZThn4_N3ccc8CC8x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x9y113efgEv,_ZThn4_N3ccc8CC8x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x9y113pqrEv,_ZThn4_N3ccc8CC8x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y11E[];
Class_Descriptor cd__ZN3ccc8CC8x9y11E = {  "_ZN3ccc8CC8x9y11E", // class name
  bases__ZN3ccc8CC8x9y11E, 2,
  &(vtc__ZN3ccc8CC8x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y12  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC8x9y123abcEv
  ~CC8x9y12(); // tgen
  CC8x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y12E[];
Class_Descriptor cd__ZN3ccc8CC8x9y12E = {  "_ZN3ccc8CC8x9y12E", // class name
  bases__ZN3ccc8CC8x9y12E, 2,
  &(vtc__ZN3ccc8CC8x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y13  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC8x9y133efgEv
  ~CC8x9y13(); // tgen
  CC8x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y13E[];
extern void _ZN3ccc8CC8x9y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y133efgEv,_ZThn4_N3ccc8CC8x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x9y133efgEv,_ZThn4_N3ccc8CC8x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y13E[];
Class_Descriptor cd__ZN3ccc8CC8x9y13E = {  "_ZN3ccc8CC8x9y13E", // class name
  bases__ZN3ccc8CC8x9y13E, 2,
  &(vtc__ZN3ccc8CC8x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y14  : ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y143pqrEv
  ~CC8x9y14(); // tgen
  CC8x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y143pqrEv,_ZThn4_N3ccc8CC8x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x9y143pqrEv,_ZThn4_N3ccc8CC8x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y14E[];
Class_Descriptor cd__ZN3ccc8CC8x9y14E = {  "_ZN3ccc8CC8x9y14E", // class name
  bases__ZN3ccc8CC8x9y14E, 2,
  &(vtc__ZN3ccc8CC8x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x9y15  : ::ccc::AA8 , ::ccc::BB9 {
  ~CC8x9y15(); // tgen
  CC8x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y15E[];
Class_Descriptor cd__ZN3ccc8CC8x9y15E = {  "_ZN3ccc8CC8x9y15E", // class name
  bases__ZN3ccc8CC8x9y15E, 2,
  &(vtc__ZN3ccc8CC8x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y0  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y03pqrEv
  ~CC8x10y0(); // tgen
  CC8x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y0E[];
extern void _ZN3ccc8CC8x10y03efgEv();
extern void _ZN3ccc8CC8x10y03abcEv();
extern void _ZN3ccc8CC8x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y03pqrEv,_ZThn4_N3ccc8CC8x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y03abcEv,_ZThn4_N3ccc8CC8x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y03pqrEv,_ZThn4_N3ccc8CC8x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y03abcEv,_ZThn4_N3ccc8CC8x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y0E[];
Class_Descriptor cd__ZN3ccc8CC8x10y0E = {  "_ZN3ccc8CC8x10y0E", // class name
  bases__ZN3ccc8CC8x10y0E, 2,
  &(vtc__ZN3ccc8CC8x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y1  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x10y13efgEv
  ~CC8x10y1(); // tgen
  CC8x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y1E[];
extern void _ZN3ccc8CC8x10y13efgEv();
extern void _ZN3ccc8CC8x10y13abcEv();
extern void _ZN3ccc8CC8x10y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y13pqrEv,_ZThn4_N3ccc8CC8x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y13abcEv,_ZThn4_N3ccc8CC8x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y13pqrEv,_ZThn4_N3ccc8CC8x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y13abcEv,_ZThn4_N3ccc8CC8x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y1E[];
Class_Descriptor cd__ZN3ccc8CC8x10y1E = {  "_ZN3ccc8CC8x10y1E", // class name
  bases__ZN3ccc8CC8x10y1E, 2,
  &(vtc__ZN3ccc8CC8x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y2  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y23pqrEv
  ~CC8x10y2(); // tgen
  CC8x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y2E[];
extern void _ZN3ccc8CC8x10y23efgEv();
extern void _ZN3ccc8CC8x10y23abcEv();
extern void _ZN3ccc8CC8x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y23pqrEv,_ZThn4_N3ccc8CC8x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y23abcEv,_ZThn4_N3ccc8CC8x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y23pqrEv,_ZThn4_N3ccc8CC8x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y23abcEv,_ZThn4_N3ccc8CC8x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y2E[];
Class_Descriptor cd__ZN3ccc8CC8x10y2E = {  "_ZN3ccc8CC8x10y2E", // class name
  bases__ZN3ccc8CC8x10y2E, 2,
  &(vtc__ZN3ccc8CC8x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y3  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x10y33abcEv
  ~CC8x10y3(); // tgen
  CC8x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y3E[];
extern void _ZN3ccc8CC8x10y33efgEv();
extern void _ZN3ccc8CC8x10y33abcEv();
extern void _ZN3ccc8CC8x10y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y33pqrEv,_ZThn4_N3ccc8CC8x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y33abcEv,_ZThn4_N3ccc8CC8x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y33pqrEv,_ZThn4_N3ccc8CC8x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y33abcEv,_ZThn4_N3ccc8CC8x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y3E[];
Class_Descriptor cd__ZN3ccc8CC8x10y3E = {  "_ZN3ccc8CC8x10y3E", // class name
  bases__ZN3ccc8CC8x10y3E, 2,
  &(vtc__ZN3ccc8CC8x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y4  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC8x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y43efgEv
  ~CC8x10y4(); // tgen
  CC8x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y4E[];
extern void _ZN3ccc8CC8x10y43efgEv();
extern void _ZN3ccc8CC8x10y43abcEv();
extern void _ZN3ccc8CC8x10y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y43pqrEv,_ZThn4_N3ccc8CC8x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y43abcEv,_ZThn4_N3ccc8CC8x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y43pqrEv,_ZThn4_N3ccc8CC8x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y43abcEv,_ZThn4_N3ccc8CC8x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y4E[];
Class_Descriptor cd__ZN3ccc8CC8x10y4E = {  "_ZN3ccc8CC8x10y4E", // class name
  bases__ZN3ccc8CC8x10y4E, 2,
  &(vtc__ZN3ccc8CC8x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y5  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC8x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y53abcEv
  ~CC8x10y5(); // tgen
  CC8x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y5E[];
extern void _ZN3ccc8CC8x10y53efgEv();
extern void _ZN3ccc8CC8x10y53abcEv();
extern void _ZN3ccc8CC8x10y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y53pqrEv,_ZThn4_N3ccc8CC8x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y53abcEv,_ZThn4_N3ccc8CC8x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y53pqrEv,_ZThn4_N3ccc8CC8x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y53abcEv,_ZThn4_N3ccc8CC8x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y5E[];
Class_Descriptor cd__ZN3ccc8CC8x10y5E = {  "_ZN3ccc8CC8x10y5E", // class name
  bases__ZN3ccc8CC8x10y5E, 2,
  &(vtc__ZN3ccc8CC8x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y6  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y63efgEv
  ~CC8x10y6(); // tgen
  CC8x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y6E[];
extern void _ZN3ccc8CC8x10y63efgEv();
extern void _ZN3ccc8CC8x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y63abcEv,_ZThn4_N3ccc8CC8x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y63abcEv,_ZThn4_N3ccc8CC8x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y6E[];
Class_Descriptor cd__ZN3ccc8CC8x10y6E = {  "_ZN3ccc8CC8x10y6E", // class name
  bases__ZN3ccc8CC8x10y6E, 2,
  &(vtc__ZN3ccc8CC8x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y7  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y73pqrEv
  ~CC8x10y7(); // tgen
  CC8x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x10y73abcEv();
extern void _ZN3ccc8CC8x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y73pqrEv,_ZThn4_N3ccc8CC8x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y73abcEv,_ZThn4_N3ccc8CC8x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y73pqrEv,_ZThn4_N3ccc8CC8x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y73abcEv,_ZThn4_N3ccc8CC8x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y7E[];
Class_Descriptor cd__ZN3ccc8CC8x10y7E = {  "_ZN3ccc8CC8x10y7E", // class name
  bases__ZN3ccc8CC8x10y7E, 2,
  &(vtc__ZN3ccc8CC8x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y8  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y83abcEv
  ~CC8x10y8(); // tgen
  CC8x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y8E[];
extern void _ZN3ccc8CC8x10y83efgEv();
extern void _ZN3ccc8CC8x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y83abcEv,_ZThn4_N3ccc8CC8x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y83abcEv,_ZThn4_N3ccc8CC8x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y8E[];
Class_Descriptor cd__ZN3ccc8CC8x10y8E = {  "_ZN3ccc8CC8x10y8E", // class name
  bases__ZN3ccc8CC8x10y8E, 2,
  &(vtc__ZN3ccc8CC8x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y9  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y93pqrEv
  ~CC8x10y9(); // tgen
  CC8x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y9E[];
extern void _ZN3ccc8CC8x10y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y93pqrEv,_ZThn4_N3ccc8CC8x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x10y93pqrEv,_ZThn4_N3ccc8CC8x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y9E[];
Class_Descriptor cd__ZN3ccc8CC8x10y9E = {  "_ZN3ccc8CC8x10y9E", // class name
  bases__ZN3ccc8CC8x10y9E, 2,
  &(vtc__ZN3ccc8CC8x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y10  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x10y103abcEv
  ~CC8x10y10(); // tgen
  CC8x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x10y103abcEv();
extern void _ZN3ccc9CC8x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y103pqrEv,_ZThn4_N3ccc9CC8x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y103abcEv,_ZThn4_N3ccc9CC8x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x10y103pqrEv,_ZThn4_N3ccc9CC8x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x10y103abcEv,_ZThn4_N3ccc9CC8x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y10E[];
Class_Descriptor cd__ZN3ccc9CC8x10y10E = {  "_ZN3ccc9CC8x10y10E", // class name
  bases__ZN3ccc9CC8x10y10E, 2,
  &(vtc__ZN3ccc9CC8x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y11  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x10y113efgEv
  ~CC8x10y11(); // tgen
  CC8x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y11E[];
extern void _ZN3ccc9CC8x10y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y113pqrEv,_ZThn4_N3ccc9CC8x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x10y113pqrEv,_ZThn4_N3ccc9CC8x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y11E[];
Class_Descriptor cd__ZN3ccc9CC8x10y11E = {  "_ZN3ccc9CC8x10y11E", // class name
  bases__ZN3ccc9CC8x10y11E, 2,
  &(vtc__ZN3ccc9CC8x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y12  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC8x10y123abcEv
  ~CC8x10y12(); // tgen
  CC8x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y123abcEv,_ZThn4_N3ccc9CC8x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x10y123abcEv,_ZThn4_N3ccc9CC8x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y12E[];
Class_Descriptor cd__ZN3ccc9CC8x10y12E = {  "_ZN3ccc9CC8x10y12E", // class name
  bases__ZN3ccc9CC8x10y12E, 2,
  &(vtc__ZN3ccc9CC8x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y13  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC8x10y133efgEv
  ~CC8x10y13(); // tgen
  CC8x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y13E[];
extern void _ZN3ccc9CC8x10y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y13E[];
Class_Descriptor cd__ZN3ccc9CC8x10y13E = {  "_ZN3ccc9CC8x10y13E", // class name
  bases__ZN3ccc9CC8x10y13E, 2,
  &(vtc__ZN3ccc9CC8x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y14  : ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y143pqrEv
  ~CC8x10y14(); // tgen
  CC8x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y143pqrEv,_ZThn4_N3ccc9CC8x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x10y143pqrEv,_ZThn4_N3ccc9CC8x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y14E[];
Class_Descriptor cd__ZN3ccc9CC8x10y14E = {  "_ZN3ccc9CC8x10y14E", // class name
  bases__ZN3ccc9CC8x10y14E, 2,
  &(vtc__ZN3ccc9CC8x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x10y15  : ::ccc::AA8 , ::ccc::BB10 {
  ~CC8x10y15(); // tgen
  CC8x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y15E[];
Class_Descriptor cd__ZN3ccc9CC8x10y15E = {  "_ZN3ccc9CC8x10y15E", // class name
  bases__ZN3ccc9CC8x10y15E, 2,
  &(vtc__ZN3ccc9CC8x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y0  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y03pqrEv
  ~CC8x11y0(); // tgen
  CC8x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y0E[];
extern void _ZN3ccc8CC8x11y03efgEv();
extern void _ZN3ccc8CC8x11y03abcEv();
extern void _ZN3ccc8CC8x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y03pqrEv,_ZThn4_N3ccc8CC8x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y03efgEv,_ZThn4_N3ccc8CC8x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y03pqrEv,_ZThn4_N3ccc8CC8x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y03efgEv,_ZThn4_N3ccc8CC8x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y0E[];
Class_Descriptor cd__ZN3ccc8CC8x11y0E = {  "_ZN3ccc8CC8x11y0E", // class name
  bases__ZN3ccc8CC8x11y0E, 2,
  &(vtc__ZN3ccc8CC8x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y1  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x11y13efgEv
  ~CC8x11y1(); // tgen
  CC8x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y1E[];
extern void _ZN3ccc8CC8x11y13efgEv();
extern void _ZN3ccc8CC8x11y13abcEv();
extern void _ZN3ccc8CC8x11y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y13pqrEv,_ZThn4_N3ccc8CC8x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y13efgEv,_ZThn4_N3ccc8CC8x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y13pqrEv,_ZThn4_N3ccc8CC8x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y13efgEv,_ZThn4_N3ccc8CC8x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y1E[];
Class_Descriptor cd__ZN3ccc8CC8x11y1E = {  "_ZN3ccc8CC8x11y1E", // class name
  bases__ZN3ccc8CC8x11y1E, 2,
  &(vtc__ZN3ccc8CC8x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y2  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y23pqrEv
  ~CC8x11y2(); // tgen
  CC8x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y2E[];
extern void _ZN3ccc8CC8x11y23efgEv();
extern void _ZN3ccc8CC8x11y23abcEv();
extern void _ZN3ccc8CC8x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y23pqrEv,_ZThn4_N3ccc8CC8x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y23efgEv,_ZThn4_N3ccc8CC8x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y23pqrEv,_ZThn4_N3ccc8CC8x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y23efgEv,_ZThn4_N3ccc8CC8x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y2E[];
Class_Descriptor cd__ZN3ccc8CC8x11y2E = {  "_ZN3ccc8CC8x11y2E", // class name
  bases__ZN3ccc8CC8x11y2E, 2,
  &(vtc__ZN3ccc8CC8x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y3  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x11y33abcEv
  ~CC8x11y3(); // tgen
  CC8x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y3E[];
extern void _ZN3ccc8CC8x11y33efgEv();
extern void _ZN3ccc8CC8x11y33abcEv();
extern void _ZN3ccc8CC8x11y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y33pqrEv,_ZThn4_N3ccc8CC8x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y33efgEv,_ZThn4_N3ccc8CC8x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y33pqrEv,_ZThn4_N3ccc8CC8x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y33efgEv,_ZThn4_N3ccc8CC8x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y3E[];
Class_Descriptor cd__ZN3ccc8CC8x11y3E = {  "_ZN3ccc8CC8x11y3E", // class name
  bases__ZN3ccc8CC8x11y3E, 2,
  &(vtc__ZN3ccc8CC8x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y4  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC8x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y43efgEv
  ~CC8x11y4(); // tgen
  CC8x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y4E[];
extern void _ZN3ccc8CC8x11y43efgEv();
extern void _ZN3ccc8CC8x11y43abcEv();
extern void _ZN3ccc8CC8x11y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y43pqrEv,_ZThn4_N3ccc8CC8x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y43efgEv,_ZThn4_N3ccc8CC8x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y43pqrEv,_ZThn4_N3ccc8CC8x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y43efgEv,_ZThn4_N3ccc8CC8x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y4E[];
Class_Descriptor cd__ZN3ccc8CC8x11y4E = {  "_ZN3ccc8CC8x11y4E", // class name
  bases__ZN3ccc8CC8x11y4E, 2,
  &(vtc__ZN3ccc8CC8x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y5  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC8x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y53abcEv
  ~CC8x11y5(); // tgen
  CC8x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y5E[];
extern void _ZN3ccc8CC8x11y53efgEv();
extern void _ZN3ccc8CC8x11y53abcEv();
extern void _ZN3ccc8CC8x11y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y53pqrEv,_ZThn4_N3ccc8CC8x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y53efgEv,_ZThn4_N3ccc8CC8x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y53pqrEv,_ZThn4_N3ccc8CC8x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y53efgEv,_ZThn4_N3ccc8CC8x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y5E[];
Class_Descriptor cd__ZN3ccc8CC8x11y5E = {  "_ZN3ccc8CC8x11y5E", // class name
  bases__ZN3ccc8CC8x11y5E, 2,
  &(vtc__ZN3ccc8CC8x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y6  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y63efgEv
  ~CC8x11y6(); // tgen
  CC8x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y6E[];
extern void _ZN3ccc8CC8x11y63efgEv();
extern void _ZN3ccc8CC8x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y63efgEv,_ZThn4_N3ccc8CC8x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y63efgEv,_ZThn4_N3ccc8CC8x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y6E[];
Class_Descriptor cd__ZN3ccc8CC8x11y6E = {  "_ZN3ccc8CC8x11y6E", // class name
  bases__ZN3ccc8CC8x11y6E, 2,
  &(vtc__ZN3ccc8CC8x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y7  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y73pqrEv
  ~CC8x11y7(); // tgen
  CC8x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x11y73abcEv();
extern void _ZN3ccc8CC8x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y73pqrEv,_ZThn4_N3ccc8CC8x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y73pqrEv,_ZThn4_N3ccc8CC8x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y7E[];
Class_Descriptor cd__ZN3ccc8CC8x11y7E = {  "_ZN3ccc8CC8x11y7E", // class name
  bases__ZN3ccc8CC8x11y7E, 2,
  &(vtc__ZN3ccc8CC8x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y8  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y83abcEv
  ~CC8x11y8(); // tgen
  CC8x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y8E[];
extern void _ZN3ccc8CC8x11y83efgEv();
extern void _ZN3ccc8CC8x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y83efgEv,_ZThn4_N3ccc8CC8x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y83efgEv,_ZThn4_N3ccc8CC8x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y8E[];
Class_Descriptor cd__ZN3ccc8CC8x11y8E = {  "_ZN3ccc8CC8x11y8E", // class name
  bases__ZN3ccc8CC8x11y8E, 2,
  &(vtc__ZN3ccc8CC8x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y9  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y93pqrEv
  ~CC8x11y9(); // tgen
  CC8x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y9E[];
extern void _ZN3ccc8CC8x11y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y93pqrEv,_ZThn4_N3ccc8CC8x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y93efgEv,_ZThn4_N3ccc8CC8x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y93pqrEv,_ZThn4_N3ccc8CC8x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x11y93efgEv,_ZThn4_N3ccc8CC8x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y9E[];
Class_Descriptor cd__ZN3ccc8CC8x11y9E = {  "_ZN3ccc8CC8x11y9E", // class name
  bases__ZN3ccc8CC8x11y9E, 2,
  &(vtc__ZN3ccc8CC8x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y10  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x11y103abcEv
  ~CC8x11y10(); // tgen
  CC8x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x11y103abcEv();
extern void _ZN3ccc9CC8x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y103pqrEv,_ZThn4_N3ccc9CC8x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x11y103pqrEv,_ZThn4_N3ccc9CC8x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y10E[];
Class_Descriptor cd__ZN3ccc9CC8x11y10E = {  "_ZN3ccc9CC8x11y10E", // class name
  bases__ZN3ccc9CC8x11y10E, 2,
  &(vtc__ZN3ccc9CC8x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y11  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x11y113efgEv
  ~CC8x11y11(); // tgen
  CC8x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y11E[];
extern void _ZN3ccc9CC8x11y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y113pqrEv,_ZThn4_N3ccc9CC8x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y113efgEv,_ZThn4_N3ccc9CC8x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x11y113pqrEv,_ZThn4_N3ccc9CC8x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x11y113efgEv,_ZThn4_N3ccc9CC8x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y11E[];
Class_Descriptor cd__ZN3ccc9CC8x11y11E = {  "_ZN3ccc9CC8x11y11E", // class name
  bases__ZN3ccc9CC8x11y11E, 2,
  &(vtc__ZN3ccc9CC8x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y12  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC8x11y123abcEv
  ~CC8x11y12(); // tgen
  CC8x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y12E[];
Class_Descriptor cd__ZN3ccc9CC8x11y12E = {  "_ZN3ccc9CC8x11y12E", // class name
  bases__ZN3ccc9CC8x11y12E, 2,
  &(vtc__ZN3ccc9CC8x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y13  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC8x11y133efgEv
  ~CC8x11y13(); // tgen
  CC8x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y13E[];
extern void _ZN3ccc9CC8x11y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y133efgEv,_ZThn4_N3ccc9CC8x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x11y133efgEv,_ZThn4_N3ccc9CC8x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y13E[];
Class_Descriptor cd__ZN3ccc9CC8x11y13E = {  "_ZN3ccc9CC8x11y13E", // class name
  bases__ZN3ccc9CC8x11y13E, 2,
  &(vtc__ZN3ccc9CC8x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y14  : ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y143pqrEv
  ~CC8x11y14(); // tgen
  CC8x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y143pqrEv,_ZThn4_N3ccc9CC8x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x11y143pqrEv,_ZThn4_N3ccc9CC8x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y14E[];
Class_Descriptor cd__ZN3ccc9CC8x11y14E = {  "_ZN3ccc9CC8x11y14E", // class name
  bases__ZN3ccc9CC8x11y14E, 2,
  &(vtc__ZN3ccc9CC8x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x11y15  : ::ccc::AA8 , ::ccc::BB11 {
  ~CC8x11y15(); // tgen
  CC8x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y15E[];
Class_Descriptor cd__ZN3ccc9CC8x11y15E = {  "_ZN3ccc9CC8x11y15E", // class name
  bases__ZN3ccc9CC8x11y15E, 2,
  &(vtc__ZN3ccc9CC8x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y0  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y03pqrEv
  ~CC8x12y0(); // tgen
  CC8x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y0E[];
extern void _ZN3ccc8CC8x12y03efgEv();
extern void _ZN3ccc8CC8x12y03abcEv();
extern void _ZN3ccc8CC8x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y03abcEv,_ZThn4_N3ccc8CC8x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y03abcEv,_ZThn4_N3ccc8CC8x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y0E[];
Class_Descriptor cd__ZN3ccc8CC8x12y0E = {  "_ZN3ccc8CC8x12y0E", // class name
  bases__ZN3ccc8CC8x12y0E, 2,
  &(vtc__ZN3ccc8CC8x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y1  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x12y13efgEv
  ~CC8x12y1(); // tgen
  CC8x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y1E[];
extern void _ZN3ccc8CC8x12y13efgEv();
extern void _ZN3ccc8CC8x12y13abcEv();
extern void _ZN3ccc8CC8x12y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y13abcEv,_ZThn4_N3ccc8CC8x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y13abcEv,_ZThn4_N3ccc8CC8x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y1E[];
Class_Descriptor cd__ZN3ccc8CC8x12y1E = {  "_ZN3ccc8CC8x12y1E", // class name
  bases__ZN3ccc8CC8x12y1E, 2,
  &(vtc__ZN3ccc8CC8x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y2  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y23pqrEv
  ~CC8x12y2(); // tgen
  CC8x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y2E[];
extern void _ZN3ccc8CC8x12y23efgEv();
extern void _ZN3ccc8CC8x12y23abcEv();
extern void _ZN3ccc8CC8x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y23abcEv,_ZThn4_N3ccc8CC8x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y23abcEv,_ZThn4_N3ccc8CC8x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y2E[];
Class_Descriptor cd__ZN3ccc8CC8x12y2E = {  "_ZN3ccc8CC8x12y2E", // class name
  bases__ZN3ccc8CC8x12y2E, 2,
  &(vtc__ZN3ccc8CC8x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y3  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x12y33abcEv
  ~CC8x12y3(); // tgen
  CC8x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y3E[];
extern void _ZN3ccc8CC8x12y33efgEv();
extern void _ZN3ccc8CC8x12y33abcEv();
extern void _ZN3ccc8CC8x12y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y33abcEv,_ZThn4_N3ccc8CC8x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y33abcEv,_ZThn4_N3ccc8CC8x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y3E[];
Class_Descriptor cd__ZN3ccc8CC8x12y3E = {  "_ZN3ccc8CC8x12y3E", // class name
  bases__ZN3ccc8CC8x12y3E, 2,
  &(vtc__ZN3ccc8CC8x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y4  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC8x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y43efgEv
  ~CC8x12y4(); // tgen
  CC8x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y4E[];
extern void _ZN3ccc8CC8x12y43efgEv();
extern void _ZN3ccc8CC8x12y43abcEv();
extern void _ZN3ccc8CC8x12y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y43abcEv,_ZThn4_N3ccc8CC8x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y43abcEv,_ZThn4_N3ccc8CC8x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y4E[];
Class_Descriptor cd__ZN3ccc8CC8x12y4E = {  "_ZN3ccc8CC8x12y4E", // class name
  bases__ZN3ccc8CC8x12y4E, 2,
  &(vtc__ZN3ccc8CC8x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y5  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC8x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y53abcEv
  ~CC8x12y5(); // tgen
  CC8x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y5E[];
extern void _ZN3ccc8CC8x12y53efgEv();
extern void _ZN3ccc8CC8x12y53abcEv();
extern void _ZN3ccc8CC8x12y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y53abcEv,_ZThn4_N3ccc8CC8x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y53abcEv,_ZThn4_N3ccc8CC8x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y5E[];
Class_Descriptor cd__ZN3ccc8CC8x12y5E = {  "_ZN3ccc8CC8x12y5E", // class name
  bases__ZN3ccc8CC8x12y5E, 2,
  &(vtc__ZN3ccc8CC8x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y6  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y63efgEv
  ~CC8x12y6(); // tgen
  CC8x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y6E[];
extern void _ZN3ccc8CC8x12y63efgEv();
extern void _ZN3ccc8CC8x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y63abcEv,_ZThn4_N3ccc8CC8x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y63abcEv,_ZThn4_N3ccc8CC8x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y6E[];
Class_Descriptor cd__ZN3ccc8CC8x12y6E = {  "_ZN3ccc8CC8x12y6E", // class name
  bases__ZN3ccc8CC8x12y6E, 2,
  &(vtc__ZN3ccc8CC8x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y7  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y73pqrEv
  ~CC8x12y7(); // tgen
  CC8x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x12y73abcEv();
extern void _ZN3ccc8CC8x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y73abcEv,_ZThn4_N3ccc8CC8x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y73abcEv,_ZThn4_N3ccc8CC8x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y7E[];
Class_Descriptor cd__ZN3ccc8CC8x12y7E = {  "_ZN3ccc8CC8x12y7E", // class name
  bases__ZN3ccc8CC8x12y7E, 2,
  &(vtc__ZN3ccc8CC8x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y8  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y83abcEv
  ~CC8x12y8(); // tgen
  CC8x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y8E[];
extern void _ZN3ccc8CC8x12y83efgEv();
extern void _ZN3ccc8CC8x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y83abcEv,_ZThn4_N3ccc8CC8x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x12y83abcEv,_ZThn4_N3ccc8CC8x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y8E[];
Class_Descriptor cd__ZN3ccc8CC8x12y8E = {  "_ZN3ccc8CC8x12y8E", // class name
  bases__ZN3ccc8CC8x12y8E, 2,
  &(vtc__ZN3ccc8CC8x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y9  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y93pqrEv
  ~CC8x12y9(); // tgen
  CC8x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y9E[];
extern void _ZN3ccc8CC8x12y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y9E[];
Class_Descriptor cd__ZN3ccc8CC8x12y9E = {  "_ZN3ccc8CC8x12y9E", // class name
  bases__ZN3ccc8CC8x12y9E, 2,
  &(vtc__ZN3ccc8CC8x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y10  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x12y103abcEv
  ~CC8x12y10(); // tgen
  CC8x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x12y103abcEv();
extern void _ZN3ccc9CC8x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y103abcEv,_ZThn4_N3ccc9CC8x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x12y103abcEv,_ZThn4_N3ccc9CC8x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y10E[];
Class_Descriptor cd__ZN3ccc9CC8x12y10E = {  "_ZN3ccc9CC8x12y10E", // class name
  bases__ZN3ccc9CC8x12y10E, 2,
  &(vtc__ZN3ccc9CC8x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y11  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x12y113efgEv
  ~CC8x12y11(); // tgen
  CC8x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y11E[];
extern void _ZN3ccc9CC8x12y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y11E[];
Class_Descriptor cd__ZN3ccc9CC8x12y11E = {  "_ZN3ccc9CC8x12y11E", // class name
  bases__ZN3ccc9CC8x12y11E, 2,
  &(vtc__ZN3ccc9CC8x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y12  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC8x12y123abcEv
  ~CC8x12y12(); // tgen
  CC8x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y123abcEv,_ZThn4_N3ccc9CC8x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x12y123abcEv,_ZThn4_N3ccc9CC8x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y12E[];
Class_Descriptor cd__ZN3ccc9CC8x12y12E = {  "_ZN3ccc9CC8x12y12E", // class name
  bases__ZN3ccc9CC8x12y12E, 2,
  &(vtc__ZN3ccc9CC8x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y13  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC8x12y133efgEv
  ~CC8x12y13(); // tgen
  CC8x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y13E[];
extern void _ZN3ccc9CC8x12y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y13E[];
Class_Descriptor cd__ZN3ccc9CC8x12y13E = {  "_ZN3ccc9CC8x12y13E", // class name
  bases__ZN3ccc9CC8x12y13E, 2,
  &(vtc__ZN3ccc9CC8x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y14  : ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y143pqrEv
  ~CC8x12y14(); // tgen
  CC8x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y14E[];
Class_Descriptor cd__ZN3ccc9CC8x12y14E = {  "_ZN3ccc9CC8x12y14E", // class name
  bases__ZN3ccc9CC8x12y14E, 2,
  &(vtc__ZN3ccc9CC8x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x12y15  : ::ccc::AA8 , ::ccc::BB12 {
  ~CC8x12y15(); // tgen
  CC8x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y15E[];
Class_Descriptor cd__ZN3ccc9CC8x12y15E = {  "_ZN3ccc9CC8x12y15E", // class name
  bases__ZN3ccc9CC8x12y15E, 2,
  &(vtc__ZN3ccc9CC8x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y0  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y03pqrEv
  ~CC8x13y0(); // tgen
  CC8x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y0E[];
extern void _ZN3ccc8CC8x13y03efgEv();
extern void _ZN3ccc8CC8x13y03abcEv();
extern void _ZN3ccc8CC8x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y03efgEv,_ZThn4_N3ccc8CC8x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y03efgEv,_ZThn4_N3ccc8CC8x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y0E[];
Class_Descriptor cd__ZN3ccc8CC8x13y0E = {  "_ZN3ccc8CC8x13y0E", // class name
  bases__ZN3ccc8CC8x13y0E, 2,
  &(vtc__ZN3ccc8CC8x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y1  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x13y13efgEv
  ~CC8x13y1(); // tgen
  CC8x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y1E[];
extern void _ZN3ccc8CC8x13y13efgEv();
extern void _ZN3ccc8CC8x13y13abcEv();
extern void _ZN3ccc8CC8x13y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y13efgEv,_ZThn4_N3ccc8CC8x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y13efgEv,_ZThn4_N3ccc8CC8x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y1E[];
Class_Descriptor cd__ZN3ccc8CC8x13y1E = {  "_ZN3ccc8CC8x13y1E", // class name
  bases__ZN3ccc8CC8x13y1E, 2,
  &(vtc__ZN3ccc8CC8x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y2  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y23pqrEv
  ~CC8x13y2(); // tgen
  CC8x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y2E[];
extern void _ZN3ccc8CC8x13y23efgEv();
extern void _ZN3ccc8CC8x13y23abcEv();
extern void _ZN3ccc8CC8x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y23efgEv,_ZThn4_N3ccc8CC8x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y23efgEv,_ZThn4_N3ccc8CC8x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y2E[];
Class_Descriptor cd__ZN3ccc8CC8x13y2E = {  "_ZN3ccc8CC8x13y2E", // class name
  bases__ZN3ccc8CC8x13y2E, 2,
  &(vtc__ZN3ccc8CC8x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y3  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x13y33abcEv
  ~CC8x13y3(); // tgen
  CC8x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y3E[];
extern void _ZN3ccc8CC8x13y33efgEv();
extern void _ZN3ccc8CC8x13y33abcEv();
extern void _ZN3ccc8CC8x13y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y33efgEv,_ZThn4_N3ccc8CC8x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y33efgEv,_ZThn4_N3ccc8CC8x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y3E[];
Class_Descriptor cd__ZN3ccc8CC8x13y3E = {  "_ZN3ccc8CC8x13y3E", // class name
  bases__ZN3ccc8CC8x13y3E, 2,
  &(vtc__ZN3ccc8CC8x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y4  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC8x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y43efgEv
  ~CC8x13y4(); // tgen
  CC8x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y4E[];
extern void _ZN3ccc8CC8x13y43efgEv();
extern void _ZN3ccc8CC8x13y43abcEv();
extern void _ZN3ccc8CC8x13y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y43efgEv,_ZThn4_N3ccc8CC8x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y43efgEv,_ZThn4_N3ccc8CC8x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y4E[];
Class_Descriptor cd__ZN3ccc8CC8x13y4E = {  "_ZN3ccc8CC8x13y4E", // class name
  bases__ZN3ccc8CC8x13y4E, 2,
  &(vtc__ZN3ccc8CC8x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y5  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC8x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y53abcEv
  ~CC8x13y5(); // tgen
  CC8x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y5E[];
extern void _ZN3ccc8CC8x13y53efgEv();
extern void _ZN3ccc8CC8x13y53abcEv();
extern void _ZN3ccc8CC8x13y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y53efgEv,_ZThn4_N3ccc8CC8x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y53efgEv,_ZThn4_N3ccc8CC8x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y5E[];
Class_Descriptor cd__ZN3ccc8CC8x13y5E = {  "_ZN3ccc8CC8x13y5E", // class name
  bases__ZN3ccc8CC8x13y5E, 2,
  &(vtc__ZN3ccc8CC8x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y6  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y63efgEv
  ~CC8x13y6(); // tgen
  CC8x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y6E[];
extern void _ZN3ccc8CC8x13y63efgEv();
extern void _ZN3ccc8CC8x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y63efgEv,_ZThn4_N3ccc8CC8x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y63efgEv,_ZThn4_N3ccc8CC8x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y6E[];
Class_Descriptor cd__ZN3ccc8CC8x13y6E = {  "_ZN3ccc8CC8x13y6E", // class name
  bases__ZN3ccc8CC8x13y6E, 2,
  &(vtc__ZN3ccc8CC8x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y7  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y73pqrEv
  ~CC8x13y7(); // tgen
  CC8x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x13y73abcEv();
extern void _ZN3ccc8CC8x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y7E[];
Class_Descriptor cd__ZN3ccc8CC8x13y7E = {  "_ZN3ccc8CC8x13y7E", // class name
  bases__ZN3ccc8CC8x13y7E, 2,
  &(vtc__ZN3ccc8CC8x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y8  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y83abcEv
  ~CC8x13y8(); // tgen
  CC8x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y8E[];
extern void _ZN3ccc8CC8x13y83efgEv();
extern void _ZN3ccc8CC8x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y83efgEv,_ZThn4_N3ccc8CC8x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y83efgEv,_ZThn4_N3ccc8CC8x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y8E[];
Class_Descriptor cd__ZN3ccc8CC8x13y8E = {  "_ZN3ccc8CC8x13y8E", // class name
  bases__ZN3ccc8CC8x13y8E, 2,
  &(vtc__ZN3ccc8CC8x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y9  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y93pqrEv
  ~CC8x13y9(); // tgen
  CC8x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y9E[];
extern void _ZN3ccc8CC8x13y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y93efgEv,_ZThn4_N3ccc8CC8x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x13y93efgEv,_ZThn4_N3ccc8CC8x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y9E[];
Class_Descriptor cd__ZN3ccc8CC8x13y9E = {  "_ZN3ccc8CC8x13y9E", // class name
  bases__ZN3ccc8CC8x13y9E, 2,
  &(vtc__ZN3ccc8CC8x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y10  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x13y103abcEv
  ~CC8x13y10(); // tgen
  CC8x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x13y103abcEv();
extern void _ZN3ccc9CC8x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y10E[];
Class_Descriptor cd__ZN3ccc9CC8x13y10E = {  "_ZN3ccc9CC8x13y10E", // class name
  bases__ZN3ccc9CC8x13y10E, 2,
  &(vtc__ZN3ccc9CC8x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y11  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x13y113efgEv
  ~CC8x13y11(); // tgen
  CC8x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y11E[];
extern void _ZN3ccc9CC8x13y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y113efgEv,_ZThn4_N3ccc9CC8x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x13y113efgEv,_ZThn4_N3ccc9CC8x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y11E[];
Class_Descriptor cd__ZN3ccc9CC8x13y11E = {  "_ZN3ccc9CC8x13y11E", // class name
  bases__ZN3ccc9CC8x13y11E, 2,
  &(vtc__ZN3ccc9CC8x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y12  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC8x13y123abcEv
  ~CC8x13y12(); // tgen
  CC8x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y12E[];
Class_Descriptor cd__ZN3ccc9CC8x13y12E = {  "_ZN3ccc9CC8x13y12E", // class name
  bases__ZN3ccc9CC8x13y12E, 2,
  &(vtc__ZN3ccc9CC8x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y13  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC8x13y133efgEv
  ~CC8x13y13(); // tgen
  CC8x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y13E[];
extern void _ZN3ccc9CC8x13y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y133efgEv,_ZThn4_N3ccc9CC8x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x13y133efgEv,_ZThn4_N3ccc9CC8x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y13E[];
Class_Descriptor cd__ZN3ccc9CC8x13y13E = {  "_ZN3ccc9CC8x13y13E", // class name
  bases__ZN3ccc9CC8x13y13E, 2,
  &(vtc__ZN3ccc9CC8x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y14  : ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y143pqrEv
  ~CC8x13y14(); // tgen
  CC8x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y14E[];
Class_Descriptor cd__ZN3ccc9CC8x13y14E = {  "_ZN3ccc9CC8x13y14E", // class name
  bases__ZN3ccc9CC8x13y14E, 2,
  &(vtc__ZN3ccc9CC8x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x13y15  : ::ccc::AA8 , ::ccc::BB13 {
  ~CC8x13y15(); // tgen
  CC8x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y15E[];
Class_Descriptor cd__ZN3ccc9CC8x13y15E = {  "_ZN3ccc9CC8x13y15E", // class name
  bases__ZN3ccc9CC8x13y15E, 2,
  &(vtc__ZN3ccc9CC8x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y0  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y03pqrEv
  ~CC8x14y0(); // tgen
  CC8x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y0E[];
extern void _ZN3ccc8CC8x14y03efgEv();
extern void _ZN3ccc8CC8x14y03abcEv();
extern void _ZN3ccc8CC8x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y03pqrEv,_ZThn4_N3ccc8CC8x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y03pqrEv,_ZThn4_N3ccc8CC8x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y0E[];
Class_Descriptor cd__ZN3ccc8CC8x14y0E = {  "_ZN3ccc8CC8x14y0E", // class name
  bases__ZN3ccc8CC8x14y0E, 2,
  &(vtc__ZN3ccc8CC8x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y1  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x14y13efgEv
  ~CC8x14y1(); // tgen
  CC8x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y1E[];
extern void _ZN3ccc8CC8x14y13efgEv();
extern void _ZN3ccc8CC8x14y13abcEv();
extern void _ZN3ccc8CC8x14y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y13pqrEv,_ZThn4_N3ccc8CC8x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y13pqrEv,_ZThn4_N3ccc8CC8x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y1E[];
Class_Descriptor cd__ZN3ccc8CC8x14y1E = {  "_ZN3ccc8CC8x14y1E", // class name
  bases__ZN3ccc8CC8x14y1E, 2,
  &(vtc__ZN3ccc8CC8x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y2  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y23pqrEv
  ~CC8x14y2(); // tgen
  CC8x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y2E[];
extern void _ZN3ccc8CC8x14y23efgEv();
extern void _ZN3ccc8CC8x14y23abcEv();
extern void _ZN3ccc8CC8x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y23pqrEv,_ZThn4_N3ccc8CC8x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y23pqrEv,_ZThn4_N3ccc8CC8x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y2E[];
Class_Descriptor cd__ZN3ccc8CC8x14y2E = {  "_ZN3ccc8CC8x14y2E", // class name
  bases__ZN3ccc8CC8x14y2E, 2,
  &(vtc__ZN3ccc8CC8x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y3  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x14y33abcEv
  ~CC8x14y3(); // tgen
  CC8x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y3E[];
extern void _ZN3ccc8CC8x14y33efgEv();
extern void _ZN3ccc8CC8x14y33abcEv();
extern void _ZN3ccc8CC8x14y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y33pqrEv,_ZThn4_N3ccc8CC8x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y33pqrEv,_ZThn4_N3ccc8CC8x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y3E[];
Class_Descriptor cd__ZN3ccc8CC8x14y3E = {  "_ZN3ccc8CC8x14y3E", // class name
  bases__ZN3ccc8CC8x14y3E, 2,
  &(vtc__ZN3ccc8CC8x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y4  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC8x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y43efgEv
  ~CC8x14y4(); // tgen
  CC8x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y4E[];
extern void _ZN3ccc8CC8x14y43efgEv();
extern void _ZN3ccc8CC8x14y43abcEv();
extern void _ZN3ccc8CC8x14y43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y43pqrEv,_ZThn4_N3ccc8CC8x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y43pqrEv,_ZThn4_N3ccc8CC8x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y4E[];
Class_Descriptor cd__ZN3ccc8CC8x14y4E = {  "_ZN3ccc8CC8x14y4E", // class name
  bases__ZN3ccc8CC8x14y4E, 2,
  &(vtc__ZN3ccc8CC8x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y5  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC8x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y53abcEv
  ~CC8x14y5(); // tgen
  CC8x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y5E[];
extern void _ZN3ccc8CC8x14y53efgEv();
extern void _ZN3ccc8CC8x14y53abcEv();
extern void _ZN3ccc8CC8x14y53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y53pqrEv,_ZThn4_N3ccc8CC8x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y53pqrEv,_ZThn4_N3ccc8CC8x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y5E[];
Class_Descriptor cd__ZN3ccc8CC8x14y5E = {  "_ZN3ccc8CC8x14y5E", // class name
  bases__ZN3ccc8CC8x14y5E, 2,
  &(vtc__ZN3ccc8CC8x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y6  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y63efgEv
  ~CC8x14y6(); // tgen
  CC8x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y6E[];
extern void _ZN3ccc8CC8x14y63efgEv();
extern void _ZN3ccc8CC8x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y6E[];
Class_Descriptor cd__ZN3ccc8CC8x14y6E = {  "_ZN3ccc8CC8x14y6E", // class name
  bases__ZN3ccc8CC8x14y6E, 2,
  &(vtc__ZN3ccc8CC8x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y7  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y73pqrEv
  ~CC8x14y7(); // tgen
  CC8x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x14y73abcEv();
extern void _ZN3ccc8CC8x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y73pqrEv,_ZThn4_N3ccc8CC8x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y73pqrEv,_ZThn4_N3ccc8CC8x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y7E[];
Class_Descriptor cd__ZN3ccc8CC8x14y7E = {  "_ZN3ccc8CC8x14y7E", // class name
  bases__ZN3ccc8CC8x14y7E, 2,
  &(vtc__ZN3ccc8CC8x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y8  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y83abcEv
  ~CC8x14y8(); // tgen
  CC8x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y8E[];
extern void _ZN3ccc8CC8x14y83efgEv();
extern void _ZN3ccc8CC8x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y8E[];
Class_Descriptor cd__ZN3ccc8CC8x14y8E = {  "_ZN3ccc8CC8x14y8E", // class name
  bases__ZN3ccc8CC8x14y8E, 2,
  &(vtc__ZN3ccc8CC8x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y9  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y93pqrEv
  ~CC8x14y9(); // tgen
  CC8x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC8x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y9E[];
extern void _ZN3ccc8CC8x14y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y93pqrEv,_ZThn4_N3ccc8CC8x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC8x14y93pqrEv,_ZThn4_N3ccc8CC8x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y9E[];
Class_Descriptor cd__ZN3ccc8CC8x14y9E = {  "_ZN3ccc8CC8x14y9E", // class name
  bases__ZN3ccc8CC8x14y9E, 2,
  &(vtc__ZN3ccc8CC8x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y10  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x14y103abcEv
  ~CC8x14y10(); // tgen
  CC8x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x14y103abcEv();
extern void _ZN3ccc9CC8x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y103pqrEv,_ZThn4_N3ccc9CC8x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x14y103pqrEv,_ZThn4_N3ccc9CC8x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y10E[];
Class_Descriptor cd__ZN3ccc9CC8x14y10E = {  "_ZN3ccc9CC8x14y10E", // class name
  bases__ZN3ccc9CC8x14y10E, 2,
  &(vtc__ZN3ccc9CC8x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y11  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x14y113efgEv
  ~CC8x14y11(); // tgen
  CC8x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y11E[];
extern void _ZN3ccc9CC8x14y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y113pqrEv,_ZThn4_N3ccc9CC8x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x14y113pqrEv,_ZThn4_N3ccc9CC8x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y11E[];
Class_Descriptor cd__ZN3ccc9CC8x14y11E = {  "_ZN3ccc9CC8x14y11E", // class name
  bases__ZN3ccc9CC8x14y11E, 2,
  &(vtc__ZN3ccc9CC8x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y12  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC8x14y123abcEv
  ~CC8x14y12(); // tgen
  CC8x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y12E[];
Class_Descriptor cd__ZN3ccc9CC8x14y12E = {  "_ZN3ccc9CC8x14y12E", // class name
  bases__ZN3ccc9CC8x14y12E, 2,
  &(vtc__ZN3ccc9CC8x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y13  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC8x14y133efgEv
  ~CC8x14y13(); // tgen
  CC8x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y13E[];
extern void _ZN3ccc9CC8x14y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y13E[];
Class_Descriptor cd__ZN3ccc9CC8x14y13E = {  "_ZN3ccc9CC8x14y13E", // class name
  bases__ZN3ccc9CC8x14y13E, 2,
  &(vtc__ZN3ccc9CC8x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y14  : ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y143pqrEv
  ~CC8x14y14(); // tgen
  CC8x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y143pqrEv,_ZThn4_N3ccc9CC8x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC8x14y143pqrEv,_ZThn4_N3ccc9CC8x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y14E[];
Class_Descriptor cd__ZN3ccc9CC8x14y14E = {  "_ZN3ccc9CC8x14y14E", // class name
  bases__ZN3ccc9CC8x14y14E, 2,
  &(vtc__ZN3ccc9CC8x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x14y15  : ::ccc::AA8 , ::ccc::BB14 {
  ~CC8x14y15(); // tgen
  CC8x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC8x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y15E[];
Class_Descriptor cd__ZN3ccc9CC8x14y15E = {  "_ZN3ccc9CC8x14y15E", // class name
  bases__ZN3ccc9CC8x14y15E, 2,
  &(vtc__ZN3ccc9CC8x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y0  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y03pqrEv
  ~CC8x15y0(); // tgen
  CC8x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y0E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y0E[];
Class_Descriptor cd__ZN3ccc8CC8x15y0E = {  "_ZN3ccc8CC8x15y0E", // class name
  bases__ZN3ccc8CC8x15y0E, 2,
  &(vtc__ZN3ccc8CC8x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y1  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x15y13efgEv
  ~CC8x15y1(); // tgen
  CC8x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y1E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y1E[];
Class_Descriptor cd__ZN3ccc8CC8x15y1E = {  "_ZN3ccc8CC8x15y1E", // class name
  bases__ZN3ccc8CC8x15y1E, 2,
  &(vtc__ZN3ccc8CC8x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y2  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y23pqrEv
  ~CC8x15y2(); // tgen
  CC8x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y2E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y2E[];
Class_Descriptor cd__ZN3ccc8CC8x15y2E = {  "_ZN3ccc8CC8x15y2E", // class name
  bases__ZN3ccc8CC8x15y2E, 2,
  &(vtc__ZN3ccc8CC8x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y3  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x15y33abcEv
  ~CC8x15y3(); // tgen
  CC8x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y3E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y3E[];
Class_Descriptor cd__ZN3ccc8CC8x15y3E = {  "_ZN3ccc8CC8x15y3E", // class name
  bases__ZN3ccc8CC8x15y3E, 2,
  &(vtc__ZN3ccc8CC8x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y4  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC8x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y43efgEv
  ~CC8x15y4(); // tgen
  CC8x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y4E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y4E[];
Class_Descriptor cd__ZN3ccc8CC8x15y4E = {  "_ZN3ccc8CC8x15y4E", // class name
  bases__ZN3ccc8CC8x15y4E, 2,
  &(vtc__ZN3ccc8CC8x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y5  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC8x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y53abcEv
  ~CC8x15y5(); // tgen
  CC8x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y5E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y5E[];
Class_Descriptor cd__ZN3ccc8CC8x15y5E = {  "_ZN3ccc8CC8x15y5E", // class name
  bases__ZN3ccc8CC8x15y5E, 2,
  &(vtc__ZN3ccc8CC8x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y6  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y63efgEv
  ~CC8x15y6(); // tgen
  CC8x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y6E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y6E[];
Class_Descriptor cd__ZN3ccc8CC8x15y6E = {  "_ZN3ccc8CC8x15y6E", // class name
  bases__ZN3ccc8CC8x15y6E, 2,
  &(vtc__ZN3ccc8CC8x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y7  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y73pqrEv
  ~CC8x15y7(); // tgen
  CC8x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y7E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y7E[];
Class_Descriptor cd__ZN3ccc8CC8x15y7E = {  "_ZN3ccc8CC8x15y7E", // class name
  bases__ZN3ccc8CC8x15y7E, 2,
  &(vtc__ZN3ccc8CC8x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y8  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y83abcEv
  ~CC8x15y8(); // tgen
  CC8x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y8E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y8E[];
Class_Descriptor cd__ZN3ccc8CC8x15y8E = {  "_ZN3ccc8CC8x15y8E", // class name
  bases__ZN3ccc8CC8x15y8E, 2,
  &(vtc__ZN3ccc8CC8x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y9  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y93pqrEv
  ~CC8x15y9(); // tgen
  CC8x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y9E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y9E[];
Class_Descriptor cd__ZN3ccc8CC8x15y9E = {  "_ZN3ccc8CC8x15y9E", // class name
  bases__ZN3ccc8CC8x15y9E, 2,
  &(vtc__ZN3ccc8CC8x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y10  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x15y103abcEv
  ~CC8x15y10(); // tgen
  CC8x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y10E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y10E[];
Class_Descriptor cd__ZN3ccc9CC8x15y10E = {  "_ZN3ccc9CC8x15y10E", // class name
  bases__ZN3ccc9CC8x15y10E, 2,
  &(vtc__ZN3ccc9CC8x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y11  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x15y113efgEv
  ~CC8x15y11(); // tgen
  CC8x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y11E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y11E[];
Class_Descriptor cd__ZN3ccc9CC8x15y11E = {  "_ZN3ccc9CC8x15y11E", // class name
  bases__ZN3ccc9CC8x15y11E, 2,
  &(vtc__ZN3ccc9CC8x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y12  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC8x15y123abcEv
  ~CC8x15y12(); // tgen
  CC8x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y12E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y12E[];
Class_Descriptor cd__ZN3ccc9CC8x15y12E = {  "_ZN3ccc9CC8x15y12E", // class name
  bases__ZN3ccc9CC8x15y12E, 2,
  &(vtc__ZN3ccc9CC8x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y13  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC8x15y133efgEv
  ~CC8x15y13(); // tgen
  CC8x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y13E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y13E[];
Class_Descriptor cd__ZN3ccc9CC8x15y13E = {  "_ZN3ccc9CC8x15y13E", // class name
  bases__ZN3ccc9CC8x15y13E, 2,
  &(vtc__ZN3ccc9CC8x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y14  : ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y143pqrEv
  ~CC8x15y14(); // tgen
  CC8x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y14E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y14E[];
Class_Descriptor cd__ZN3ccc9CC8x15y14E = {  "_ZN3ccc9CC8x15y14E", // class name
  bases__ZN3ccc9CC8x15y14E, 2,
  &(vtc__ZN3ccc9CC8x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y15  : ::ccc::AA8 , ::ccc::BB15 {
  ~CC8x15y15(); // tgen
  CC8x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y15E) C1{ BC2{ 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
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y15E[];
Class_Descriptor cd__ZN3ccc9CC8x15y15E = {  "_ZN3ccc9CC8x15y15E", // class name
  bases__ZN3ccc9CC8x15y15E, 2,
  &(vtc__ZN3ccc9CC8x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y0  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y03pqrEv
  ~CC9x0y0(); // tgen
  CC9x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y0E[];
extern void _ZN3ccc7CC9x0y03efgEv();
extern void _ZN3ccc7CC9x0y03pqrEv();
extern void _ZN3ccc7CC9x0y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y03abcEv,_ZThn4_N3ccc7CC9x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y03efgEv,_ZThn4_N3ccc7CC9x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y03pqrEv,_ZThn4_N3ccc7CC9x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y03abcEv,_ZThn4_N3ccc7CC9x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y03efgEv,_ZThn4_N3ccc7CC9x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y03pqrEv,_ZThn4_N3ccc7CC9x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y0E[];
Class_Descriptor cd__ZN3ccc7CC9x0y0E = {  "_ZN3ccc7CC9x0y0E", // class name
  bases__ZN3ccc7CC9x0y0E, 2,
  &(vtc__ZN3ccc7CC9x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y1  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x0y13efgEv
  ~CC9x0y1(); // tgen
  CC9x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y1E[];
extern void _ZN3ccc7CC9x0y13efgEv();
extern void _ZN3ccc7CC9x0y13pqrEv();
extern void _ZN3ccc7CC9x0y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y13abcEv,_ZThn4_N3ccc7CC9x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y13efgEv,_ZThn4_N3ccc7CC9x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y13pqrEv,_ZThn4_N3ccc7CC9x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y13abcEv,_ZThn4_N3ccc7CC9x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y13efgEv,_ZThn4_N3ccc7CC9x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y13pqrEv,_ZThn4_N3ccc7CC9x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y1E[];
Class_Descriptor cd__ZN3ccc7CC9x0y1E = {  "_ZN3ccc7CC9x0y1E", // class name
  bases__ZN3ccc7CC9x0y1E, 2,
  &(vtc__ZN3ccc7CC9x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y2  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y23pqrEv
  ~CC9x0y2(); // tgen
  CC9x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y2E[];
extern void _ZN3ccc7CC9x0y23efgEv();
extern void _ZN3ccc7CC9x0y23pqrEv();
extern void _ZN3ccc7CC9x0y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y23abcEv,_ZThn4_N3ccc7CC9x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y23efgEv,_ZThn4_N3ccc7CC9x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y23pqrEv,_ZThn4_N3ccc7CC9x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y23abcEv,_ZThn4_N3ccc7CC9x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y23efgEv,_ZThn4_N3ccc7CC9x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y23pqrEv,_ZThn4_N3ccc7CC9x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y2E[];
Class_Descriptor cd__ZN3ccc7CC9x0y2E = {  "_ZN3ccc7CC9x0y2E", // class name
  bases__ZN3ccc7CC9x0y2E, 2,
  &(vtc__ZN3ccc7CC9x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y3  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x0y33abcEv
  ~CC9x0y3(); // tgen
  CC9x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y3E[];
extern void _ZN3ccc7CC9x0y33efgEv();
extern void _ZN3ccc7CC9x0y33pqrEv();
extern void _ZN3ccc7CC9x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y33abcEv,_ZThn4_N3ccc7CC9x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y33efgEv,_ZThn4_N3ccc7CC9x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y33pqrEv,_ZThn4_N3ccc7CC9x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y33abcEv,_ZThn4_N3ccc7CC9x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y33efgEv,_ZThn4_N3ccc7CC9x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y33pqrEv,_ZThn4_N3ccc7CC9x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y3E[];
Class_Descriptor cd__ZN3ccc7CC9x0y3E = {  "_ZN3ccc7CC9x0y3E", // class name
  bases__ZN3ccc7CC9x0y3E, 2,
  &(vtc__ZN3ccc7CC9x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y4  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC9x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y43efgEv
  ~CC9x0y4(); // tgen
  CC9x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y4E[];
extern void _ZN3ccc7CC9x0y43efgEv();
extern void _ZN3ccc7CC9x0y43pqrEv();
extern void _ZN3ccc7CC9x0y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y43abcEv,_ZThn4_N3ccc7CC9x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y43efgEv,_ZThn4_N3ccc7CC9x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y43pqrEv,_ZThn4_N3ccc7CC9x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y43abcEv,_ZThn4_N3ccc7CC9x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y43efgEv,_ZThn4_N3ccc7CC9x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y43pqrEv,_ZThn4_N3ccc7CC9x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y4E[];
Class_Descriptor cd__ZN3ccc7CC9x0y4E = {  "_ZN3ccc7CC9x0y4E", // class name
  bases__ZN3ccc7CC9x0y4E, 2,
  &(vtc__ZN3ccc7CC9x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y5  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC9x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y53abcEv
  ~CC9x0y5(); // tgen
  CC9x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y5E[];
extern void _ZN3ccc7CC9x0y53efgEv();
extern void _ZN3ccc7CC9x0y53pqrEv();
extern void _ZN3ccc7CC9x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y53abcEv,_ZThn4_N3ccc7CC9x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y53efgEv,_ZThn4_N3ccc7CC9x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y53pqrEv,_ZThn4_N3ccc7CC9x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y53abcEv,_ZThn4_N3ccc7CC9x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y53efgEv,_ZThn4_N3ccc7CC9x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y53pqrEv,_ZThn4_N3ccc7CC9x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y5E[];
Class_Descriptor cd__ZN3ccc7CC9x0y5E = {  "_ZN3ccc7CC9x0y5E", // class name
  bases__ZN3ccc7CC9x0y5E, 2,
  &(vtc__ZN3ccc7CC9x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y6  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y63efgEv
  ~CC9x0y6(); // tgen
  CC9x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y6E[];
extern void _ZN3ccc7CC9x0y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y63abcEv,_ZThn4_N3ccc7CC9x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y63efgEv,_ZThn4_N3ccc7CC9x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y63abcEv,_ZThn4_N3ccc7CC9x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y63efgEv,_ZThn4_N3ccc7CC9x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y6E[];
Class_Descriptor cd__ZN3ccc7CC9x0y6E = {  "_ZN3ccc7CC9x0y6E", // class name
  bases__ZN3ccc7CC9x0y6E, 2,
  &(vtc__ZN3ccc7CC9x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y7  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y73pqrEv
  ~CC9x0y7(); // tgen
  CC9x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x0y73pqrEv();
extern void _ZN3ccc7CC9x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y73abcEv,_ZThn4_N3ccc7CC9x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y73pqrEv,_ZThn4_N3ccc7CC9x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y73abcEv,_ZThn4_N3ccc7CC9x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y73pqrEv,_ZThn4_N3ccc7CC9x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y7E[];
Class_Descriptor cd__ZN3ccc7CC9x0y7E = {  "_ZN3ccc7CC9x0y7E", // class name
  bases__ZN3ccc7CC9x0y7E, 2,
  &(vtc__ZN3ccc7CC9x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y8  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y83abcEv
  ~CC9x0y8(); // tgen
  CC9x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y8E[];
extern void _ZN3ccc7CC9x0y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y83abcEv,_ZThn4_N3ccc7CC9x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y83efgEv,_ZThn4_N3ccc7CC9x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y83abcEv,_ZThn4_N3ccc7CC9x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y83efgEv,_ZThn4_N3ccc7CC9x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y8E[];
Class_Descriptor cd__ZN3ccc7CC9x0y8E = {  "_ZN3ccc7CC9x0y8E", // class name
  bases__ZN3ccc7CC9x0y8E, 2,
  &(vtc__ZN3ccc7CC9x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y9  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y93pqrEv
  ~CC9x0y9(); // tgen
  CC9x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y9E[];
extern void _ZN3ccc7CC9x0y93efgEv();
extern void _ZN3ccc7CC9x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y93efgEv,_ZThn4_N3ccc7CC9x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y93pqrEv,_ZThn4_N3ccc7CC9x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y93efgEv,_ZThn4_N3ccc7CC9x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x0y93pqrEv,_ZThn4_N3ccc7CC9x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y9E[];
Class_Descriptor cd__ZN3ccc7CC9x0y9E = {  "_ZN3ccc7CC9x0y9E", // class name
  bases__ZN3ccc7CC9x0y9E, 2,
  &(vtc__ZN3ccc7CC9x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y10  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x0y103abcEv
  ~CC9x0y10(); // tgen
  CC9x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x0y103pqrEv();
extern void _ZN3ccc8CC9x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y103abcEv,_ZThn4_N3ccc8CC9x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y103pqrEv,_ZThn4_N3ccc8CC9x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y103abcEv,_ZThn4_N3ccc8CC9x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y103pqrEv,_ZThn4_N3ccc8CC9x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y10E[];
Class_Descriptor cd__ZN3ccc8CC9x0y10E = {  "_ZN3ccc8CC9x0y10E", // class name
  bases__ZN3ccc8CC9x0y10E, 2,
  &(vtc__ZN3ccc8CC9x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y11  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x0y113efgEv
  ~CC9x0y11(); // tgen
  CC9x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y11E[];
extern void _ZN3ccc8CC9x0y113efgEv();
extern void _ZN3ccc8CC9x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y113efgEv,_ZThn4_N3ccc8CC9x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y113pqrEv,_ZThn4_N3ccc8CC9x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y113efgEv,_ZThn4_N3ccc8CC9x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y113pqrEv,_ZThn4_N3ccc8CC9x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y11E[];
Class_Descriptor cd__ZN3ccc8CC9x0y11E = {  "_ZN3ccc8CC9x0y11E", // class name
  bases__ZN3ccc8CC9x0y11E, 2,
  &(vtc__ZN3ccc8CC9x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y12  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC9x0y123abcEv
  ~CC9x0y12(); // tgen
  CC9x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y123abcEv,_ZThn4_N3ccc8CC9x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y123abcEv,_ZThn4_N3ccc8CC9x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y12E[];
Class_Descriptor cd__ZN3ccc8CC9x0y12E = {  "_ZN3ccc8CC9x0y12E", // class name
  bases__ZN3ccc8CC9x0y12E, 2,
  &(vtc__ZN3ccc8CC9x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y13  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC9x0y133efgEv
  ~CC9x0y13(); // tgen
  CC9x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y13E[];
extern void _ZN3ccc8CC9x0y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y133efgEv,_ZThn4_N3ccc8CC9x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y133efgEv,_ZThn4_N3ccc8CC9x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y13E[];
Class_Descriptor cd__ZN3ccc8CC9x0y13E = {  "_ZN3ccc8CC9x0y13E", // class name
  bases__ZN3ccc8CC9x0y13E, 2,
  &(vtc__ZN3ccc8CC9x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y14  : ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y143pqrEv
  ~CC9x0y14(); // tgen
  CC9x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y143pqrEv,_ZThn4_N3ccc8CC9x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x0y143pqrEv,_ZThn4_N3ccc8CC9x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y14E[];
Class_Descriptor cd__ZN3ccc8CC9x0y14E = {  "_ZN3ccc8CC9x0y14E", // class name
  bases__ZN3ccc8CC9x0y14E, 2,
  &(vtc__ZN3ccc8CC9x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y15  : ::ccc::AA9 , ::ccc::BB0 {
  ~CC9x0y15(); // tgen
  CC9x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y15E[];
Class_Descriptor cd__ZN3ccc8CC9x0y15E = {  "_ZN3ccc8CC9x0y15E", // class name
  bases__ZN3ccc8CC9x0y15E, 2,
  &(vtc__ZN3ccc8CC9x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y0  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y03pqrEv
  ~CC9x1y0(); // tgen
  CC9x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y0E[];
extern void _ZN3ccc7CC9x1y03efgEv();
extern void _ZN3ccc7CC9x1y03pqrEv();
extern void _ZN3ccc7CC9x1y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y03abcEv,_ZThn4_N3ccc7CC9x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y03pqrEv,_ZThn4_N3ccc7CC9x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y03efgEv,_ZThn4_N3ccc7CC9x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y03abcEv,_ZThn4_N3ccc7CC9x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y03pqrEv,_ZThn4_N3ccc7CC9x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y03efgEv,_ZThn4_N3ccc7CC9x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y0E[];
Class_Descriptor cd__ZN3ccc7CC9x1y0E = {  "_ZN3ccc7CC9x1y0E", // class name
  bases__ZN3ccc7CC9x1y0E, 2,
  &(vtc__ZN3ccc7CC9x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y1  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x1y13efgEv
  ~CC9x1y1(); // tgen
  CC9x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y1E[];
extern void _ZN3ccc7CC9x1y13efgEv();
extern void _ZN3ccc7CC9x1y13pqrEv();
extern void _ZN3ccc7CC9x1y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y13abcEv,_ZThn4_N3ccc7CC9x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y13pqrEv,_ZThn4_N3ccc7CC9x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y13efgEv,_ZThn4_N3ccc7CC9x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y13abcEv,_ZThn4_N3ccc7CC9x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y13pqrEv,_ZThn4_N3ccc7CC9x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y13efgEv,_ZThn4_N3ccc7CC9x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y1E[];
Class_Descriptor cd__ZN3ccc7CC9x1y1E = {  "_ZN3ccc7CC9x1y1E", // class name
  bases__ZN3ccc7CC9x1y1E, 2,
  &(vtc__ZN3ccc7CC9x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y2  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y23pqrEv
  ~CC9x1y2(); // tgen
  CC9x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y2E[];
extern void _ZN3ccc7CC9x1y23efgEv();
extern void _ZN3ccc7CC9x1y23pqrEv();
extern void _ZN3ccc7CC9x1y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y23abcEv,_ZThn4_N3ccc7CC9x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y23pqrEv,_ZThn4_N3ccc7CC9x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y23efgEv,_ZThn4_N3ccc7CC9x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y23abcEv,_ZThn4_N3ccc7CC9x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y23pqrEv,_ZThn4_N3ccc7CC9x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y23efgEv,_ZThn4_N3ccc7CC9x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y2E[];
Class_Descriptor cd__ZN3ccc7CC9x1y2E = {  "_ZN3ccc7CC9x1y2E", // class name
  bases__ZN3ccc7CC9x1y2E, 2,
  &(vtc__ZN3ccc7CC9x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y3  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x1y33abcEv
  ~CC9x1y3(); // tgen
  CC9x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y3E[];
extern void _ZN3ccc7CC9x1y33efgEv();
extern void _ZN3ccc7CC9x1y33pqrEv();
extern void _ZN3ccc7CC9x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y33abcEv,_ZThn4_N3ccc7CC9x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y33pqrEv,_ZThn4_N3ccc7CC9x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y33efgEv,_ZThn4_N3ccc7CC9x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y33abcEv,_ZThn4_N3ccc7CC9x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y33pqrEv,_ZThn4_N3ccc7CC9x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y33efgEv,_ZThn4_N3ccc7CC9x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y3E[];
Class_Descriptor cd__ZN3ccc7CC9x1y3E = {  "_ZN3ccc7CC9x1y3E", // class name
  bases__ZN3ccc7CC9x1y3E, 2,
  &(vtc__ZN3ccc7CC9x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y4  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC9x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y43efgEv
  ~CC9x1y4(); // tgen
  CC9x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y4E[];
extern void _ZN3ccc7CC9x1y43efgEv();
extern void _ZN3ccc7CC9x1y43pqrEv();
extern void _ZN3ccc7CC9x1y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y43abcEv,_ZThn4_N3ccc7CC9x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y43pqrEv,_ZThn4_N3ccc7CC9x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y43efgEv,_ZThn4_N3ccc7CC9x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y43abcEv,_ZThn4_N3ccc7CC9x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y43pqrEv,_ZThn4_N3ccc7CC9x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y43efgEv,_ZThn4_N3ccc7CC9x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y4E[];
Class_Descriptor cd__ZN3ccc7CC9x1y4E = {  "_ZN3ccc7CC9x1y4E", // class name
  bases__ZN3ccc7CC9x1y4E, 2,
  &(vtc__ZN3ccc7CC9x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y5  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC9x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y53abcEv
  ~CC9x1y5(); // tgen
  CC9x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y5E[];
extern void _ZN3ccc7CC9x1y53efgEv();
extern void _ZN3ccc7CC9x1y53pqrEv();
extern void _ZN3ccc7CC9x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y53abcEv,_ZThn4_N3ccc7CC9x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y53pqrEv,_ZThn4_N3ccc7CC9x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y53efgEv,_ZThn4_N3ccc7CC9x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y53abcEv,_ZThn4_N3ccc7CC9x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y53pqrEv,_ZThn4_N3ccc7CC9x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y53efgEv,_ZThn4_N3ccc7CC9x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y5E[];
Class_Descriptor cd__ZN3ccc7CC9x1y5E = {  "_ZN3ccc7CC9x1y5E", // class name
  bases__ZN3ccc7CC9x1y5E, 2,
  &(vtc__ZN3ccc7CC9x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y6  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y63efgEv
  ~CC9x1y6(); // tgen
  CC9x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y6E[];
extern void _ZN3ccc7CC9x1y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y63abcEv,_ZThn4_N3ccc7CC9x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y63efgEv,_ZThn4_N3ccc7CC9x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y63abcEv,_ZThn4_N3ccc7CC9x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y63efgEv,_ZThn4_N3ccc7CC9x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y6E[];
Class_Descriptor cd__ZN3ccc7CC9x1y6E = {  "_ZN3ccc7CC9x1y6E", // class name
  bases__ZN3ccc7CC9x1y6E, 2,
  &(vtc__ZN3ccc7CC9x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y7  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y73pqrEv
  ~CC9x1y7(); // tgen
  CC9x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x1y73pqrEv();
extern void _ZN3ccc7CC9x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y73abcEv,_ZThn4_N3ccc7CC9x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y73pqrEv,_ZThn4_N3ccc7CC9x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y73abcEv,_ZThn4_N3ccc7CC9x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y73pqrEv,_ZThn4_N3ccc7CC9x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y7E[];
Class_Descriptor cd__ZN3ccc7CC9x1y7E = {  "_ZN3ccc7CC9x1y7E", // class name
  bases__ZN3ccc7CC9x1y7E, 2,
  &(vtc__ZN3ccc7CC9x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y8  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y83abcEv
  ~CC9x1y8(); // tgen
  CC9x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y8E[];
extern void _ZN3ccc7CC9x1y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y83abcEv,_ZThn4_N3ccc7CC9x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y83efgEv,_ZThn4_N3ccc7CC9x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y83abcEv,_ZThn4_N3ccc7CC9x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y83efgEv,_ZThn4_N3ccc7CC9x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y8E[];
Class_Descriptor cd__ZN3ccc7CC9x1y8E = {  "_ZN3ccc7CC9x1y8E", // class name
  bases__ZN3ccc7CC9x1y8E, 2,
  &(vtc__ZN3ccc7CC9x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y9  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y93pqrEv
  ~CC9x1y9(); // tgen
  CC9x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y9E[];
extern void _ZN3ccc7CC9x1y93efgEv();
extern void _ZN3ccc7CC9x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y93pqrEv,_ZThn4_N3ccc7CC9x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y93efgEv,_ZThn4_N3ccc7CC9x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y93pqrEv,_ZThn4_N3ccc7CC9x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x1y93efgEv,_ZThn4_N3ccc7CC9x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y9E[];
Class_Descriptor cd__ZN3ccc7CC9x1y9E = {  "_ZN3ccc7CC9x1y9E", // class name
  bases__ZN3ccc7CC9x1y9E, 2,
  &(vtc__ZN3ccc7CC9x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y10  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x1y103abcEv
  ~CC9x1y10(); // tgen
  CC9x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x1y103pqrEv();
extern void _ZN3ccc8CC9x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y103abcEv,_ZThn4_N3ccc8CC9x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y103pqrEv,_ZThn4_N3ccc8CC9x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y103abcEv,_ZThn4_N3ccc8CC9x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y103pqrEv,_ZThn4_N3ccc8CC9x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y10E[];
Class_Descriptor cd__ZN3ccc8CC9x1y10E = {  "_ZN3ccc8CC9x1y10E", // class name
  bases__ZN3ccc8CC9x1y10E, 2,
  &(vtc__ZN3ccc8CC9x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y11  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x1y113efgEv
  ~CC9x1y11(); // tgen
  CC9x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y11E[];
extern void _ZN3ccc8CC9x1y113efgEv();
extern void _ZN3ccc8CC9x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y113pqrEv,_ZThn4_N3ccc8CC9x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y113efgEv,_ZThn4_N3ccc8CC9x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y113pqrEv,_ZThn4_N3ccc8CC9x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y113efgEv,_ZThn4_N3ccc8CC9x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y11E[];
Class_Descriptor cd__ZN3ccc8CC9x1y11E = {  "_ZN3ccc8CC9x1y11E", // class name
  bases__ZN3ccc8CC9x1y11E, 2,
  &(vtc__ZN3ccc8CC9x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y12  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC9x1y123abcEv
  ~CC9x1y12(); // tgen
  CC9x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y123abcEv,_ZThn4_N3ccc8CC9x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y123abcEv,_ZThn4_N3ccc8CC9x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y12E[];
Class_Descriptor cd__ZN3ccc8CC9x1y12E = {  "_ZN3ccc8CC9x1y12E", // class name
  bases__ZN3ccc8CC9x1y12E, 2,
  &(vtc__ZN3ccc8CC9x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y13  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC9x1y133efgEv
  ~CC9x1y13(); // tgen
  CC9x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y13E[];
extern void _ZN3ccc8CC9x1y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y133efgEv,_ZThn4_N3ccc8CC9x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y133efgEv,_ZThn4_N3ccc8CC9x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y13E[];
Class_Descriptor cd__ZN3ccc8CC9x1y13E = {  "_ZN3ccc8CC9x1y13E", // class name
  bases__ZN3ccc8CC9x1y13E, 2,
  &(vtc__ZN3ccc8CC9x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y14  : ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y143pqrEv
  ~CC9x1y14(); // tgen
  CC9x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y143pqrEv,_ZThn4_N3ccc8CC9x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x1y143pqrEv,_ZThn4_N3ccc8CC9x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y14E[];
Class_Descriptor cd__ZN3ccc8CC9x1y14E = {  "_ZN3ccc8CC9x1y14E", // class name
  bases__ZN3ccc8CC9x1y14E, 2,
  &(vtc__ZN3ccc8CC9x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x1y15  : ::ccc::AA9 , ::ccc::BB1 {
  ~CC9x1y15(); // tgen
  CC9x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y15E[];
Class_Descriptor cd__ZN3ccc8CC9x1y15E = {  "_ZN3ccc8CC9x1y15E", // class name
  bases__ZN3ccc8CC9x1y15E, 2,
  &(vtc__ZN3ccc8CC9x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y0  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y03pqrEv
  ~CC9x2y0(); // tgen
  CC9x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y0E[];
extern void _ZN3ccc7CC9x2y03efgEv();
extern void _ZN3ccc7CC9x2y03pqrEv();
extern void _ZN3ccc7CC9x2y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y03efgEv,_ZThn4_N3ccc7CC9x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y03abcEv,_ZThn4_N3ccc7CC9x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y03pqrEv,_ZThn4_N3ccc7CC9x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y03efgEv,_ZThn4_N3ccc7CC9x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y03abcEv,_ZThn4_N3ccc7CC9x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y03pqrEv,_ZThn4_N3ccc7CC9x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y0E[];
Class_Descriptor cd__ZN3ccc7CC9x2y0E = {  "_ZN3ccc7CC9x2y0E", // class name
  bases__ZN3ccc7CC9x2y0E, 2,
  &(vtc__ZN3ccc7CC9x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y1  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x2y13efgEv
  ~CC9x2y1(); // tgen
  CC9x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y1E[];
extern void _ZN3ccc7CC9x2y13efgEv();
extern void _ZN3ccc7CC9x2y13pqrEv();
extern void _ZN3ccc7CC9x2y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y13efgEv,_ZThn4_N3ccc7CC9x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y13abcEv,_ZThn4_N3ccc7CC9x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y13pqrEv,_ZThn4_N3ccc7CC9x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y13efgEv,_ZThn4_N3ccc7CC9x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y13abcEv,_ZThn4_N3ccc7CC9x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y13pqrEv,_ZThn4_N3ccc7CC9x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y1E[];
Class_Descriptor cd__ZN3ccc7CC9x2y1E = {  "_ZN3ccc7CC9x2y1E", // class name
  bases__ZN3ccc7CC9x2y1E, 2,
  &(vtc__ZN3ccc7CC9x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y2  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y23pqrEv
  ~CC9x2y2(); // tgen
  CC9x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y2E[];
extern void _ZN3ccc7CC9x2y23efgEv();
extern void _ZN3ccc7CC9x2y23pqrEv();
extern void _ZN3ccc7CC9x2y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y23efgEv,_ZThn4_N3ccc7CC9x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y23abcEv,_ZThn4_N3ccc7CC9x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y23pqrEv,_ZThn4_N3ccc7CC9x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y23efgEv,_ZThn4_N3ccc7CC9x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y23abcEv,_ZThn4_N3ccc7CC9x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y23pqrEv,_ZThn4_N3ccc7CC9x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y2E[];
Class_Descriptor cd__ZN3ccc7CC9x2y2E = {  "_ZN3ccc7CC9x2y2E", // class name
  bases__ZN3ccc7CC9x2y2E, 2,
  &(vtc__ZN3ccc7CC9x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y3  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x2y33abcEv
  ~CC9x2y3(); // tgen
  CC9x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y3E[];
extern void _ZN3ccc7CC9x2y33efgEv();
extern void _ZN3ccc7CC9x2y33pqrEv();
extern void _ZN3ccc7CC9x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y33efgEv,_ZThn4_N3ccc7CC9x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y33abcEv,_ZThn4_N3ccc7CC9x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y33pqrEv,_ZThn4_N3ccc7CC9x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y33efgEv,_ZThn4_N3ccc7CC9x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y33abcEv,_ZThn4_N3ccc7CC9x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y33pqrEv,_ZThn4_N3ccc7CC9x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y3E[];
Class_Descriptor cd__ZN3ccc7CC9x2y3E = {  "_ZN3ccc7CC9x2y3E", // class name
  bases__ZN3ccc7CC9x2y3E, 2,
  &(vtc__ZN3ccc7CC9x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y4  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC9x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y43efgEv
  ~CC9x2y4(); // tgen
  CC9x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y4E[];
extern void _ZN3ccc7CC9x2y43efgEv();
extern void _ZN3ccc7CC9x2y43pqrEv();
extern void _ZN3ccc7CC9x2y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y43efgEv,_ZThn4_N3ccc7CC9x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y43abcEv,_ZThn4_N3ccc7CC9x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y43pqrEv,_ZThn4_N3ccc7CC9x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y43efgEv,_ZThn4_N3ccc7CC9x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y43abcEv,_ZThn4_N3ccc7CC9x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y43pqrEv,_ZThn4_N3ccc7CC9x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y4E[];
Class_Descriptor cd__ZN3ccc7CC9x2y4E = {  "_ZN3ccc7CC9x2y4E", // class name
  bases__ZN3ccc7CC9x2y4E, 2,
  &(vtc__ZN3ccc7CC9x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y5  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC9x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y53abcEv
  ~CC9x2y5(); // tgen
  CC9x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y5E[];
extern void _ZN3ccc7CC9x2y53efgEv();
extern void _ZN3ccc7CC9x2y53pqrEv();
extern void _ZN3ccc7CC9x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y53efgEv,_ZThn4_N3ccc7CC9x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y53abcEv,_ZThn4_N3ccc7CC9x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y53pqrEv,_ZThn4_N3ccc7CC9x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y53efgEv,_ZThn4_N3ccc7CC9x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y53abcEv,_ZThn4_N3ccc7CC9x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y53pqrEv,_ZThn4_N3ccc7CC9x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y5E[];
Class_Descriptor cd__ZN3ccc7CC9x2y5E = {  "_ZN3ccc7CC9x2y5E", // class name
  bases__ZN3ccc7CC9x2y5E, 2,
  &(vtc__ZN3ccc7CC9x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y6  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y63efgEv
  ~CC9x2y6(); // tgen
  CC9x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y6E[];
extern void _ZN3ccc7CC9x2y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y63efgEv,_ZThn4_N3ccc7CC9x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y63abcEv,_ZThn4_N3ccc7CC9x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y63efgEv,_ZThn4_N3ccc7CC9x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y63abcEv,_ZThn4_N3ccc7CC9x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y6E[];
Class_Descriptor cd__ZN3ccc7CC9x2y6E = {  "_ZN3ccc7CC9x2y6E", // class name
  bases__ZN3ccc7CC9x2y6E, 2,
  &(vtc__ZN3ccc7CC9x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y7  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y73pqrEv
  ~CC9x2y7(); // tgen
  CC9x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x2y73pqrEv();
extern void _ZN3ccc7CC9x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y73abcEv,_ZThn4_N3ccc7CC9x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y73pqrEv,_ZThn4_N3ccc7CC9x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y73abcEv,_ZThn4_N3ccc7CC9x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y73pqrEv,_ZThn4_N3ccc7CC9x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y7E[];
Class_Descriptor cd__ZN3ccc7CC9x2y7E = {  "_ZN3ccc7CC9x2y7E", // class name
  bases__ZN3ccc7CC9x2y7E, 2,
  &(vtc__ZN3ccc7CC9x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y8  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y83abcEv
  ~CC9x2y8(); // tgen
  CC9x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y8E[];
extern void _ZN3ccc7CC9x2y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y83efgEv,_ZThn4_N3ccc7CC9x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y83abcEv,_ZThn4_N3ccc7CC9x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y83efgEv,_ZThn4_N3ccc7CC9x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y83abcEv,_ZThn4_N3ccc7CC9x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y8E[];
Class_Descriptor cd__ZN3ccc7CC9x2y8E = {  "_ZN3ccc7CC9x2y8E", // class name
  bases__ZN3ccc7CC9x2y8E, 2,
  &(vtc__ZN3ccc7CC9x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y9  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y93pqrEv
  ~CC9x2y9(); // tgen
  CC9x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y9E[];
extern void _ZN3ccc7CC9x2y93efgEv();
extern void _ZN3ccc7CC9x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y93efgEv,_ZThn4_N3ccc7CC9x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y93pqrEv,_ZThn4_N3ccc7CC9x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y93efgEv,_ZThn4_N3ccc7CC9x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x2y93pqrEv,_ZThn4_N3ccc7CC9x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y9E[];
Class_Descriptor cd__ZN3ccc7CC9x2y9E = {  "_ZN3ccc7CC9x2y9E", // class name
  bases__ZN3ccc7CC9x2y9E, 2,
  &(vtc__ZN3ccc7CC9x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y10  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x2y103abcEv
  ~CC9x2y10(); // tgen
  CC9x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x2y103pqrEv();
extern void _ZN3ccc8CC9x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y103abcEv,_ZThn4_N3ccc8CC9x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y103pqrEv,_ZThn4_N3ccc8CC9x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y103abcEv,_ZThn4_N3ccc8CC9x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y103pqrEv,_ZThn4_N3ccc8CC9x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y10E[];
Class_Descriptor cd__ZN3ccc8CC9x2y10E = {  "_ZN3ccc8CC9x2y10E", // class name
  bases__ZN3ccc8CC9x2y10E, 2,
  &(vtc__ZN3ccc8CC9x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y11  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x2y113efgEv
  ~CC9x2y11(); // tgen
  CC9x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y11E[];
extern void _ZN3ccc8CC9x2y113efgEv();
extern void _ZN3ccc8CC9x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y113efgEv,_ZThn4_N3ccc8CC9x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y113pqrEv,_ZThn4_N3ccc8CC9x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y113efgEv,_ZThn4_N3ccc8CC9x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y113pqrEv,_ZThn4_N3ccc8CC9x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y11E[];
Class_Descriptor cd__ZN3ccc8CC9x2y11E = {  "_ZN3ccc8CC9x2y11E", // class name
  bases__ZN3ccc8CC9x2y11E, 2,
  &(vtc__ZN3ccc8CC9x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y12  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC9x2y123abcEv
  ~CC9x2y12(); // tgen
  CC9x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y123abcEv,_ZThn4_N3ccc8CC9x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y123abcEv,_ZThn4_N3ccc8CC9x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y12E[];
Class_Descriptor cd__ZN3ccc8CC9x2y12E = {  "_ZN3ccc8CC9x2y12E", // class name
  bases__ZN3ccc8CC9x2y12E, 2,
  &(vtc__ZN3ccc8CC9x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y13  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC9x2y133efgEv
  ~CC9x2y13(); // tgen
  CC9x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y13E[];
extern void _ZN3ccc8CC9x2y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y133efgEv,_ZThn4_N3ccc8CC9x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y133efgEv,_ZThn4_N3ccc8CC9x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y13E[];
Class_Descriptor cd__ZN3ccc8CC9x2y13E = {  "_ZN3ccc8CC9x2y13E", // class name
  bases__ZN3ccc8CC9x2y13E, 2,
  &(vtc__ZN3ccc8CC9x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y14  : ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y143pqrEv
  ~CC9x2y14(); // tgen
  CC9x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y143pqrEv,_ZThn4_N3ccc8CC9x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x2y143pqrEv,_ZThn4_N3ccc8CC9x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y14E[];
Class_Descriptor cd__ZN3ccc8CC9x2y14E = {  "_ZN3ccc8CC9x2y14E", // class name
  bases__ZN3ccc8CC9x2y14E, 2,
  &(vtc__ZN3ccc8CC9x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x2y15  : ::ccc::AA9 , ::ccc::BB2 {
  ~CC9x2y15(); // tgen
  CC9x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y15E[];
Class_Descriptor cd__ZN3ccc8CC9x2y15E = {  "_ZN3ccc8CC9x2y15E", // class name
  bases__ZN3ccc8CC9x2y15E, 2,
  &(vtc__ZN3ccc8CC9x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y0  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y03pqrEv
  ~CC9x3y0(); // tgen
  CC9x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y0E[];
extern void _ZN3ccc7CC9x3y03efgEv();
extern void _ZN3ccc7CC9x3y03pqrEv();
extern void _ZN3ccc7CC9x3y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y03efgEv,_ZThn4_N3ccc7CC9x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y03pqrEv,_ZThn4_N3ccc7CC9x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y03abcEv,_ZThn4_N3ccc7CC9x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y03efgEv,_ZThn4_N3ccc7CC9x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y03pqrEv,_ZThn4_N3ccc7CC9x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y03abcEv,_ZThn4_N3ccc7CC9x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y0E[];
Class_Descriptor cd__ZN3ccc7CC9x3y0E = {  "_ZN3ccc7CC9x3y0E", // class name
  bases__ZN3ccc7CC9x3y0E, 2,
  &(vtc__ZN3ccc7CC9x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y1  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x3y13efgEv
  ~CC9x3y1(); // tgen
  CC9x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y1E[];
extern void _ZN3ccc7CC9x3y13efgEv();
extern void _ZN3ccc7CC9x3y13pqrEv();
extern void _ZN3ccc7CC9x3y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y13efgEv,_ZThn4_N3ccc7CC9x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y13pqrEv,_ZThn4_N3ccc7CC9x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y13abcEv,_ZThn4_N3ccc7CC9x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y13efgEv,_ZThn4_N3ccc7CC9x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y13pqrEv,_ZThn4_N3ccc7CC9x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y13abcEv,_ZThn4_N3ccc7CC9x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y1E[];
Class_Descriptor cd__ZN3ccc7CC9x3y1E = {  "_ZN3ccc7CC9x3y1E", // class name
  bases__ZN3ccc7CC9x3y1E, 2,
  &(vtc__ZN3ccc7CC9x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y2  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y23pqrEv
  ~CC9x3y2(); // tgen
  CC9x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y2E[];
extern void _ZN3ccc7CC9x3y23efgEv();
extern void _ZN3ccc7CC9x3y23pqrEv();
extern void _ZN3ccc7CC9x3y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y23efgEv,_ZThn4_N3ccc7CC9x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y23pqrEv,_ZThn4_N3ccc7CC9x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y23abcEv,_ZThn4_N3ccc7CC9x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y23efgEv,_ZThn4_N3ccc7CC9x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y23pqrEv,_ZThn4_N3ccc7CC9x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y23abcEv,_ZThn4_N3ccc7CC9x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y2E[];
Class_Descriptor cd__ZN3ccc7CC9x3y2E = {  "_ZN3ccc7CC9x3y2E", // class name
  bases__ZN3ccc7CC9x3y2E, 2,
  &(vtc__ZN3ccc7CC9x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y3  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x3y33abcEv
  ~CC9x3y3(); // tgen
  CC9x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y3E[];
extern void _ZN3ccc7CC9x3y33efgEv();
extern void _ZN3ccc7CC9x3y33pqrEv();
extern void _ZN3ccc7CC9x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y33efgEv,_ZThn4_N3ccc7CC9x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y33pqrEv,_ZThn4_N3ccc7CC9x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y33abcEv,_ZThn4_N3ccc7CC9x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y33efgEv,_ZThn4_N3ccc7CC9x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y33pqrEv,_ZThn4_N3ccc7CC9x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y33abcEv,_ZThn4_N3ccc7CC9x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y3E[];
Class_Descriptor cd__ZN3ccc7CC9x3y3E = {  "_ZN3ccc7CC9x3y3E", // class name
  bases__ZN3ccc7CC9x3y3E, 2,
  &(vtc__ZN3ccc7CC9x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y4  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC9x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y43efgEv
  ~CC9x3y4(); // tgen
  CC9x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y4E[];
extern void _ZN3ccc7CC9x3y43efgEv();
extern void _ZN3ccc7CC9x3y43pqrEv();
extern void _ZN3ccc7CC9x3y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y43efgEv,_ZThn4_N3ccc7CC9x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y43pqrEv,_ZThn4_N3ccc7CC9x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y43abcEv,_ZThn4_N3ccc7CC9x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y43efgEv,_ZThn4_N3ccc7CC9x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y43pqrEv,_ZThn4_N3ccc7CC9x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y43abcEv,_ZThn4_N3ccc7CC9x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y4E[];
Class_Descriptor cd__ZN3ccc7CC9x3y4E = {  "_ZN3ccc7CC9x3y4E", // class name
  bases__ZN3ccc7CC9x3y4E, 2,
  &(vtc__ZN3ccc7CC9x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y5  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC9x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y53abcEv
  ~CC9x3y5(); // tgen
  CC9x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y5E[];
extern void _ZN3ccc7CC9x3y53efgEv();
extern void _ZN3ccc7CC9x3y53pqrEv();
extern void _ZN3ccc7CC9x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y53efgEv,_ZThn4_N3ccc7CC9x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y53pqrEv,_ZThn4_N3ccc7CC9x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y53abcEv,_ZThn4_N3ccc7CC9x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y53efgEv,_ZThn4_N3ccc7CC9x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y53pqrEv,_ZThn4_N3ccc7CC9x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y53abcEv,_ZThn4_N3ccc7CC9x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y5E[];
Class_Descriptor cd__ZN3ccc7CC9x3y5E = {  "_ZN3ccc7CC9x3y5E", // class name
  bases__ZN3ccc7CC9x3y5E, 2,
  &(vtc__ZN3ccc7CC9x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y6  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y63efgEv
  ~CC9x3y6(); // tgen
  CC9x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y6E[];
extern void _ZN3ccc7CC9x3y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y63efgEv,_ZThn4_N3ccc7CC9x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y63abcEv,_ZThn4_N3ccc7CC9x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y63efgEv,_ZThn4_N3ccc7CC9x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y63abcEv,_ZThn4_N3ccc7CC9x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y6E[];
Class_Descriptor cd__ZN3ccc7CC9x3y6E = {  "_ZN3ccc7CC9x3y6E", // class name
  bases__ZN3ccc7CC9x3y6E, 2,
  &(vtc__ZN3ccc7CC9x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y7  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y73pqrEv
  ~CC9x3y7(); // tgen
  CC9x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x3y73pqrEv();
extern void _ZN3ccc7CC9x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y73pqrEv,_ZThn4_N3ccc7CC9x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y73abcEv,_ZThn4_N3ccc7CC9x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y73pqrEv,_ZThn4_N3ccc7CC9x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y73abcEv,_ZThn4_N3ccc7CC9x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y7E[];
Class_Descriptor cd__ZN3ccc7CC9x3y7E = {  "_ZN3ccc7CC9x3y7E", // class name
  bases__ZN3ccc7CC9x3y7E, 2,
  &(vtc__ZN3ccc7CC9x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y8  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y83abcEv
  ~CC9x3y8(); // tgen
  CC9x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y8E[];
extern void _ZN3ccc7CC9x3y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y83efgEv,_ZThn4_N3ccc7CC9x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y83abcEv,_ZThn4_N3ccc7CC9x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y83efgEv,_ZThn4_N3ccc7CC9x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y83abcEv,_ZThn4_N3ccc7CC9x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y8E[];
Class_Descriptor cd__ZN3ccc7CC9x3y8E = {  "_ZN3ccc7CC9x3y8E", // class name
  bases__ZN3ccc7CC9x3y8E, 2,
  &(vtc__ZN3ccc7CC9x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y9  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y93pqrEv
  ~CC9x3y9(); // tgen
  CC9x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y9E[];
extern void _ZN3ccc7CC9x3y93efgEv();
extern void _ZN3ccc7CC9x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y93efgEv,_ZThn4_N3ccc7CC9x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y93pqrEv,_ZThn4_N3ccc7CC9x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y93efgEv,_ZThn4_N3ccc7CC9x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x3y93pqrEv,_ZThn4_N3ccc7CC9x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y9E[];
Class_Descriptor cd__ZN3ccc7CC9x3y9E = {  "_ZN3ccc7CC9x3y9E", // class name
  bases__ZN3ccc7CC9x3y9E, 2,
  &(vtc__ZN3ccc7CC9x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y10  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x3y103abcEv
  ~CC9x3y10(); // tgen
  CC9x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x3y103pqrEv();
extern void _ZN3ccc8CC9x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y103pqrEv,_ZThn4_N3ccc8CC9x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y103abcEv,_ZThn4_N3ccc8CC9x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y103pqrEv,_ZThn4_N3ccc8CC9x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y103abcEv,_ZThn4_N3ccc8CC9x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y10E[];
Class_Descriptor cd__ZN3ccc8CC9x3y10E = {  "_ZN3ccc8CC9x3y10E", // class name
  bases__ZN3ccc8CC9x3y10E, 2,
  &(vtc__ZN3ccc8CC9x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y11  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x3y113efgEv
  ~CC9x3y11(); // tgen
  CC9x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y11E[];
extern void _ZN3ccc8CC9x3y113efgEv();
extern void _ZN3ccc8CC9x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y113efgEv,_ZThn4_N3ccc8CC9x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y113pqrEv,_ZThn4_N3ccc8CC9x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y113efgEv,_ZThn4_N3ccc8CC9x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y113pqrEv,_ZThn4_N3ccc8CC9x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y11E[];
Class_Descriptor cd__ZN3ccc8CC9x3y11E = {  "_ZN3ccc8CC9x3y11E", // class name
  bases__ZN3ccc8CC9x3y11E, 2,
  &(vtc__ZN3ccc8CC9x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y12  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC9x3y123abcEv
  ~CC9x3y12(); // tgen
  CC9x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y123abcEv,_ZThn4_N3ccc8CC9x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y123abcEv,_ZThn4_N3ccc8CC9x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y12E[];
Class_Descriptor cd__ZN3ccc8CC9x3y12E = {  "_ZN3ccc8CC9x3y12E", // class name
  bases__ZN3ccc8CC9x3y12E, 2,
  &(vtc__ZN3ccc8CC9x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y13  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC9x3y133efgEv
  ~CC9x3y13(); // tgen
  CC9x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y13E[];
extern void _ZN3ccc8CC9x3y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y133efgEv,_ZThn4_N3ccc8CC9x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y133efgEv,_ZThn4_N3ccc8CC9x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y13E[];
Class_Descriptor cd__ZN3ccc8CC9x3y13E = {  "_ZN3ccc8CC9x3y13E", // class name
  bases__ZN3ccc8CC9x3y13E, 2,
  &(vtc__ZN3ccc8CC9x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y14  : ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y143pqrEv
  ~CC9x3y14(); // tgen
  CC9x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y143pqrEv,_ZThn4_N3ccc8CC9x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x3y143pqrEv,_ZThn4_N3ccc8CC9x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y14E[];
Class_Descriptor cd__ZN3ccc8CC9x3y14E = {  "_ZN3ccc8CC9x3y14E", // class name
  bases__ZN3ccc8CC9x3y14E, 2,
  &(vtc__ZN3ccc8CC9x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x3y15  : ::ccc::AA9 , ::ccc::BB3 {
  ~CC9x3y15(); // tgen
  CC9x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y15E[];
Class_Descriptor cd__ZN3ccc8CC9x3y15E = {  "_ZN3ccc8CC9x3y15E", // class name
  bases__ZN3ccc8CC9x3y15E, 2,
  &(vtc__ZN3ccc8CC9x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y0  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y03pqrEv
  ~CC9x4y0(); // tgen
  CC9x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y0E[];
extern void _ZN3ccc7CC9x4y03efgEv();
extern void _ZN3ccc7CC9x4y03pqrEv();
extern void _ZN3ccc7CC9x4y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y03pqrEv,_ZThn4_N3ccc7CC9x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y03abcEv,_ZThn4_N3ccc7CC9x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y03efgEv,_ZThn4_N3ccc7CC9x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y03pqrEv,_ZThn4_N3ccc7CC9x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y03abcEv,_ZThn4_N3ccc7CC9x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y03efgEv,_ZThn4_N3ccc7CC9x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y0E[];
Class_Descriptor cd__ZN3ccc7CC9x4y0E = {  "_ZN3ccc7CC9x4y0E", // class name
  bases__ZN3ccc7CC9x4y0E, 2,
  &(vtc__ZN3ccc7CC9x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y1  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x4y13efgEv
  ~CC9x4y1(); // tgen
  CC9x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y1E[];
extern void _ZN3ccc7CC9x4y13efgEv();
extern void _ZN3ccc7CC9x4y13pqrEv();
extern void _ZN3ccc7CC9x4y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y13pqrEv,_ZThn4_N3ccc7CC9x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y13abcEv,_ZThn4_N3ccc7CC9x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y13efgEv,_ZThn4_N3ccc7CC9x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y13pqrEv,_ZThn4_N3ccc7CC9x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y13abcEv,_ZThn4_N3ccc7CC9x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y13efgEv,_ZThn4_N3ccc7CC9x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y1E[];
Class_Descriptor cd__ZN3ccc7CC9x4y1E = {  "_ZN3ccc7CC9x4y1E", // class name
  bases__ZN3ccc7CC9x4y1E, 2,
  &(vtc__ZN3ccc7CC9x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y2  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y23pqrEv
  ~CC9x4y2(); // tgen
  CC9x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y2E[];
extern void _ZN3ccc7CC9x4y23efgEv();
extern void _ZN3ccc7CC9x4y23pqrEv();
extern void _ZN3ccc7CC9x4y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y23pqrEv,_ZThn4_N3ccc7CC9x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y23abcEv,_ZThn4_N3ccc7CC9x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y23efgEv,_ZThn4_N3ccc7CC9x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y23pqrEv,_ZThn4_N3ccc7CC9x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y23abcEv,_ZThn4_N3ccc7CC9x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y23efgEv,_ZThn4_N3ccc7CC9x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y2E[];
Class_Descriptor cd__ZN3ccc7CC9x4y2E = {  "_ZN3ccc7CC9x4y2E", // class name
  bases__ZN3ccc7CC9x4y2E, 2,
  &(vtc__ZN3ccc7CC9x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y3  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x4y33abcEv
  ~CC9x4y3(); // tgen
  CC9x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y3E[];
extern void _ZN3ccc7CC9x4y33efgEv();
extern void _ZN3ccc7CC9x4y33pqrEv();
extern void _ZN3ccc7CC9x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y33pqrEv,_ZThn4_N3ccc7CC9x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y33abcEv,_ZThn4_N3ccc7CC9x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y33efgEv,_ZThn4_N3ccc7CC9x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y33pqrEv,_ZThn4_N3ccc7CC9x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y33abcEv,_ZThn4_N3ccc7CC9x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y33efgEv,_ZThn4_N3ccc7CC9x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y3E[];
Class_Descriptor cd__ZN3ccc7CC9x4y3E = {  "_ZN3ccc7CC9x4y3E", // class name
  bases__ZN3ccc7CC9x4y3E, 2,
  &(vtc__ZN3ccc7CC9x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y4  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC9x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y43efgEv
  ~CC9x4y4(); // tgen
  CC9x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y4E[];
extern void _ZN3ccc7CC9x4y43efgEv();
extern void _ZN3ccc7CC9x4y43pqrEv();
extern void _ZN3ccc7CC9x4y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y43pqrEv,_ZThn4_N3ccc7CC9x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y43abcEv,_ZThn4_N3ccc7CC9x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y43efgEv,_ZThn4_N3ccc7CC9x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y43pqrEv,_ZThn4_N3ccc7CC9x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y43abcEv,_ZThn4_N3ccc7CC9x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y43efgEv,_ZThn4_N3ccc7CC9x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y4E[];
Class_Descriptor cd__ZN3ccc7CC9x4y4E = {  "_ZN3ccc7CC9x4y4E", // class name
  bases__ZN3ccc7CC9x4y4E, 2,
  &(vtc__ZN3ccc7CC9x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y5  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC9x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y53abcEv
  ~CC9x4y5(); // tgen
  CC9x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y5E[];
extern void _ZN3ccc7CC9x4y53efgEv();
extern void _ZN3ccc7CC9x4y53pqrEv();
extern void _ZN3ccc7CC9x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y53pqrEv,_ZThn4_N3ccc7CC9x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y53abcEv,_ZThn4_N3ccc7CC9x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y53efgEv,_ZThn4_N3ccc7CC9x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y53pqrEv,_ZThn4_N3ccc7CC9x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y53abcEv,_ZThn4_N3ccc7CC9x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y53efgEv,_ZThn4_N3ccc7CC9x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y5E[];
Class_Descriptor cd__ZN3ccc7CC9x4y5E = {  "_ZN3ccc7CC9x4y5E", // class name
  bases__ZN3ccc7CC9x4y5E, 2,
  &(vtc__ZN3ccc7CC9x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y6  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y63efgEv
  ~CC9x4y6(); // tgen
  CC9x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y6E[];
extern void _ZN3ccc7CC9x4y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y63abcEv,_ZThn4_N3ccc7CC9x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y63efgEv,_ZThn4_N3ccc7CC9x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y63abcEv,_ZThn4_N3ccc7CC9x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y63efgEv,_ZThn4_N3ccc7CC9x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y6E[];
Class_Descriptor cd__ZN3ccc7CC9x4y6E = {  "_ZN3ccc7CC9x4y6E", // class name
  bases__ZN3ccc7CC9x4y6E, 2,
  &(vtc__ZN3ccc7CC9x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y7  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y73pqrEv
  ~CC9x4y7(); // tgen
  CC9x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x4y73pqrEv();
extern void _ZN3ccc7CC9x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y73pqrEv,_ZThn4_N3ccc7CC9x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y73abcEv,_ZThn4_N3ccc7CC9x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y73pqrEv,_ZThn4_N3ccc7CC9x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y73abcEv,_ZThn4_N3ccc7CC9x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y7E[];
Class_Descriptor cd__ZN3ccc7CC9x4y7E = {  "_ZN3ccc7CC9x4y7E", // class name
  bases__ZN3ccc7CC9x4y7E, 2,
  &(vtc__ZN3ccc7CC9x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y8  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y83abcEv
  ~CC9x4y8(); // tgen
  CC9x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y8E[];
extern void _ZN3ccc7CC9x4y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y83abcEv,_ZThn4_N3ccc7CC9x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y83efgEv,_ZThn4_N3ccc7CC9x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y83abcEv,_ZThn4_N3ccc7CC9x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y83efgEv,_ZThn4_N3ccc7CC9x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y8E[];
Class_Descriptor cd__ZN3ccc7CC9x4y8E = {  "_ZN3ccc7CC9x4y8E", // class name
  bases__ZN3ccc7CC9x4y8E, 2,
  &(vtc__ZN3ccc7CC9x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y9  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y93pqrEv
  ~CC9x4y9(); // tgen
  CC9x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y9E[];
extern void _ZN3ccc7CC9x4y93efgEv();
extern void _ZN3ccc7CC9x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y93pqrEv,_ZThn4_N3ccc7CC9x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y93efgEv,_ZThn4_N3ccc7CC9x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y93pqrEv,_ZThn4_N3ccc7CC9x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x4y93efgEv,_ZThn4_N3ccc7CC9x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y9E[];
Class_Descriptor cd__ZN3ccc7CC9x4y9E = {  "_ZN3ccc7CC9x4y9E", // class name
  bases__ZN3ccc7CC9x4y9E, 2,
  &(vtc__ZN3ccc7CC9x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y10  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x4y103abcEv
  ~CC9x4y10(); // tgen
  CC9x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x4y103pqrEv();
extern void _ZN3ccc8CC9x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y103pqrEv,_ZThn4_N3ccc8CC9x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y103abcEv,_ZThn4_N3ccc8CC9x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y103pqrEv,_ZThn4_N3ccc8CC9x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y103abcEv,_ZThn4_N3ccc8CC9x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y10E[];
Class_Descriptor cd__ZN3ccc8CC9x4y10E = {  "_ZN3ccc8CC9x4y10E", // class name
  bases__ZN3ccc8CC9x4y10E, 2,
  &(vtc__ZN3ccc8CC9x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y11  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x4y113efgEv
  ~CC9x4y11(); // tgen
  CC9x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y11E[];
extern void _ZN3ccc8CC9x4y113efgEv();
extern void _ZN3ccc8CC9x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y113pqrEv,_ZThn4_N3ccc8CC9x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y113efgEv,_ZThn4_N3ccc8CC9x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y113pqrEv,_ZThn4_N3ccc8CC9x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y113efgEv,_ZThn4_N3ccc8CC9x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y11E[];
Class_Descriptor cd__ZN3ccc8CC9x4y11E = {  "_ZN3ccc8CC9x4y11E", // class name
  bases__ZN3ccc8CC9x4y11E, 2,
  &(vtc__ZN3ccc8CC9x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y12  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC9x4y123abcEv
  ~CC9x4y12(); // tgen
  CC9x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y123abcEv,_ZThn4_N3ccc8CC9x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y123abcEv,_ZThn4_N3ccc8CC9x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y12E[];
Class_Descriptor cd__ZN3ccc8CC9x4y12E = {  "_ZN3ccc8CC9x4y12E", // class name
  bases__ZN3ccc8CC9x4y12E, 2,
  &(vtc__ZN3ccc8CC9x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y13  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC9x4y133efgEv
  ~CC9x4y13(); // tgen
  CC9x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y13E[];
extern void _ZN3ccc8CC9x4y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y133efgEv,_ZThn4_N3ccc8CC9x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y133efgEv,_ZThn4_N3ccc8CC9x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y13E[];
Class_Descriptor cd__ZN3ccc8CC9x4y13E = {  "_ZN3ccc8CC9x4y13E", // class name
  bases__ZN3ccc8CC9x4y13E, 2,
  &(vtc__ZN3ccc8CC9x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y14  : ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y143pqrEv
  ~CC9x4y14(); // tgen
  CC9x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y143pqrEv,_ZThn4_N3ccc8CC9x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x4y143pqrEv,_ZThn4_N3ccc8CC9x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y14E[];
Class_Descriptor cd__ZN3ccc8CC9x4y14E = {  "_ZN3ccc8CC9x4y14E", // class name
  bases__ZN3ccc8CC9x4y14E, 2,
  &(vtc__ZN3ccc8CC9x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x4y15  : ::ccc::AA9 , ::ccc::BB4 {
  ~CC9x4y15(); // tgen
  CC9x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y15E[];
Class_Descriptor cd__ZN3ccc8CC9x4y15E = {  "_ZN3ccc8CC9x4y15E", // class name
  bases__ZN3ccc8CC9x4y15E, 2,
  &(vtc__ZN3ccc8CC9x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y0  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y03pqrEv
  ~CC9x5y0(); // tgen
  CC9x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y0E[];
extern void _ZN3ccc7CC9x5y03efgEv();
extern void _ZN3ccc7CC9x5y03pqrEv();
extern void _ZN3ccc7CC9x5y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y03pqrEv,_ZThn4_N3ccc7CC9x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y03efgEv,_ZThn4_N3ccc7CC9x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y03abcEv,_ZThn4_N3ccc7CC9x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y03pqrEv,_ZThn4_N3ccc7CC9x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y03efgEv,_ZThn4_N3ccc7CC9x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y03abcEv,_ZThn4_N3ccc7CC9x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y0E[];
Class_Descriptor cd__ZN3ccc7CC9x5y0E = {  "_ZN3ccc7CC9x5y0E", // class name
  bases__ZN3ccc7CC9x5y0E, 2,
  &(vtc__ZN3ccc7CC9x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y1  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x5y13efgEv
  ~CC9x5y1(); // tgen
  CC9x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y1E[];
extern void _ZN3ccc7CC9x5y13efgEv();
extern void _ZN3ccc7CC9x5y13pqrEv();
extern void _ZN3ccc7CC9x5y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y13pqrEv,_ZThn4_N3ccc7CC9x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y13efgEv,_ZThn4_N3ccc7CC9x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y13abcEv,_ZThn4_N3ccc7CC9x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y13pqrEv,_ZThn4_N3ccc7CC9x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y13efgEv,_ZThn4_N3ccc7CC9x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y13abcEv,_ZThn4_N3ccc7CC9x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y1E[];
Class_Descriptor cd__ZN3ccc7CC9x5y1E = {  "_ZN3ccc7CC9x5y1E", // class name
  bases__ZN3ccc7CC9x5y1E, 2,
  &(vtc__ZN3ccc7CC9x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y2  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y23pqrEv
  ~CC9x5y2(); // tgen
  CC9x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y2E[];
extern void _ZN3ccc7CC9x5y23efgEv();
extern void _ZN3ccc7CC9x5y23pqrEv();
extern void _ZN3ccc7CC9x5y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y23pqrEv,_ZThn4_N3ccc7CC9x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y23efgEv,_ZThn4_N3ccc7CC9x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y23abcEv,_ZThn4_N3ccc7CC9x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y23pqrEv,_ZThn4_N3ccc7CC9x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y23efgEv,_ZThn4_N3ccc7CC9x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y23abcEv,_ZThn4_N3ccc7CC9x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y2E[];
Class_Descriptor cd__ZN3ccc7CC9x5y2E = {  "_ZN3ccc7CC9x5y2E", // class name
  bases__ZN3ccc7CC9x5y2E, 2,
  &(vtc__ZN3ccc7CC9x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y3  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x5y33abcEv
  ~CC9x5y3(); // tgen
  CC9x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y3E[];
extern void _ZN3ccc7CC9x5y33efgEv();
extern void _ZN3ccc7CC9x5y33pqrEv();
extern void _ZN3ccc7CC9x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y33pqrEv,_ZThn4_N3ccc7CC9x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y33efgEv,_ZThn4_N3ccc7CC9x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y33abcEv,_ZThn4_N3ccc7CC9x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y33pqrEv,_ZThn4_N3ccc7CC9x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y33efgEv,_ZThn4_N3ccc7CC9x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y33abcEv,_ZThn4_N3ccc7CC9x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y3E[];
Class_Descriptor cd__ZN3ccc7CC9x5y3E = {  "_ZN3ccc7CC9x5y3E", // class name
  bases__ZN3ccc7CC9x5y3E, 2,
  &(vtc__ZN3ccc7CC9x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y4  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC9x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y43efgEv
  ~CC9x5y4(); // tgen
  CC9x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y4E[];
extern void _ZN3ccc7CC9x5y43efgEv();
extern void _ZN3ccc7CC9x5y43pqrEv();
extern void _ZN3ccc7CC9x5y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y43pqrEv,_ZThn4_N3ccc7CC9x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y43efgEv,_ZThn4_N3ccc7CC9x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y43abcEv,_ZThn4_N3ccc7CC9x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y43pqrEv,_ZThn4_N3ccc7CC9x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y43efgEv,_ZThn4_N3ccc7CC9x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y43abcEv,_ZThn4_N3ccc7CC9x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y4E[];
Class_Descriptor cd__ZN3ccc7CC9x5y4E = {  "_ZN3ccc7CC9x5y4E", // class name
  bases__ZN3ccc7CC9x5y4E, 2,
  &(vtc__ZN3ccc7CC9x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y5  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC9x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y53abcEv
  ~CC9x5y5(); // tgen
  CC9x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y5E[];
extern void _ZN3ccc7CC9x5y53efgEv();
extern void _ZN3ccc7CC9x5y53pqrEv();
extern void _ZN3ccc7CC9x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y53pqrEv,_ZThn4_N3ccc7CC9x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y53efgEv,_ZThn4_N3ccc7CC9x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y53abcEv,_ZThn4_N3ccc7CC9x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y53pqrEv,_ZThn4_N3ccc7CC9x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y53efgEv,_ZThn4_N3ccc7CC9x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y53abcEv,_ZThn4_N3ccc7CC9x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y5E[];
Class_Descriptor cd__ZN3ccc7CC9x5y5E = {  "_ZN3ccc7CC9x5y5E", // class name
  bases__ZN3ccc7CC9x5y5E, 2,
  &(vtc__ZN3ccc7CC9x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y6  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y63efgEv
  ~CC9x5y6(); // tgen
  CC9x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y6E[];
extern void _ZN3ccc7CC9x5y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y63efgEv,_ZThn4_N3ccc7CC9x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y63abcEv,_ZThn4_N3ccc7CC9x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y63efgEv,_ZThn4_N3ccc7CC9x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y63abcEv,_ZThn4_N3ccc7CC9x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y6E[];
Class_Descriptor cd__ZN3ccc7CC9x5y6E = {  "_ZN3ccc7CC9x5y6E", // class name
  bases__ZN3ccc7CC9x5y6E, 2,
  &(vtc__ZN3ccc7CC9x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y7  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y73pqrEv
  ~CC9x5y7(); // tgen
  CC9x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x5y73pqrEv();
extern void _ZN3ccc7CC9x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y73pqrEv,_ZThn4_N3ccc7CC9x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y73abcEv,_ZThn4_N3ccc7CC9x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y73pqrEv,_ZThn4_N3ccc7CC9x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y73abcEv,_ZThn4_N3ccc7CC9x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y7E[];
Class_Descriptor cd__ZN3ccc7CC9x5y7E = {  "_ZN3ccc7CC9x5y7E", // class name
  bases__ZN3ccc7CC9x5y7E, 2,
  &(vtc__ZN3ccc7CC9x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y8  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y83abcEv
  ~CC9x5y8(); // tgen
  CC9x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y8E[];
extern void _ZN3ccc7CC9x5y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y83efgEv,_ZThn4_N3ccc7CC9x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y83abcEv,_ZThn4_N3ccc7CC9x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y83efgEv,_ZThn4_N3ccc7CC9x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y83abcEv,_ZThn4_N3ccc7CC9x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y8E[];
Class_Descriptor cd__ZN3ccc7CC9x5y8E = {  "_ZN3ccc7CC9x5y8E", // class name
  bases__ZN3ccc7CC9x5y8E, 2,
  &(vtc__ZN3ccc7CC9x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y9  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y93pqrEv
  ~CC9x5y9(); // tgen
  CC9x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y9E[];
extern void _ZN3ccc7CC9x5y93efgEv();
extern void _ZN3ccc7CC9x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y93pqrEv,_ZThn4_N3ccc7CC9x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y93efgEv,_ZThn4_N3ccc7CC9x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y93pqrEv,_ZThn4_N3ccc7CC9x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x5y93efgEv,_ZThn4_N3ccc7CC9x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y9E[];
Class_Descriptor cd__ZN3ccc7CC9x5y9E = {  "_ZN3ccc7CC9x5y9E", // class name
  bases__ZN3ccc7CC9x5y9E, 2,
  &(vtc__ZN3ccc7CC9x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y10  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x5y103abcEv
  ~CC9x5y10(); // tgen
  CC9x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x5y103pqrEv();
extern void _ZN3ccc8CC9x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y103pqrEv,_ZThn4_N3ccc8CC9x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y103abcEv,_ZThn4_N3ccc8CC9x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y103pqrEv,_ZThn4_N3ccc8CC9x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y103abcEv,_ZThn4_N3ccc8CC9x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y10E[];
Class_Descriptor cd__ZN3ccc8CC9x5y10E = {  "_ZN3ccc8CC9x5y10E", // class name
  bases__ZN3ccc8CC9x5y10E, 2,
  &(vtc__ZN3ccc8CC9x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y11  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x5y113efgEv
  ~CC9x5y11(); // tgen
  CC9x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y11E[];
extern void _ZN3ccc8CC9x5y113efgEv();
extern void _ZN3ccc8CC9x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y113pqrEv,_ZThn4_N3ccc8CC9x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y113efgEv,_ZThn4_N3ccc8CC9x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y113pqrEv,_ZThn4_N3ccc8CC9x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y113efgEv,_ZThn4_N3ccc8CC9x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y11E[];
Class_Descriptor cd__ZN3ccc8CC9x5y11E = {  "_ZN3ccc8CC9x5y11E", // class name
  bases__ZN3ccc8CC9x5y11E, 2,
  &(vtc__ZN3ccc8CC9x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y12  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC9x5y123abcEv
  ~CC9x5y12(); // tgen
  CC9x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y123abcEv,_ZThn4_N3ccc8CC9x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y123abcEv,_ZThn4_N3ccc8CC9x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y12E[];
Class_Descriptor cd__ZN3ccc8CC9x5y12E = {  "_ZN3ccc8CC9x5y12E", // class name
  bases__ZN3ccc8CC9x5y12E, 2,
  &(vtc__ZN3ccc8CC9x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y13  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC9x5y133efgEv
  ~CC9x5y13(); // tgen
  CC9x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y13E[];
extern void _ZN3ccc8CC9x5y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y133efgEv,_ZThn4_N3ccc8CC9x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y133efgEv,_ZThn4_N3ccc8CC9x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y13E[];
Class_Descriptor cd__ZN3ccc8CC9x5y13E = {  "_ZN3ccc8CC9x5y13E", // class name
  bases__ZN3ccc8CC9x5y13E, 2,
  &(vtc__ZN3ccc8CC9x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y14  : ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y143pqrEv
  ~CC9x5y14(); // tgen
  CC9x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y143pqrEv,_ZThn4_N3ccc8CC9x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x5y143pqrEv,_ZThn4_N3ccc8CC9x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y14E[];
Class_Descriptor cd__ZN3ccc8CC9x5y14E = {  "_ZN3ccc8CC9x5y14E", // class name
  bases__ZN3ccc8CC9x5y14E, 2,
  &(vtc__ZN3ccc8CC9x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x5y15  : ::ccc::AA9 , ::ccc::BB5 {
  ~CC9x5y15(); // tgen
  CC9x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y15E[];
Class_Descriptor cd__ZN3ccc8CC9x5y15E = {  "_ZN3ccc8CC9x5y15E", // class name
  bases__ZN3ccc8CC9x5y15E, 2,
  &(vtc__ZN3ccc8CC9x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y0  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y03pqrEv
  ~CC9x6y0(); // tgen
  CC9x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y0E[];
extern void _ZN3ccc7CC9x6y03efgEv();
extern void _ZN3ccc7CC9x6y03pqrEv();
extern void _ZN3ccc7CC9x6y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y03abcEv,_ZThn4_N3ccc7CC9x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y03efgEv,_ZThn4_N3ccc7CC9x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y03abcEv,_ZThn4_N3ccc7CC9x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y03efgEv,_ZThn4_N3ccc7CC9x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y0E[];
Class_Descriptor cd__ZN3ccc7CC9x6y0E = {  "_ZN3ccc7CC9x6y0E", // class name
  bases__ZN3ccc7CC9x6y0E, 2,
  &(vtc__ZN3ccc7CC9x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y1  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x6y13efgEv
  ~CC9x6y1(); // tgen
  CC9x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y1E[];
extern void _ZN3ccc7CC9x6y13efgEv();
extern void _ZN3ccc7CC9x6y13pqrEv();
extern void _ZN3ccc7CC9x6y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y13abcEv,_ZThn4_N3ccc7CC9x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y13efgEv,_ZThn4_N3ccc7CC9x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y13abcEv,_ZThn4_N3ccc7CC9x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y13efgEv,_ZThn4_N3ccc7CC9x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y1E[];
Class_Descriptor cd__ZN3ccc7CC9x6y1E = {  "_ZN3ccc7CC9x6y1E", // class name
  bases__ZN3ccc7CC9x6y1E, 2,
  &(vtc__ZN3ccc7CC9x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y2  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y23pqrEv
  ~CC9x6y2(); // tgen
  CC9x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y2E[];
extern void _ZN3ccc7CC9x6y23efgEv();
extern void _ZN3ccc7CC9x6y23pqrEv();
extern void _ZN3ccc7CC9x6y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y23abcEv,_ZThn4_N3ccc7CC9x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y23efgEv,_ZThn4_N3ccc7CC9x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y23abcEv,_ZThn4_N3ccc7CC9x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y23efgEv,_ZThn4_N3ccc7CC9x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y2E[];
Class_Descriptor cd__ZN3ccc7CC9x6y2E = {  "_ZN3ccc7CC9x6y2E", // class name
  bases__ZN3ccc7CC9x6y2E, 2,
  &(vtc__ZN3ccc7CC9x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y3  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x6y33abcEv
  ~CC9x6y3(); // tgen
  CC9x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y3E[];
extern void _ZN3ccc7CC9x6y33efgEv();
extern void _ZN3ccc7CC9x6y33pqrEv();
extern void _ZN3ccc7CC9x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y33abcEv,_ZThn4_N3ccc7CC9x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y33efgEv,_ZThn4_N3ccc7CC9x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y33abcEv,_ZThn4_N3ccc7CC9x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y33efgEv,_ZThn4_N3ccc7CC9x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y3E[];
Class_Descriptor cd__ZN3ccc7CC9x6y3E = {  "_ZN3ccc7CC9x6y3E", // class name
  bases__ZN3ccc7CC9x6y3E, 2,
  &(vtc__ZN3ccc7CC9x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y4  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC9x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y43efgEv
  ~CC9x6y4(); // tgen
  CC9x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y4E[];
extern void _ZN3ccc7CC9x6y43efgEv();
extern void _ZN3ccc7CC9x6y43pqrEv();
extern void _ZN3ccc7CC9x6y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y43abcEv,_ZThn4_N3ccc7CC9x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y43efgEv,_ZThn4_N3ccc7CC9x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y43abcEv,_ZThn4_N3ccc7CC9x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y43efgEv,_ZThn4_N3ccc7CC9x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y4E[];
Class_Descriptor cd__ZN3ccc7CC9x6y4E = {  "_ZN3ccc7CC9x6y4E", // class name
  bases__ZN3ccc7CC9x6y4E, 2,
  &(vtc__ZN3ccc7CC9x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y5  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC9x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y53abcEv
  ~CC9x6y5(); // tgen
  CC9x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y5E[];
extern void _ZN3ccc7CC9x6y53efgEv();
extern void _ZN3ccc7CC9x6y53pqrEv();
extern void _ZN3ccc7CC9x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y53abcEv,_ZThn4_N3ccc7CC9x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y53efgEv,_ZThn4_N3ccc7CC9x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y53abcEv,_ZThn4_N3ccc7CC9x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y53efgEv,_ZThn4_N3ccc7CC9x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y5E[];
Class_Descriptor cd__ZN3ccc7CC9x6y5E = {  "_ZN3ccc7CC9x6y5E", // class name
  bases__ZN3ccc7CC9x6y5E, 2,
  &(vtc__ZN3ccc7CC9x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y6  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y63efgEv
  ~CC9x6y6(); // tgen
  CC9x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y6E[];
extern void _ZN3ccc7CC9x6y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y63abcEv,_ZThn4_N3ccc7CC9x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y63efgEv,_ZThn4_N3ccc7CC9x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y63abcEv,_ZThn4_N3ccc7CC9x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y63efgEv,_ZThn4_N3ccc7CC9x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y6E[];
Class_Descriptor cd__ZN3ccc7CC9x6y6E = {  "_ZN3ccc7CC9x6y6E", // class name
  bases__ZN3ccc7CC9x6y6E, 2,
  &(vtc__ZN3ccc7CC9x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y7  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y73pqrEv
  ~CC9x6y7(); // tgen
  CC9x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x6y73pqrEv();
extern void _ZN3ccc7CC9x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y73abcEv,_ZThn4_N3ccc7CC9x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y73abcEv,_ZThn4_N3ccc7CC9x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y7E[];
Class_Descriptor cd__ZN3ccc7CC9x6y7E = {  "_ZN3ccc7CC9x6y7E", // class name
  bases__ZN3ccc7CC9x6y7E, 2,
  &(vtc__ZN3ccc7CC9x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y8  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y83abcEv
  ~CC9x6y8(); // tgen
  CC9x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y8E[];
extern void _ZN3ccc7CC9x6y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y83abcEv,_ZThn4_N3ccc7CC9x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y83efgEv,_ZThn4_N3ccc7CC9x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y83abcEv,_ZThn4_N3ccc7CC9x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y83efgEv,_ZThn4_N3ccc7CC9x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y8E[];
Class_Descriptor cd__ZN3ccc7CC9x6y8E = {  "_ZN3ccc7CC9x6y8E", // class name
  bases__ZN3ccc7CC9x6y8E, 2,
  &(vtc__ZN3ccc7CC9x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y9  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y93pqrEv
  ~CC9x6y9(); // tgen
  CC9x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y9E[];
extern void _ZN3ccc7CC9x6y93efgEv();
extern void _ZN3ccc7CC9x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y93efgEv,_ZThn4_N3ccc7CC9x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x6y93efgEv,_ZThn4_N3ccc7CC9x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y9E[];
Class_Descriptor cd__ZN3ccc7CC9x6y9E = {  "_ZN3ccc7CC9x6y9E", // class name
  bases__ZN3ccc7CC9x6y9E, 2,
  &(vtc__ZN3ccc7CC9x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y10  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x6y103abcEv
  ~CC9x6y10(); // tgen
  CC9x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x6y103pqrEv();
extern void _ZN3ccc8CC9x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y103abcEv,_ZThn4_N3ccc8CC9x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x6y103abcEv,_ZThn4_N3ccc8CC9x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y10E[];
Class_Descriptor cd__ZN3ccc8CC9x6y10E = {  "_ZN3ccc8CC9x6y10E", // class name
  bases__ZN3ccc8CC9x6y10E, 2,
  &(vtc__ZN3ccc8CC9x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y11  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x6y113efgEv
  ~CC9x6y11(); // tgen
  CC9x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y11E[];
extern void _ZN3ccc8CC9x6y113efgEv();
extern void _ZN3ccc8CC9x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y113efgEv,_ZThn4_N3ccc8CC9x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x6y113efgEv,_ZThn4_N3ccc8CC9x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y11E[];
Class_Descriptor cd__ZN3ccc8CC9x6y11E = {  "_ZN3ccc8CC9x6y11E", // class name
  bases__ZN3ccc8CC9x6y11E, 2,
  &(vtc__ZN3ccc8CC9x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y12  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC9x6y123abcEv
  ~CC9x6y12(); // tgen
  CC9x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y123abcEv,_ZThn4_N3ccc8CC9x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x6y123abcEv,_ZThn4_N3ccc8CC9x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y12E[];
Class_Descriptor cd__ZN3ccc8CC9x6y12E = {  "_ZN3ccc8CC9x6y12E", // class name
  bases__ZN3ccc8CC9x6y12E, 2,
  &(vtc__ZN3ccc8CC9x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y13  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC9x6y133efgEv
  ~CC9x6y13(); // tgen
  CC9x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y13E[];
extern void _ZN3ccc8CC9x6y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y133efgEv,_ZThn4_N3ccc8CC9x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x6y133efgEv,_ZThn4_N3ccc8CC9x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y13E[];
Class_Descriptor cd__ZN3ccc8CC9x6y13E = {  "_ZN3ccc8CC9x6y13E", // class name
  bases__ZN3ccc8CC9x6y13E, 2,
  &(vtc__ZN3ccc8CC9x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y14  : ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y143pqrEv
  ~CC9x6y14(); // tgen
  CC9x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y14E[];
Class_Descriptor cd__ZN3ccc8CC9x6y14E = {  "_ZN3ccc8CC9x6y14E", // class name
  bases__ZN3ccc8CC9x6y14E, 2,
  &(vtc__ZN3ccc8CC9x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x6y15  : ::ccc::AA9 , ::ccc::BB6 {
  ~CC9x6y15(); // tgen
  CC9x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y15E[];
Class_Descriptor cd__ZN3ccc8CC9x6y15E = {  "_ZN3ccc8CC9x6y15E", // class name
  bases__ZN3ccc8CC9x6y15E, 2,
  &(vtc__ZN3ccc8CC9x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y0  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y03pqrEv
  ~CC9x7y0(); // tgen
  CC9x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y0E[];
extern void _ZN3ccc7CC9x7y03efgEv();
extern void _ZN3ccc7CC9x7y03pqrEv();
extern void _ZN3ccc7CC9x7y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y03abcEv,_ZThn4_N3ccc7CC9x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y03pqrEv,_ZThn4_N3ccc7CC9x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y03abcEv,_ZThn4_N3ccc7CC9x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y03pqrEv,_ZThn4_N3ccc7CC9x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y0E[];
Class_Descriptor cd__ZN3ccc7CC9x7y0E = {  "_ZN3ccc7CC9x7y0E", // class name
  bases__ZN3ccc7CC9x7y0E, 2,
  &(vtc__ZN3ccc7CC9x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y1  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x7y13efgEv
  ~CC9x7y1(); // tgen
  CC9x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y1E[];
extern void _ZN3ccc7CC9x7y13efgEv();
extern void _ZN3ccc7CC9x7y13pqrEv();
extern void _ZN3ccc7CC9x7y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y13abcEv,_ZThn4_N3ccc7CC9x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y13pqrEv,_ZThn4_N3ccc7CC9x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y13abcEv,_ZThn4_N3ccc7CC9x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y13pqrEv,_ZThn4_N3ccc7CC9x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y1E[];
Class_Descriptor cd__ZN3ccc7CC9x7y1E = {  "_ZN3ccc7CC9x7y1E", // class name
  bases__ZN3ccc7CC9x7y1E, 2,
  &(vtc__ZN3ccc7CC9x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y2  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y23pqrEv
  ~CC9x7y2(); // tgen
  CC9x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y2E[];
extern void _ZN3ccc7CC9x7y23efgEv();
extern void _ZN3ccc7CC9x7y23pqrEv();
extern void _ZN3ccc7CC9x7y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y23abcEv,_ZThn4_N3ccc7CC9x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y23pqrEv,_ZThn4_N3ccc7CC9x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y23abcEv,_ZThn4_N3ccc7CC9x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y23pqrEv,_ZThn4_N3ccc7CC9x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y2E[];
Class_Descriptor cd__ZN3ccc7CC9x7y2E = {  "_ZN3ccc7CC9x7y2E", // class name
  bases__ZN3ccc7CC9x7y2E, 2,
  &(vtc__ZN3ccc7CC9x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y3  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x7y33abcEv
  ~CC9x7y3(); // tgen
  CC9x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y3E[];
extern void _ZN3ccc7CC9x7y33efgEv();
extern void _ZN3ccc7CC9x7y33pqrEv();
extern void _ZN3ccc7CC9x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y33abcEv,_ZThn4_N3ccc7CC9x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y33pqrEv,_ZThn4_N3ccc7CC9x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y33abcEv,_ZThn4_N3ccc7CC9x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y33pqrEv,_ZThn4_N3ccc7CC9x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y3E[];
Class_Descriptor cd__ZN3ccc7CC9x7y3E = {  "_ZN3ccc7CC9x7y3E", // class name
  bases__ZN3ccc7CC9x7y3E, 2,
  &(vtc__ZN3ccc7CC9x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y4  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC9x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y43efgEv
  ~CC9x7y4(); // tgen
  CC9x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y4E[];
extern void _ZN3ccc7CC9x7y43efgEv();
extern void _ZN3ccc7CC9x7y43pqrEv();
extern void _ZN3ccc7CC9x7y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y43abcEv,_ZThn4_N3ccc7CC9x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y43pqrEv,_ZThn4_N3ccc7CC9x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y43abcEv,_ZThn4_N3ccc7CC9x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y43pqrEv,_ZThn4_N3ccc7CC9x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y4E[];
Class_Descriptor cd__ZN3ccc7CC9x7y4E = {  "_ZN3ccc7CC9x7y4E", // class name
  bases__ZN3ccc7CC9x7y4E, 2,
  &(vtc__ZN3ccc7CC9x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y5  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC9x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y53abcEv
  ~CC9x7y5(); // tgen
  CC9x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y5E[];
extern void _ZN3ccc7CC9x7y53efgEv();
extern void _ZN3ccc7CC9x7y53pqrEv();
extern void _ZN3ccc7CC9x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y53abcEv,_ZThn4_N3ccc7CC9x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y53pqrEv,_ZThn4_N3ccc7CC9x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y53abcEv,_ZThn4_N3ccc7CC9x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y53pqrEv,_ZThn4_N3ccc7CC9x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y5E[];
Class_Descriptor cd__ZN3ccc7CC9x7y5E = {  "_ZN3ccc7CC9x7y5E", // class name
  bases__ZN3ccc7CC9x7y5E, 2,
  &(vtc__ZN3ccc7CC9x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y6  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y63efgEv
  ~CC9x7y6(); // tgen
  CC9x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y6E[];
extern void _ZN3ccc7CC9x7y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y63abcEv,_ZThn4_N3ccc7CC9x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y63abcEv,_ZThn4_N3ccc7CC9x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y6E[];
Class_Descriptor cd__ZN3ccc7CC9x7y6E = {  "_ZN3ccc7CC9x7y6E", // class name
  bases__ZN3ccc7CC9x7y6E, 2,
  &(vtc__ZN3ccc7CC9x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y7  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y73pqrEv
  ~CC9x7y7(); // tgen
  CC9x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x7y73pqrEv();
extern void _ZN3ccc7CC9x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y73abcEv,_ZThn4_N3ccc7CC9x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y73pqrEv,_ZThn4_N3ccc7CC9x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y73abcEv,_ZThn4_N3ccc7CC9x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y73pqrEv,_ZThn4_N3ccc7CC9x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y7E[];
Class_Descriptor cd__ZN3ccc7CC9x7y7E = {  "_ZN3ccc7CC9x7y7E", // class name
  bases__ZN3ccc7CC9x7y7E, 2,
  &(vtc__ZN3ccc7CC9x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y8  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y83abcEv
  ~CC9x7y8(); // tgen
  CC9x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y8E[];
extern void _ZN3ccc7CC9x7y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y83abcEv,_ZThn4_N3ccc7CC9x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y83abcEv,_ZThn4_N3ccc7CC9x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y8E[];
Class_Descriptor cd__ZN3ccc7CC9x7y8E = {  "_ZN3ccc7CC9x7y8E", // class name
  bases__ZN3ccc7CC9x7y8E, 2,
  &(vtc__ZN3ccc7CC9x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y9  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y93pqrEv
  ~CC9x7y9(); // tgen
  CC9x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y9E[];
extern void _ZN3ccc7CC9x7y93efgEv();
extern void _ZN3ccc7CC9x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y93pqrEv,_ZThn4_N3ccc7CC9x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x7y93pqrEv,_ZThn4_N3ccc7CC9x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y9E[];
Class_Descriptor cd__ZN3ccc7CC9x7y9E = {  "_ZN3ccc7CC9x7y9E", // class name
  bases__ZN3ccc7CC9x7y9E, 2,
  &(vtc__ZN3ccc7CC9x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y10  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x7y103abcEv
  ~CC9x7y10(); // tgen
  CC9x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x7y103pqrEv();
extern void _ZN3ccc8CC9x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y103abcEv,_ZThn4_N3ccc8CC9x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y103pqrEv,_ZThn4_N3ccc8CC9x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x7y103abcEv,_ZThn4_N3ccc8CC9x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x7y103pqrEv,_ZThn4_N3ccc8CC9x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y10E[];
Class_Descriptor cd__ZN3ccc8CC9x7y10E = {  "_ZN3ccc8CC9x7y10E", // class name
  bases__ZN3ccc8CC9x7y10E, 2,
  &(vtc__ZN3ccc8CC9x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y11  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x7y113efgEv
  ~CC9x7y11(); // tgen
  CC9x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y11E[];
extern void _ZN3ccc8CC9x7y113efgEv();
extern void _ZN3ccc8CC9x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y113pqrEv,_ZThn4_N3ccc8CC9x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x7y113pqrEv,_ZThn4_N3ccc8CC9x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y11E[];
Class_Descriptor cd__ZN3ccc8CC9x7y11E = {  "_ZN3ccc8CC9x7y11E", // class name
  bases__ZN3ccc8CC9x7y11E, 2,
  &(vtc__ZN3ccc8CC9x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y12  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC9x7y123abcEv
  ~CC9x7y12(); // tgen
  CC9x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y123abcEv,_ZThn4_N3ccc8CC9x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x7y123abcEv,_ZThn4_N3ccc8CC9x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y12E[];
Class_Descriptor cd__ZN3ccc8CC9x7y12E = {  "_ZN3ccc8CC9x7y12E", // class name
  bases__ZN3ccc8CC9x7y12E, 2,
  &(vtc__ZN3ccc8CC9x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y13  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC9x7y133efgEv
  ~CC9x7y13(); // tgen
  CC9x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y13E[];
extern void _ZN3ccc8CC9x7y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y13E[];
Class_Descriptor cd__ZN3ccc8CC9x7y13E = {  "_ZN3ccc8CC9x7y13E", // class name
  bases__ZN3ccc8CC9x7y13E, 2,
  &(vtc__ZN3ccc8CC9x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y14  : ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y143pqrEv
  ~CC9x7y14(); // tgen
  CC9x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y143pqrEv,_ZThn4_N3ccc8CC9x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x7y143pqrEv,_ZThn4_N3ccc8CC9x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y14E[];
Class_Descriptor cd__ZN3ccc8CC9x7y14E = {  "_ZN3ccc8CC9x7y14E", // class name
  bases__ZN3ccc8CC9x7y14E, 2,
  &(vtc__ZN3ccc8CC9x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x7y15  : ::ccc::AA9 , ::ccc::BB7 {
  ~CC9x7y15(); // tgen
  CC9x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y15E[];
Class_Descriptor cd__ZN3ccc8CC9x7y15E = {  "_ZN3ccc8CC9x7y15E", // class name
  bases__ZN3ccc8CC9x7y15E, 2,
  &(vtc__ZN3ccc8CC9x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y0  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y03pqrEv
  ~CC9x8y0(); // tgen
  CC9x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y0E[];
extern void _ZN3ccc7CC9x8y03efgEv();
extern void _ZN3ccc7CC9x8y03pqrEv();
extern void _ZN3ccc7CC9x8y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y03efgEv,_ZThn4_N3ccc7CC9x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y03abcEv,_ZThn4_N3ccc7CC9x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y03efgEv,_ZThn4_N3ccc7CC9x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y03abcEv,_ZThn4_N3ccc7CC9x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y0E[];
Class_Descriptor cd__ZN3ccc7CC9x8y0E = {  "_ZN3ccc7CC9x8y0E", // class name
  bases__ZN3ccc7CC9x8y0E, 2,
  &(vtc__ZN3ccc7CC9x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y1  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x8y13efgEv
  ~CC9x8y1(); // tgen
  CC9x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y1E[];
extern void _ZN3ccc7CC9x8y13efgEv();
extern void _ZN3ccc7CC9x8y13pqrEv();
extern void _ZN3ccc7CC9x8y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y13efgEv,_ZThn4_N3ccc7CC9x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y13abcEv,_ZThn4_N3ccc7CC9x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y13efgEv,_ZThn4_N3ccc7CC9x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y13abcEv,_ZThn4_N3ccc7CC9x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y1E[];
Class_Descriptor cd__ZN3ccc7CC9x8y1E = {  "_ZN3ccc7CC9x8y1E", // class name
  bases__ZN3ccc7CC9x8y1E, 2,
  &(vtc__ZN3ccc7CC9x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y2  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y23pqrEv
  ~CC9x8y2(); // tgen
  CC9x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y2E[];
extern void _ZN3ccc7CC9x8y23efgEv();
extern void _ZN3ccc7CC9x8y23pqrEv();
extern void _ZN3ccc7CC9x8y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y23efgEv,_ZThn4_N3ccc7CC9x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y23abcEv,_ZThn4_N3ccc7CC9x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y23efgEv,_ZThn4_N3ccc7CC9x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y23abcEv,_ZThn4_N3ccc7CC9x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y2E[];
Class_Descriptor cd__ZN3ccc7CC9x8y2E = {  "_ZN3ccc7CC9x8y2E", // class name
  bases__ZN3ccc7CC9x8y2E, 2,
  &(vtc__ZN3ccc7CC9x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y3  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x8y33abcEv
  ~CC9x8y3(); // tgen
  CC9x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y3E[];
extern void _ZN3ccc7CC9x8y33efgEv();
extern void _ZN3ccc7CC9x8y33pqrEv();
extern void _ZN3ccc7CC9x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y33efgEv,_ZThn4_N3ccc7CC9x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y33abcEv,_ZThn4_N3ccc7CC9x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y33efgEv,_ZThn4_N3ccc7CC9x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y33abcEv,_ZThn4_N3ccc7CC9x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y3E[];
Class_Descriptor cd__ZN3ccc7CC9x8y3E = {  "_ZN3ccc7CC9x8y3E", // class name
  bases__ZN3ccc7CC9x8y3E, 2,
  &(vtc__ZN3ccc7CC9x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y4  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC9x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y43efgEv
  ~CC9x8y4(); // tgen
  CC9x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y4E[];
extern void _ZN3ccc7CC9x8y43efgEv();
extern void _ZN3ccc7CC9x8y43pqrEv();
extern void _ZN3ccc7CC9x8y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y43efgEv,_ZThn4_N3ccc7CC9x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y43abcEv,_ZThn4_N3ccc7CC9x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y43efgEv,_ZThn4_N3ccc7CC9x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y43abcEv,_ZThn4_N3ccc7CC9x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y4E[];
Class_Descriptor cd__ZN3ccc7CC9x8y4E = {  "_ZN3ccc7CC9x8y4E", // class name
  bases__ZN3ccc7CC9x8y4E, 2,
  &(vtc__ZN3ccc7CC9x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y5  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC9x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y53abcEv
  ~CC9x8y5(); // tgen
  CC9x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y5E[];
extern void _ZN3ccc7CC9x8y53efgEv();
extern void _ZN3ccc7CC9x8y53pqrEv();
extern void _ZN3ccc7CC9x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y53efgEv,_ZThn4_N3ccc7CC9x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y53abcEv,_ZThn4_N3ccc7CC9x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y53efgEv,_ZThn4_N3ccc7CC9x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y53abcEv,_ZThn4_N3ccc7CC9x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y5E[];
Class_Descriptor cd__ZN3ccc7CC9x8y5E = {  "_ZN3ccc7CC9x8y5E", // class name
  bases__ZN3ccc7CC9x8y5E, 2,
  &(vtc__ZN3ccc7CC9x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y6  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y63efgEv
  ~CC9x8y6(); // tgen
  CC9x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y6E[];
extern void _ZN3ccc7CC9x8y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y63efgEv,_ZThn4_N3ccc7CC9x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y63abcEv,_ZThn4_N3ccc7CC9x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y63efgEv,_ZThn4_N3ccc7CC9x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y63abcEv,_ZThn4_N3ccc7CC9x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y6E[];
Class_Descriptor cd__ZN3ccc7CC9x8y6E = {  "_ZN3ccc7CC9x8y6E", // class name
  bases__ZN3ccc7CC9x8y6E, 2,
  &(vtc__ZN3ccc7CC9x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y7  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y73pqrEv
  ~CC9x8y7(); // tgen
  CC9x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x8y73pqrEv();
extern void _ZN3ccc7CC9x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y73abcEv,_ZThn4_N3ccc7CC9x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y73abcEv,_ZThn4_N3ccc7CC9x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y7E[];
Class_Descriptor cd__ZN3ccc7CC9x8y7E = {  "_ZN3ccc7CC9x8y7E", // class name
  bases__ZN3ccc7CC9x8y7E, 2,
  &(vtc__ZN3ccc7CC9x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y8  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y83abcEv
  ~CC9x8y8(); // tgen
  CC9x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y8E[];
extern void _ZN3ccc7CC9x8y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y83efgEv,_ZThn4_N3ccc7CC9x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y83abcEv,_ZThn4_N3ccc7CC9x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y83efgEv,_ZThn4_N3ccc7CC9x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y83abcEv,_ZThn4_N3ccc7CC9x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y8E[];
Class_Descriptor cd__ZN3ccc7CC9x8y8E = {  "_ZN3ccc7CC9x8y8E", // class name
  bases__ZN3ccc7CC9x8y8E, 2,
  &(vtc__ZN3ccc7CC9x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y9  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y93pqrEv
  ~CC9x8y9(); // tgen
  CC9x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y9E[];
extern void _ZN3ccc7CC9x8y93efgEv();
extern void _ZN3ccc7CC9x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y93efgEv,_ZThn4_N3ccc7CC9x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x8y93efgEv,_ZThn4_N3ccc7CC9x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y9E[];
Class_Descriptor cd__ZN3ccc7CC9x8y9E = {  "_ZN3ccc7CC9x8y9E", // class name
  bases__ZN3ccc7CC9x8y9E, 2,
  &(vtc__ZN3ccc7CC9x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y10  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x8y103abcEv
  ~CC9x8y10(); // tgen
  CC9x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x8y103pqrEv();
extern void _ZN3ccc8CC9x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y103abcEv,_ZThn4_N3ccc8CC9x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x8y103abcEv,_ZThn4_N3ccc8CC9x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y10E[];
Class_Descriptor cd__ZN3ccc8CC9x8y10E = {  "_ZN3ccc8CC9x8y10E", // class name
  bases__ZN3ccc8CC9x8y10E, 2,
  &(vtc__ZN3ccc8CC9x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y11  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x8y113efgEv
  ~CC9x8y11(); // tgen
  CC9x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y11E[];
extern void _ZN3ccc8CC9x8y113efgEv();
extern void _ZN3ccc8CC9x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y113efgEv,_ZThn4_N3ccc8CC9x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x8y113efgEv,_ZThn4_N3ccc8CC9x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y11E[];
Class_Descriptor cd__ZN3ccc8CC9x8y11E = {  "_ZN3ccc8CC9x8y11E", // class name
  bases__ZN3ccc8CC9x8y11E, 2,
  &(vtc__ZN3ccc8CC9x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y12  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC9x8y123abcEv
  ~CC9x8y12(); // tgen
  CC9x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y123abcEv,_ZThn4_N3ccc8CC9x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x8y123abcEv,_ZThn4_N3ccc8CC9x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y12E[];
Class_Descriptor cd__ZN3ccc8CC9x8y12E = {  "_ZN3ccc8CC9x8y12E", // class name
  bases__ZN3ccc8CC9x8y12E, 2,
  &(vtc__ZN3ccc8CC9x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y13  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC9x8y133efgEv
  ~CC9x8y13(); // tgen
  CC9x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y13E[];
extern void _ZN3ccc8CC9x8y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y133efgEv,_ZThn4_N3ccc8CC9x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x8y133efgEv,_ZThn4_N3ccc8CC9x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y13E[];
Class_Descriptor cd__ZN3ccc8CC9x8y13E = {  "_ZN3ccc8CC9x8y13E", // class name
  bases__ZN3ccc8CC9x8y13E, 2,
  &(vtc__ZN3ccc8CC9x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y14  : ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y143pqrEv
  ~CC9x8y14(); // tgen
  CC9x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y14E[];
Class_Descriptor cd__ZN3ccc8CC9x8y14E = {  "_ZN3ccc8CC9x8y14E", // class name
  bases__ZN3ccc8CC9x8y14E, 2,
  &(vtc__ZN3ccc8CC9x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x8y15  : ::ccc::AA9 , ::ccc::BB8 {
  ~CC9x8y15(); // tgen
  CC9x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y15E[];
Class_Descriptor cd__ZN3ccc8CC9x8y15E = {  "_ZN3ccc8CC9x8y15E", // class name
  bases__ZN3ccc8CC9x8y15E, 2,
  &(vtc__ZN3ccc8CC9x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y0  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y03pqrEv
  ~CC9x9y0(); // tgen
  CC9x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y0E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y0E[];
extern void _ZN3ccc7CC9x9y03efgEv();
extern void _ZN3ccc7CC9x9y03pqrEv();
extern void _ZN3ccc7CC9x9y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y03efgEv,_ZThn4_N3ccc7CC9x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y03pqrEv,_ZThn4_N3ccc7CC9x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y03efgEv,_ZThn4_N3ccc7CC9x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y03pqrEv,_ZThn4_N3ccc7CC9x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y0E[];
Class_Descriptor cd__ZN3ccc7CC9x9y0E = {  "_ZN3ccc7CC9x9y0E", // class name
  bases__ZN3ccc7CC9x9y0E, 2,
  &(vtc__ZN3ccc7CC9x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y1  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x9y13efgEv
  ~CC9x9y1(); // tgen
  CC9x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y1E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y1E[];
extern void _ZN3ccc7CC9x9y13efgEv();
extern void _ZN3ccc7CC9x9y13pqrEv();
extern void _ZN3ccc7CC9x9y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y13efgEv,_ZThn4_N3ccc7CC9x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y13pqrEv,_ZThn4_N3ccc7CC9x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y13efgEv,_ZThn4_N3ccc7CC9x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y13pqrEv,_ZThn4_N3ccc7CC9x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y1E[];
Class_Descriptor cd__ZN3ccc7CC9x9y1E = {  "_ZN3ccc7CC9x9y1E", // class name
  bases__ZN3ccc7CC9x9y1E, 2,
  &(vtc__ZN3ccc7CC9x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y2  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y23pqrEv
  ~CC9x9y2(); // tgen
  CC9x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y2E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y2E[];
extern void _ZN3ccc7CC9x9y23efgEv();
extern void _ZN3ccc7CC9x9y23pqrEv();
extern void _ZN3ccc7CC9x9y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y23efgEv,_ZThn4_N3ccc7CC9x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y23pqrEv,_ZThn4_N3ccc7CC9x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y23efgEv,_ZThn4_N3ccc7CC9x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y23pqrEv,_ZThn4_N3ccc7CC9x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y2E[];
Class_Descriptor cd__ZN3ccc7CC9x9y2E = {  "_ZN3ccc7CC9x9y2E", // class name
  bases__ZN3ccc7CC9x9y2E, 2,
  &(vtc__ZN3ccc7CC9x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y3  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x9y33abcEv
  ~CC9x9y3(); // tgen
  CC9x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y3E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y3E[];
extern void _ZN3ccc7CC9x9y33efgEv();
extern void _ZN3ccc7CC9x9y33pqrEv();
extern void _ZN3ccc7CC9x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y33efgEv,_ZThn4_N3ccc7CC9x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y33pqrEv,_ZThn4_N3ccc7CC9x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y33efgEv,_ZThn4_N3ccc7CC9x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y33pqrEv,_ZThn4_N3ccc7CC9x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y3E[];
Class_Descriptor cd__ZN3ccc7CC9x9y3E = {  "_ZN3ccc7CC9x9y3E", // class name
  bases__ZN3ccc7CC9x9y3E, 2,
  &(vtc__ZN3ccc7CC9x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y4  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC9x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y43efgEv
  ~CC9x9y4(); // tgen
  CC9x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y4E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y4E[];
extern void _ZN3ccc7CC9x9y43efgEv();
extern void _ZN3ccc7CC9x9y43pqrEv();
extern void _ZN3ccc7CC9x9y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y43efgEv,_ZThn4_N3ccc7CC9x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y43pqrEv,_ZThn4_N3ccc7CC9x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y43efgEv,_ZThn4_N3ccc7CC9x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y43pqrEv,_ZThn4_N3ccc7CC9x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y4E[];
Class_Descriptor cd__ZN3ccc7CC9x9y4E = {  "_ZN3ccc7CC9x9y4E", // class name
  bases__ZN3ccc7CC9x9y4E, 2,
  &(vtc__ZN3ccc7CC9x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y5  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC9x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y53abcEv
  ~CC9x9y5(); // tgen
  CC9x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y5E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y5E[];
extern void _ZN3ccc7CC9x9y53efgEv();
extern void _ZN3ccc7CC9x9y53pqrEv();
extern void _ZN3ccc7CC9x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y53efgEv,_ZThn4_N3ccc7CC9x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y53pqrEv,_ZThn4_N3ccc7CC9x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y53efgEv,_ZThn4_N3ccc7CC9x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y53pqrEv,_ZThn4_N3ccc7CC9x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y5E[];
Class_Descriptor cd__ZN3ccc7CC9x9y5E = {  "_ZN3ccc7CC9x9y5E", // class name
  bases__ZN3ccc7CC9x9y5E, 2,
  &(vtc__ZN3ccc7CC9x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y6  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y63efgEv
  ~CC9x9y6(); // tgen
  CC9x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y6E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y6E[];
extern void _ZN3ccc7CC9x9y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y63efgEv,_ZThn4_N3ccc7CC9x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y63efgEv,_ZThn4_N3ccc7CC9x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y6E[];
Class_Descriptor cd__ZN3ccc7CC9x9y6E = {  "_ZN3ccc7CC9x9y6E", // class name
  bases__ZN3ccc7CC9x9y6E, 2,
  &(vtc__ZN3ccc7CC9x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y7  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y73pqrEv
  ~CC9x9y7(); // tgen
  CC9x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y7E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7CC9x9y73pqrEv();
extern void _ZN3ccc7CC9x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y73pqrEv,_ZThn4_N3ccc7CC9x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y73pqrEv,_ZThn4_N3ccc7CC9x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y7E[];
Class_Descriptor cd__ZN3ccc7CC9x9y7E = {  "_ZN3ccc7CC9x9y7E", // class name
  bases__ZN3ccc7CC9x9y7E, 2,
  &(vtc__ZN3ccc7CC9x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y8  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y83abcEv
  ~CC9x9y8(); // tgen
  CC9x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y8E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y8E[];
extern void _ZN3ccc7CC9x9y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7CC9x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y83efgEv,_ZThn4_N3ccc7CC9x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y83efgEv,_ZThn4_N3ccc7CC9x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y8E[];
Class_Descriptor cd__ZN3ccc7CC9x9y8E = {  "_ZN3ccc7CC9x9y8E", // class name
  bases__ZN3ccc7CC9x9y8E, 2,
  &(vtc__ZN3ccc7CC9x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y9  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y93pqrEv
  ~CC9x9y9(); // tgen
  CC9x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y9E) C1{ BC2{ 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*), 0, "_ZN3ccc7CC9x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y9E[];
extern void _ZN3ccc7CC9x9y93efgEv();
extern void _ZN3ccc7CC9x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y93efgEv,_ZThn4_N3ccc7CC9x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y93pqrEv,_ZThn4_N3ccc7CC9x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y93efgEv,_ZThn4_N3ccc7CC9x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc7CC9x9y93pqrEv,_ZThn4_N3ccc7CC9x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y9E[];
Class_Descriptor cd__ZN3ccc7CC9x9y9E = {  "_ZN3ccc7CC9x9y9E", // class name
  bases__ZN3ccc7CC9x9y9E, 2,
  &(vtc__ZN3ccc7CC9x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y10  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x9y103abcEv
  ~CC9x9y10(); // tgen
  CC9x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y10E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x9y103pqrEv();
extern void _ZN3ccc8CC9x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y103pqrEv,_ZThn4_N3ccc8CC9x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x9y103pqrEv,_ZThn4_N3ccc8CC9x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y10E[];
Class_Descriptor cd__ZN3ccc8CC9x9y10E = {  "_ZN3ccc8CC9x9y10E", // class name
  bases__ZN3ccc8CC9x9y10E, 2,
  &(vtc__ZN3ccc8CC9x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y11  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x9y113efgEv
  ~CC9x9y11(); // tgen
  CC9x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y11E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y11E[];
extern void _ZN3ccc8CC9x9y113efgEv();
extern void _ZN3ccc8CC9x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y113efgEv,_ZThn4_N3ccc8CC9x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y113pqrEv,_ZThn4_N3ccc8CC9x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x9y113efgEv,_ZThn4_N3ccc8CC9x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x9y113pqrEv,_ZThn4_N3ccc8CC9x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y11E[];
Class_Descriptor cd__ZN3ccc8CC9x9y11E = {  "_ZN3ccc8CC9x9y11E", // class name
  bases__ZN3ccc8CC9x9y11E, 2,
  &(vtc__ZN3ccc8CC9x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y12  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC9x9y123abcEv
  ~CC9x9y12(); // tgen
  CC9x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y12E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y12E[];
Class_Descriptor cd__ZN3ccc8CC9x9y12E = {  "_ZN3ccc8CC9x9y12E", // class name
  bases__ZN3ccc8CC9x9y12E, 2,
  &(vtc__ZN3ccc8CC9x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y13  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC9x9y133efgEv
  ~CC9x9y13(); // tgen
  CC9x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y13E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y13E[];
extern void _ZN3ccc8CC9x9y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y133efgEv,_ZThn4_N3ccc8CC9x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x9y133efgEv,_ZThn4_N3ccc8CC9x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y13E[];
Class_Descriptor cd__ZN3ccc8CC9x9y13E = {  "_ZN3ccc8CC9x9y13E", // class name
  bases__ZN3ccc8CC9x9y13E, 2,
  &(vtc__ZN3ccc8CC9x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y14  : ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y143pqrEv
  ~CC9x9y14(); // tgen
  CC9x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y14E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y143pqrEv,_ZThn4_N3ccc8CC9x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x9y143pqrEv,_ZThn4_N3ccc8CC9x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y14E[];
Class_Descriptor cd__ZN3ccc8CC9x9y14E = {  "_ZN3ccc8CC9x9y14E", // class name
  bases__ZN3ccc8CC9x9y14E, 2,
  &(vtc__ZN3ccc8CC9x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x9y15  : ::ccc::AA9 , ::ccc::BB9 {
  ~CC9x9y15(); // tgen
  CC9x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y15E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y15E[];
Class_Descriptor cd__ZN3ccc8CC9x9y15E = {  "_ZN3ccc8CC9x9y15E", // class name
  bases__ZN3ccc8CC9x9y15E, 2,
  &(vtc__ZN3ccc8CC9x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y0  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y03pqrEv
  ~CC9x10y0(); // tgen
  CC9x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y0E[];
extern void _ZN3ccc8CC9x10y03efgEv();
extern void _ZN3ccc8CC9x10y03pqrEv();
extern void _ZN3ccc8CC9x10y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y03pqrEv,_ZThn4_N3ccc8CC9x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y03abcEv,_ZThn4_N3ccc8CC9x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y03pqrEv,_ZThn4_N3ccc8CC9x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y03abcEv,_ZThn4_N3ccc8CC9x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y0E[];
Class_Descriptor cd__ZN3ccc8CC9x10y0E = {  "_ZN3ccc8CC9x10y0E", // class name
  bases__ZN3ccc8CC9x10y0E, 2,
  &(vtc__ZN3ccc8CC9x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y1  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x10y13efgEv
  ~CC9x10y1(); // tgen
  CC9x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y1E[];
extern void _ZN3ccc8CC9x10y13efgEv();
extern void _ZN3ccc8CC9x10y13pqrEv();
extern void _ZN3ccc8CC9x10y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y13pqrEv,_ZThn4_N3ccc8CC9x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y13abcEv,_ZThn4_N3ccc8CC9x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y13pqrEv,_ZThn4_N3ccc8CC9x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y13abcEv,_ZThn4_N3ccc8CC9x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y1E[];
Class_Descriptor cd__ZN3ccc8CC9x10y1E = {  "_ZN3ccc8CC9x10y1E", // class name
  bases__ZN3ccc8CC9x10y1E, 2,
  &(vtc__ZN3ccc8CC9x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y2  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y23pqrEv
  ~CC9x10y2(); // tgen
  CC9x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y2E[];
extern void _ZN3ccc8CC9x10y23efgEv();
extern void _ZN3ccc8CC9x10y23pqrEv();
extern void _ZN3ccc8CC9x10y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y23pqrEv,_ZThn4_N3ccc8CC9x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y23abcEv,_ZThn4_N3ccc8CC9x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y23pqrEv,_ZThn4_N3ccc8CC9x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y23abcEv,_ZThn4_N3ccc8CC9x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y2E[];
Class_Descriptor cd__ZN3ccc8CC9x10y2E = {  "_ZN3ccc8CC9x10y2E", // class name
  bases__ZN3ccc8CC9x10y2E, 2,
  &(vtc__ZN3ccc8CC9x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y3  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x10y33abcEv
  ~CC9x10y3(); // tgen
  CC9x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y3E[];
extern void _ZN3ccc8CC9x10y33efgEv();
extern void _ZN3ccc8CC9x10y33pqrEv();
extern void _ZN3ccc8CC9x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y33pqrEv,_ZThn4_N3ccc8CC9x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y33abcEv,_ZThn4_N3ccc8CC9x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y33pqrEv,_ZThn4_N3ccc8CC9x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y33abcEv,_ZThn4_N3ccc8CC9x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y3E[];
Class_Descriptor cd__ZN3ccc8CC9x10y3E = {  "_ZN3ccc8CC9x10y3E", // class name
  bases__ZN3ccc8CC9x10y3E, 2,
  &(vtc__ZN3ccc8CC9x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y4  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC9x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y43efgEv
  ~CC9x10y4(); // tgen
  CC9x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y4E[];
extern void _ZN3ccc8CC9x10y43efgEv();
extern void _ZN3ccc8CC9x10y43pqrEv();
extern void _ZN3ccc8CC9x10y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y43pqrEv,_ZThn4_N3ccc8CC9x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y43abcEv,_ZThn4_N3ccc8CC9x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y43pqrEv,_ZThn4_N3ccc8CC9x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y43abcEv,_ZThn4_N3ccc8CC9x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y4E[];
Class_Descriptor cd__ZN3ccc8CC9x10y4E = {  "_ZN3ccc8CC9x10y4E", // class name
  bases__ZN3ccc8CC9x10y4E, 2,
  &(vtc__ZN3ccc8CC9x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y5  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC9x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y53abcEv
  ~CC9x10y5(); // tgen
  CC9x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y5E[];
extern void _ZN3ccc8CC9x10y53efgEv();
extern void _ZN3ccc8CC9x10y53pqrEv();
extern void _ZN3ccc8CC9x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y53pqrEv,_ZThn4_N3ccc8CC9x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y53abcEv,_ZThn4_N3ccc8CC9x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y53pqrEv,_ZThn4_N3ccc8CC9x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y53abcEv,_ZThn4_N3ccc8CC9x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y5E[];
Class_Descriptor cd__ZN3ccc8CC9x10y5E = {  "_ZN3ccc8CC9x10y5E", // class name
  bases__ZN3ccc8CC9x10y5E, 2,
  &(vtc__ZN3ccc8CC9x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y6  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y63efgEv
  ~CC9x10y6(); // tgen
  CC9x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y6E[];
extern void _ZN3ccc8CC9x10y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y63abcEv,_ZThn4_N3ccc8CC9x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y63abcEv,_ZThn4_N3ccc8CC9x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y6E[];
Class_Descriptor cd__ZN3ccc8CC9x10y6E = {  "_ZN3ccc8CC9x10y6E", // class name
  bases__ZN3ccc8CC9x10y6E, 2,
  &(vtc__ZN3ccc8CC9x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y7  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y73pqrEv
  ~CC9x10y7(); // tgen
  CC9x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x10y73pqrEv();
extern void _ZN3ccc8CC9x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y73pqrEv,_ZThn4_N3ccc8CC9x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y73abcEv,_ZThn4_N3ccc8CC9x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y73pqrEv,_ZThn4_N3ccc8CC9x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y73abcEv,_ZThn4_N3ccc8CC9x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y7E[];
Class_Descriptor cd__ZN3ccc8CC9x10y7E = {  "_ZN3ccc8CC9x10y7E", // class name
  bases__ZN3ccc8CC9x10y7E, 2,
  &(vtc__ZN3ccc8CC9x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y8  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y83abcEv
  ~CC9x10y8(); // tgen
  CC9x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y8E[];
extern void _ZN3ccc8CC9x10y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y83abcEv,_ZThn4_N3ccc8CC9x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y83abcEv,_ZThn4_N3ccc8CC9x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y8E[];
Class_Descriptor cd__ZN3ccc8CC9x10y8E = {  "_ZN3ccc8CC9x10y8E", // class name
  bases__ZN3ccc8CC9x10y8E, 2,
  &(vtc__ZN3ccc8CC9x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y9  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y93pqrEv
  ~CC9x10y9(); // tgen
  CC9x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y9E[];
extern void _ZN3ccc8CC9x10y93efgEv();
extern void _ZN3ccc8CC9x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y93pqrEv,_ZThn4_N3ccc8CC9x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x10y93pqrEv,_ZThn4_N3ccc8CC9x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y9E[];
Class_Descriptor cd__ZN3ccc8CC9x10y9E = {  "_ZN3ccc8CC9x10y9E", // class name
  bases__ZN3ccc8CC9x10y9E, 2,
  &(vtc__ZN3ccc8CC9x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y10  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x10y103abcEv
  ~CC9x10y10(); // tgen
  CC9x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x10y103pqrEv();
extern void _ZN3ccc9CC9x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y103pqrEv,_ZThn4_N3ccc9CC9x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y103abcEv,_ZThn4_N3ccc9CC9x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x10y103pqrEv,_ZThn4_N3ccc9CC9x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x10y103abcEv,_ZThn4_N3ccc9CC9x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y10E[];
Class_Descriptor cd__ZN3ccc9CC9x10y10E = {  "_ZN3ccc9CC9x10y10E", // class name
  bases__ZN3ccc9CC9x10y10E, 2,
  &(vtc__ZN3ccc9CC9x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y11  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x10y113efgEv
  ~CC9x10y11(); // tgen
  CC9x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y11E[];
extern void _ZN3ccc9CC9x10y113efgEv();
extern void _ZN3ccc9CC9x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y113pqrEv,_ZThn4_N3ccc9CC9x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x10y113pqrEv,_ZThn4_N3ccc9CC9x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y11E[];
Class_Descriptor cd__ZN3ccc9CC9x10y11E = {  "_ZN3ccc9CC9x10y11E", // class name
  bases__ZN3ccc9CC9x10y11E, 2,
  &(vtc__ZN3ccc9CC9x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y12  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC9x10y123abcEv
  ~CC9x10y12(); // tgen
  CC9x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y123abcEv,_ZThn4_N3ccc9CC9x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x10y123abcEv,_ZThn4_N3ccc9CC9x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y12E[];
Class_Descriptor cd__ZN3ccc9CC9x10y12E = {  "_ZN3ccc9CC9x10y12E", // class name
  bases__ZN3ccc9CC9x10y12E, 2,
  &(vtc__ZN3ccc9CC9x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y13  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC9x10y133efgEv
  ~CC9x10y13(); // tgen
  CC9x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y13E[];
extern void _ZN3ccc9CC9x10y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y13E[];
Class_Descriptor cd__ZN3ccc9CC9x10y13E = {  "_ZN3ccc9CC9x10y13E", // class name
  bases__ZN3ccc9CC9x10y13E, 2,
  &(vtc__ZN3ccc9CC9x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y14  : ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y143pqrEv
  ~CC9x10y14(); // tgen
  CC9x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y143pqrEv,_ZThn4_N3ccc9CC9x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x10y143pqrEv,_ZThn4_N3ccc9CC9x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y14E[];
Class_Descriptor cd__ZN3ccc9CC9x10y14E = {  "_ZN3ccc9CC9x10y14E", // class name
  bases__ZN3ccc9CC9x10y14E, 2,
  &(vtc__ZN3ccc9CC9x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x10y15  : ::ccc::AA9 , ::ccc::BB10 {
  ~CC9x10y15(); // tgen
  CC9x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y15E[];
Class_Descriptor cd__ZN3ccc9CC9x10y15E = {  "_ZN3ccc9CC9x10y15E", // class name
  bases__ZN3ccc9CC9x10y15E, 2,
  &(vtc__ZN3ccc9CC9x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y0  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y03pqrEv
  ~CC9x11y0(); // tgen
  CC9x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y0E[];
extern void _ZN3ccc8CC9x11y03efgEv();
extern void _ZN3ccc8CC9x11y03pqrEv();
extern void _ZN3ccc8CC9x11y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y03pqrEv,_ZThn4_N3ccc8CC9x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y03efgEv,_ZThn4_N3ccc8CC9x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y03pqrEv,_ZThn4_N3ccc8CC9x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y03efgEv,_ZThn4_N3ccc8CC9x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y0E[];
Class_Descriptor cd__ZN3ccc8CC9x11y0E = {  "_ZN3ccc8CC9x11y0E", // class name
  bases__ZN3ccc8CC9x11y0E, 2,
  &(vtc__ZN3ccc8CC9x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y1  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x11y13efgEv
  ~CC9x11y1(); // tgen
  CC9x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y1E[];
extern void _ZN3ccc8CC9x11y13efgEv();
extern void _ZN3ccc8CC9x11y13pqrEv();
extern void _ZN3ccc8CC9x11y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y13pqrEv,_ZThn4_N3ccc8CC9x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y13efgEv,_ZThn4_N3ccc8CC9x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y13pqrEv,_ZThn4_N3ccc8CC9x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y13efgEv,_ZThn4_N3ccc8CC9x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y1E[];
Class_Descriptor cd__ZN3ccc8CC9x11y1E = {  "_ZN3ccc8CC9x11y1E", // class name
  bases__ZN3ccc8CC9x11y1E, 2,
  &(vtc__ZN3ccc8CC9x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y2  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y23pqrEv
  ~CC9x11y2(); // tgen
  CC9x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y2E[];
extern void _ZN3ccc8CC9x11y23efgEv();
extern void _ZN3ccc8CC9x11y23pqrEv();
extern void _ZN3ccc8CC9x11y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y23pqrEv,_ZThn4_N3ccc8CC9x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y23efgEv,_ZThn4_N3ccc8CC9x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y23pqrEv,_ZThn4_N3ccc8CC9x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y23efgEv,_ZThn4_N3ccc8CC9x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y2E[];
Class_Descriptor cd__ZN3ccc8CC9x11y2E = {  "_ZN3ccc8CC9x11y2E", // class name
  bases__ZN3ccc8CC9x11y2E, 2,
  &(vtc__ZN3ccc8CC9x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y3  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x11y33abcEv
  ~CC9x11y3(); // tgen
  CC9x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y3E[];
extern void _ZN3ccc8CC9x11y33efgEv();
extern void _ZN3ccc8CC9x11y33pqrEv();
extern void _ZN3ccc8CC9x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y33pqrEv,_ZThn4_N3ccc8CC9x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y33efgEv,_ZThn4_N3ccc8CC9x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y33pqrEv,_ZThn4_N3ccc8CC9x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y33efgEv,_ZThn4_N3ccc8CC9x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y3E[];
Class_Descriptor cd__ZN3ccc8CC9x11y3E = {  "_ZN3ccc8CC9x11y3E", // class name
  bases__ZN3ccc8CC9x11y3E, 2,
  &(vtc__ZN3ccc8CC9x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y4  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC9x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y43efgEv
  ~CC9x11y4(); // tgen
  CC9x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y4E[];
extern void _ZN3ccc8CC9x11y43efgEv();
extern void _ZN3ccc8CC9x11y43pqrEv();
extern void _ZN3ccc8CC9x11y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y43pqrEv,_ZThn4_N3ccc8CC9x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y43efgEv,_ZThn4_N3ccc8CC9x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y43pqrEv,_ZThn4_N3ccc8CC9x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y43efgEv,_ZThn4_N3ccc8CC9x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y4E[];
Class_Descriptor cd__ZN3ccc8CC9x11y4E = {  "_ZN3ccc8CC9x11y4E", // class name
  bases__ZN3ccc8CC9x11y4E, 2,
  &(vtc__ZN3ccc8CC9x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y5  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC9x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y53abcEv
  ~CC9x11y5(); // tgen
  CC9x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y5E[];
extern void _ZN3ccc8CC9x11y53efgEv();
extern void _ZN3ccc8CC9x11y53pqrEv();
extern void _ZN3ccc8CC9x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y53pqrEv,_ZThn4_N3ccc8CC9x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y53efgEv,_ZThn4_N3ccc8CC9x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y53pqrEv,_ZThn4_N3ccc8CC9x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y53efgEv,_ZThn4_N3ccc8CC9x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y5E[];
Class_Descriptor cd__ZN3ccc8CC9x11y5E = {  "_ZN3ccc8CC9x11y5E", // class name
  bases__ZN3ccc8CC9x11y5E, 2,
  &(vtc__ZN3ccc8CC9x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y6  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y63efgEv
  ~CC9x11y6(); // tgen
  CC9x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y6E[];
extern void _ZN3ccc8CC9x11y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y63efgEv,_ZThn4_N3ccc8CC9x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y63efgEv,_ZThn4_N3ccc8CC9x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y6E[];
Class_Descriptor cd__ZN3ccc8CC9x11y6E = {  "_ZN3ccc8CC9x11y6E", // class name
  bases__ZN3ccc8CC9x11y6E, 2,
  &(vtc__ZN3ccc8CC9x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y7  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y73pqrEv
  ~CC9x11y7(); // tgen
  CC9x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x11y73pqrEv();
extern void _ZN3ccc8CC9x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y73pqrEv,_ZThn4_N3ccc8CC9x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y73pqrEv,_ZThn4_N3ccc8CC9x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y7E[];
Class_Descriptor cd__ZN3ccc8CC9x11y7E = {  "_ZN3ccc8CC9x11y7E", // class name
  bases__ZN3ccc8CC9x11y7E, 2,
  &(vtc__ZN3ccc8CC9x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y8  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y83abcEv
  ~CC9x11y8(); // tgen
  CC9x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y8E[];
extern void _ZN3ccc8CC9x11y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y83efgEv,_ZThn4_N3ccc8CC9x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y83efgEv,_ZThn4_N3ccc8CC9x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y8E[];
Class_Descriptor cd__ZN3ccc8CC9x11y8E = {  "_ZN3ccc8CC9x11y8E", // class name
  bases__ZN3ccc8CC9x11y8E, 2,
  &(vtc__ZN3ccc8CC9x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y9  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y93pqrEv
  ~CC9x11y9(); // tgen
  CC9x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y9E[];
extern void _ZN3ccc8CC9x11y93efgEv();
extern void _ZN3ccc8CC9x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y93pqrEv,_ZThn4_N3ccc8CC9x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y93efgEv,_ZThn4_N3ccc8CC9x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y93pqrEv,_ZThn4_N3ccc8CC9x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x11y93efgEv,_ZThn4_N3ccc8CC9x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y9E[];
Class_Descriptor cd__ZN3ccc8CC9x11y9E = {  "_ZN3ccc8CC9x11y9E", // class name
  bases__ZN3ccc8CC9x11y9E, 2,
  &(vtc__ZN3ccc8CC9x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y10  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x11y103abcEv
  ~CC9x11y10(); // tgen
  CC9x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x11y103pqrEv();
extern void _ZN3ccc9CC9x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y103pqrEv,_ZThn4_N3ccc9CC9x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x11y103pqrEv,_ZThn4_N3ccc9CC9x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y10E[];
Class_Descriptor cd__ZN3ccc9CC9x11y10E = {  "_ZN3ccc9CC9x11y10E", // class name
  bases__ZN3ccc9CC9x11y10E, 2,
  &(vtc__ZN3ccc9CC9x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y11  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x11y113efgEv
  ~CC9x11y11(); // tgen
  CC9x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y11E[];
extern void _ZN3ccc9CC9x11y113efgEv();
extern void _ZN3ccc9CC9x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y113pqrEv,_ZThn4_N3ccc9CC9x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y113efgEv,_ZThn4_N3ccc9CC9x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x11y113pqrEv,_ZThn4_N3ccc9CC9x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x11y113efgEv,_ZThn4_N3ccc9CC9x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y11E[];
Class_Descriptor cd__ZN3ccc9CC9x11y11E = {  "_ZN3ccc9CC9x11y11E", // class name
  bases__ZN3ccc9CC9x11y11E, 2,
  &(vtc__ZN3ccc9CC9x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y12  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC9x11y123abcEv
  ~CC9x11y12(); // tgen
  CC9x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y12E[];
Class_Descriptor cd__ZN3ccc9CC9x11y12E = {  "_ZN3ccc9CC9x11y12E", // class name
  bases__ZN3ccc9CC9x11y12E, 2,
  &(vtc__ZN3ccc9CC9x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y13  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC9x11y133efgEv
  ~CC9x11y13(); // tgen
  CC9x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y13E[];
extern void _ZN3ccc9CC9x11y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y133efgEv,_ZThn4_N3ccc9CC9x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x11y133efgEv,_ZThn4_N3ccc9CC9x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y13E[];
Class_Descriptor cd__ZN3ccc9CC9x11y13E = {  "_ZN3ccc9CC9x11y13E", // class name
  bases__ZN3ccc9CC9x11y13E, 2,
  &(vtc__ZN3ccc9CC9x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y14  : ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y143pqrEv
  ~CC9x11y14(); // tgen
  CC9x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y143pqrEv,_ZThn4_N3ccc9CC9x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x11y143pqrEv,_ZThn4_N3ccc9CC9x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y14E[];
Class_Descriptor cd__ZN3ccc9CC9x11y14E = {  "_ZN3ccc9CC9x11y14E", // class name
  bases__ZN3ccc9CC9x11y14E, 2,
  &(vtc__ZN3ccc9CC9x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x11y15  : ::ccc::AA9 , ::ccc::BB11 {
  ~CC9x11y15(); // tgen
  CC9x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y15E[];
Class_Descriptor cd__ZN3ccc9CC9x11y15E = {  "_ZN3ccc9CC9x11y15E", // class name
  bases__ZN3ccc9CC9x11y15E, 2,
  &(vtc__ZN3ccc9CC9x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y0  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y03pqrEv
  ~CC9x12y0(); // tgen
  CC9x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y0E[];
extern void _ZN3ccc8CC9x12y03efgEv();
extern void _ZN3ccc8CC9x12y03pqrEv();
extern void _ZN3ccc8CC9x12y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y03abcEv,_ZThn4_N3ccc8CC9x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y03abcEv,_ZThn4_N3ccc8CC9x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y0E[];
Class_Descriptor cd__ZN3ccc8CC9x12y0E = {  "_ZN3ccc8CC9x12y0E", // class name
  bases__ZN3ccc8CC9x12y0E, 2,
  &(vtc__ZN3ccc8CC9x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y1  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x12y13efgEv
  ~CC9x12y1(); // tgen
  CC9x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y1E[];
extern void _ZN3ccc8CC9x12y13efgEv();
extern void _ZN3ccc8CC9x12y13pqrEv();
extern void _ZN3ccc8CC9x12y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y13abcEv,_ZThn4_N3ccc8CC9x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y13abcEv,_ZThn4_N3ccc8CC9x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y1E[];
Class_Descriptor cd__ZN3ccc8CC9x12y1E = {  "_ZN3ccc8CC9x12y1E", // class name
  bases__ZN3ccc8CC9x12y1E, 2,
  &(vtc__ZN3ccc8CC9x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y2  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y23pqrEv
  ~CC9x12y2(); // tgen
  CC9x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y2E[];
extern void _ZN3ccc8CC9x12y23efgEv();
extern void _ZN3ccc8CC9x12y23pqrEv();
extern void _ZN3ccc8CC9x12y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y23abcEv,_ZThn4_N3ccc8CC9x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y23abcEv,_ZThn4_N3ccc8CC9x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y2E[];
Class_Descriptor cd__ZN3ccc8CC9x12y2E = {  "_ZN3ccc8CC9x12y2E", // class name
  bases__ZN3ccc8CC9x12y2E, 2,
  &(vtc__ZN3ccc8CC9x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y3  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x12y33abcEv
  ~CC9x12y3(); // tgen
  CC9x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y3E[];
extern void _ZN3ccc8CC9x12y33efgEv();
extern void _ZN3ccc8CC9x12y33pqrEv();
extern void _ZN3ccc8CC9x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y33abcEv,_ZThn4_N3ccc8CC9x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y33abcEv,_ZThn4_N3ccc8CC9x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y3E[];
Class_Descriptor cd__ZN3ccc8CC9x12y3E = {  "_ZN3ccc8CC9x12y3E", // class name
  bases__ZN3ccc8CC9x12y3E, 2,
  &(vtc__ZN3ccc8CC9x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y4  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC9x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y43efgEv
  ~CC9x12y4(); // tgen
  CC9x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y4E[];
extern void _ZN3ccc8CC9x12y43efgEv();
extern void _ZN3ccc8CC9x12y43pqrEv();
extern void _ZN3ccc8CC9x12y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y43abcEv,_ZThn4_N3ccc8CC9x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y43abcEv,_ZThn4_N3ccc8CC9x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y4E[];
Class_Descriptor cd__ZN3ccc8CC9x12y4E = {  "_ZN3ccc8CC9x12y4E", // class name
  bases__ZN3ccc8CC9x12y4E, 2,
  &(vtc__ZN3ccc8CC9x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y5  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC9x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y53abcEv
  ~CC9x12y5(); // tgen
  CC9x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y5E[];
extern void _ZN3ccc8CC9x12y53efgEv();
extern void _ZN3ccc8CC9x12y53pqrEv();
extern void _ZN3ccc8CC9x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y53abcEv,_ZThn4_N3ccc8CC9x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y53abcEv,_ZThn4_N3ccc8CC9x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y5E[];
Class_Descriptor cd__ZN3ccc8CC9x12y5E = {  "_ZN3ccc8CC9x12y5E", // class name
  bases__ZN3ccc8CC9x12y5E, 2,
  &(vtc__ZN3ccc8CC9x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y6  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y63efgEv
  ~CC9x12y6(); // tgen
  CC9x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y6E[];
extern void _ZN3ccc8CC9x12y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y63abcEv,_ZThn4_N3ccc8CC9x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y63abcEv,_ZThn4_N3ccc8CC9x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y6E[];
Class_Descriptor cd__ZN3ccc8CC9x12y6E = {  "_ZN3ccc8CC9x12y6E", // class name
  bases__ZN3ccc8CC9x12y6E, 2,
  &(vtc__ZN3ccc8CC9x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y7  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y73pqrEv
  ~CC9x12y7(); // tgen
  CC9x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x12y73pqrEv();
extern void _ZN3ccc8CC9x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y73abcEv,_ZThn4_N3ccc8CC9x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y73abcEv,_ZThn4_N3ccc8CC9x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y7E[];
Class_Descriptor cd__ZN3ccc8CC9x12y7E = {  "_ZN3ccc8CC9x12y7E", // class name
  bases__ZN3ccc8CC9x12y7E, 2,
  &(vtc__ZN3ccc8CC9x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y8  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y83abcEv
  ~CC9x12y8(); // tgen
  CC9x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y8E[];
extern void _ZN3ccc8CC9x12y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y83abcEv,_ZThn4_N3ccc8CC9x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x12y83abcEv,_ZThn4_N3ccc8CC9x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y8E[];
Class_Descriptor cd__ZN3ccc8CC9x12y8E = {  "_ZN3ccc8CC9x12y8E", // class name
  bases__ZN3ccc8CC9x12y8E, 2,
  &(vtc__ZN3ccc8CC9x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y9  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y93pqrEv
  ~CC9x12y9(); // tgen
  CC9x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y9E[];
extern void _ZN3ccc8CC9x12y93efgEv();
extern void _ZN3ccc8CC9x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y9E[];
Class_Descriptor cd__ZN3ccc8CC9x12y9E = {  "_ZN3ccc8CC9x12y9E", // class name
  bases__ZN3ccc8CC9x12y9E, 2,
  &(vtc__ZN3ccc8CC9x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y10  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x12y103abcEv
  ~CC9x12y10(); // tgen
  CC9x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x12y103pqrEv();
extern void _ZN3ccc9CC9x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y103abcEv,_ZThn4_N3ccc9CC9x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x12y103abcEv,_ZThn4_N3ccc9CC9x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y10E[];
Class_Descriptor cd__ZN3ccc9CC9x12y10E = {  "_ZN3ccc9CC9x12y10E", // class name
  bases__ZN3ccc9CC9x12y10E, 2,
  &(vtc__ZN3ccc9CC9x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y11  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x12y113efgEv
  ~CC9x12y11(); // tgen
  CC9x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y11E[];
extern void _ZN3ccc9CC9x12y113efgEv();
extern void _ZN3ccc9CC9x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y11E[];
Class_Descriptor cd__ZN3ccc9CC9x12y11E = {  "_ZN3ccc9CC9x12y11E", // class name
  bases__ZN3ccc9CC9x12y11E, 2,
  &(vtc__ZN3ccc9CC9x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y12  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC9x12y123abcEv
  ~CC9x12y12(); // tgen
  CC9x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y123abcEv,_ZThn4_N3ccc9CC9x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x12y123abcEv,_ZThn4_N3ccc9CC9x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y12E[];
Class_Descriptor cd__ZN3ccc9CC9x12y12E = {  "_ZN3ccc9CC9x12y12E", // class name
  bases__ZN3ccc9CC9x12y12E, 2,
  &(vtc__ZN3ccc9CC9x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y13  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC9x12y133efgEv
  ~CC9x12y13(); // tgen
  CC9x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y13E[];
extern void _ZN3ccc9CC9x12y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y13E[];
Class_Descriptor cd__ZN3ccc9CC9x12y13E = {  "_ZN3ccc9CC9x12y13E", // class name
  bases__ZN3ccc9CC9x12y13E, 2,
  &(vtc__ZN3ccc9CC9x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y14  : ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y143pqrEv
  ~CC9x12y14(); // tgen
  CC9x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y14E[];
Class_Descriptor cd__ZN3ccc9CC9x12y14E = {  "_ZN3ccc9CC9x12y14E", // class name
  bases__ZN3ccc9CC9x12y14E, 2,
  &(vtc__ZN3ccc9CC9x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x12y15  : ::ccc::AA9 , ::ccc::BB12 {
  ~CC9x12y15(); // tgen
  CC9x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y15E[];
Class_Descriptor cd__ZN3ccc9CC9x12y15E = {  "_ZN3ccc9CC9x12y15E", // class name
  bases__ZN3ccc9CC9x12y15E, 2,
  &(vtc__ZN3ccc9CC9x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y0  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y03pqrEv
  ~CC9x13y0(); // tgen
  CC9x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y0E[];
extern void _ZN3ccc8CC9x13y03efgEv();
extern void _ZN3ccc8CC9x13y03pqrEv();
extern void _ZN3ccc8CC9x13y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y03efgEv,_ZThn4_N3ccc8CC9x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y03efgEv,_ZThn4_N3ccc8CC9x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y0E[];
Class_Descriptor cd__ZN3ccc8CC9x13y0E = {  "_ZN3ccc8CC9x13y0E", // class name
  bases__ZN3ccc8CC9x13y0E, 2,
  &(vtc__ZN3ccc8CC9x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y1  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x13y13efgEv
  ~CC9x13y1(); // tgen
  CC9x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y1E[];
extern void _ZN3ccc8CC9x13y13efgEv();
extern void _ZN3ccc8CC9x13y13pqrEv();
extern void _ZN3ccc8CC9x13y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y13efgEv,_ZThn4_N3ccc8CC9x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y13efgEv,_ZThn4_N3ccc8CC9x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y1E[];
Class_Descriptor cd__ZN3ccc8CC9x13y1E = {  "_ZN3ccc8CC9x13y1E", // class name
  bases__ZN3ccc8CC9x13y1E, 2,
  &(vtc__ZN3ccc8CC9x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y2  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y23pqrEv
  ~CC9x13y2(); // tgen
  CC9x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y2E[];
extern void _ZN3ccc8CC9x13y23efgEv();
extern void _ZN3ccc8CC9x13y23pqrEv();
extern void _ZN3ccc8CC9x13y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y23efgEv,_ZThn4_N3ccc8CC9x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y23efgEv,_ZThn4_N3ccc8CC9x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y2E[];
Class_Descriptor cd__ZN3ccc8CC9x13y2E = {  "_ZN3ccc8CC9x13y2E", // class name
  bases__ZN3ccc8CC9x13y2E, 2,
  &(vtc__ZN3ccc8CC9x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y3  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x13y33abcEv
  ~CC9x13y3(); // tgen
  CC9x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y3E[];
extern void _ZN3ccc8CC9x13y33efgEv();
extern void _ZN3ccc8CC9x13y33pqrEv();
extern void _ZN3ccc8CC9x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y33efgEv,_ZThn4_N3ccc8CC9x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y33efgEv,_ZThn4_N3ccc8CC9x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y3E[];
Class_Descriptor cd__ZN3ccc8CC9x13y3E = {  "_ZN3ccc8CC9x13y3E", // class name
  bases__ZN3ccc8CC9x13y3E, 2,
  &(vtc__ZN3ccc8CC9x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y4  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC9x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y43efgEv
  ~CC9x13y4(); // tgen
  CC9x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y4E[];
extern void _ZN3ccc8CC9x13y43efgEv();
extern void _ZN3ccc8CC9x13y43pqrEv();
extern void _ZN3ccc8CC9x13y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y43efgEv,_ZThn4_N3ccc8CC9x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y43efgEv,_ZThn4_N3ccc8CC9x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y4E[];
Class_Descriptor cd__ZN3ccc8CC9x13y4E = {  "_ZN3ccc8CC9x13y4E", // class name
  bases__ZN3ccc8CC9x13y4E, 2,
  &(vtc__ZN3ccc8CC9x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y5  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC9x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y53abcEv
  ~CC9x13y5(); // tgen
  CC9x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y5E[];
extern void _ZN3ccc8CC9x13y53efgEv();
extern void _ZN3ccc8CC9x13y53pqrEv();
extern void _ZN3ccc8CC9x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y53efgEv,_ZThn4_N3ccc8CC9x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y53efgEv,_ZThn4_N3ccc8CC9x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y5E[];
Class_Descriptor cd__ZN3ccc8CC9x13y5E = {  "_ZN3ccc8CC9x13y5E", // class name
  bases__ZN3ccc8CC9x13y5E, 2,
  &(vtc__ZN3ccc8CC9x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y6  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y63efgEv
  ~CC9x13y6(); // tgen
  CC9x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y6E[];
extern void _ZN3ccc8CC9x13y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y63efgEv,_ZThn4_N3ccc8CC9x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y63efgEv,_ZThn4_N3ccc8CC9x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y6E[];
Class_Descriptor cd__ZN3ccc8CC9x13y6E = {  "_ZN3ccc8CC9x13y6E", // class name
  bases__ZN3ccc8CC9x13y6E, 2,
  &(vtc__ZN3ccc8CC9x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y7  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y73pqrEv
  ~CC9x13y7(); // tgen
  CC9x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x13y73pqrEv();
extern void _ZN3ccc8CC9x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y7E[];
Class_Descriptor cd__ZN3ccc8CC9x13y7E = {  "_ZN3ccc8CC9x13y7E", // class name
  bases__ZN3ccc8CC9x13y7E, 2,
  &(vtc__ZN3ccc8CC9x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y8  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y83abcEv
  ~CC9x13y8(); // tgen
  CC9x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y8E[];
extern void _ZN3ccc8CC9x13y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y83efgEv,_ZThn4_N3ccc8CC9x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y83efgEv,_ZThn4_N3ccc8CC9x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y8E[];
Class_Descriptor cd__ZN3ccc8CC9x13y8E = {  "_ZN3ccc8CC9x13y8E", // class name
  bases__ZN3ccc8CC9x13y8E, 2,
  &(vtc__ZN3ccc8CC9x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y9  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y93pqrEv
  ~CC9x13y9(); // tgen
  CC9x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y9E[];
extern void _ZN3ccc8CC9x13y93efgEv();
extern void _ZN3ccc8CC9x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y93efgEv,_ZThn4_N3ccc8CC9x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x13y93efgEv,_ZThn4_N3ccc8CC9x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y9E[];
Class_Descriptor cd__ZN3ccc8CC9x13y9E = {  "_ZN3ccc8CC9x13y9E", // class name
  bases__ZN3ccc8CC9x13y9E, 2,
  &(vtc__ZN3ccc8CC9x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y10  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x13y103abcEv
  ~CC9x13y10(); // tgen
  CC9x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x13y103pqrEv();
extern void _ZN3ccc9CC9x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y10E[];
Class_Descriptor cd__ZN3ccc9CC9x13y10E = {  "_ZN3ccc9CC9x13y10E", // class name
  bases__ZN3ccc9CC9x13y10E, 2,
  &(vtc__ZN3ccc9CC9x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y11  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x13y113efgEv
  ~CC9x13y11(); // tgen
  CC9x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y11E[];
extern void _ZN3ccc9CC9x13y113efgEv();
extern void _ZN3ccc9CC9x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y113efgEv,_ZThn4_N3ccc9CC9x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x13y113efgEv,_ZThn4_N3ccc9CC9x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y11E[];
Class_Descriptor cd__ZN3ccc9CC9x13y11E = {  "_ZN3ccc9CC9x13y11E", // class name
  bases__ZN3ccc9CC9x13y11E, 2,
  &(vtc__ZN3ccc9CC9x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y12  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC9x13y123abcEv
  ~CC9x13y12(); // tgen
  CC9x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y12E[];
Class_Descriptor cd__ZN3ccc9CC9x13y12E = {  "_ZN3ccc9CC9x13y12E", // class name
  bases__ZN3ccc9CC9x13y12E, 2,
  &(vtc__ZN3ccc9CC9x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y13  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC9x13y133efgEv
  ~CC9x13y13(); // tgen
  CC9x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y13E[];
extern void _ZN3ccc9CC9x13y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y133efgEv,_ZThn4_N3ccc9CC9x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x13y133efgEv,_ZThn4_N3ccc9CC9x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y13E[];
Class_Descriptor cd__ZN3ccc9CC9x13y13E = {  "_ZN3ccc9CC9x13y13E", // class name
  bases__ZN3ccc9CC9x13y13E, 2,
  &(vtc__ZN3ccc9CC9x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y14  : ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y143pqrEv
  ~CC9x13y14(); // tgen
  CC9x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y14E[];
Class_Descriptor cd__ZN3ccc9CC9x13y14E = {  "_ZN3ccc9CC9x13y14E", // class name
  bases__ZN3ccc9CC9x13y14E, 2,
  &(vtc__ZN3ccc9CC9x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x13y15  : ::ccc::AA9 , ::ccc::BB13 {
  ~CC9x13y15(); // tgen
  CC9x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y15E[];
Class_Descriptor cd__ZN3ccc9CC9x13y15E = {  "_ZN3ccc9CC9x13y15E", // class name
  bases__ZN3ccc9CC9x13y15E, 2,
  &(vtc__ZN3ccc9CC9x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y0  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y03pqrEv
  ~CC9x14y0(); // tgen
  CC9x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y0E[];
extern void _ZN3ccc8CC9x14y03efgEv();
extern void _ZN3ccc8CC9x14y03pqrEv();
extern void _ZN3ccc8CC9x14y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y03pqrEv,_ZThn4_N3ccc8CC9x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y03pqrEv,_ZThn4_N3ccc8CC9x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y0E[];
Class_Descriptor cd__ZN3ccc8CC9x14y0E = {  "_ZN3ccc8CC9x14y0E", // class name
  bases__ZN3ccc8CC9x14y0E, 2,
  &(vtc__ZN3ccc8CC9x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y1  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x14y13efgEv
  ~CC9x14y1(); // tgen
  CC9x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y1E[];
extern void _ZN3ccc8CC9x14y13efgEv();
extern void _ZN3ccc8CC9x14y13pqrEv();
extern void _ZN3ccc8CC9x14y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y13pqrEv,_ZThn4_N3ccc8CC9x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y13pqrEv,_ZThn4_N3ccc8CC9x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y1E[];
Class_Descriptor cd__ZN3ccc8CC9x14y1E = {  "_ZN3ccc8CC9x14y1E", // class name
  bases__ZN3ccc8CC9x14y1E, 2,
  &(vtc__ZN3ccc8CC9x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y2  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y23pqrEv
  ~CC9x14y2(); // tgen
  CC9x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y2E[];
extern void _ZN3ccc8CC9x14y23efgEv();
extern void _ZN3ccc8CC9x14y23pqrEv();
extern void _ZN3ccc8CC9x14y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y23pqrEv,_ZThn4_N3ccc8CC9x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y23pqrEv,_ZThn4_N3ccc8CC9x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y2E[];
Class_Descriptor cd__ZN3ccc8CC9x14y2E = {  "_ZN3ccc8CC9x14y2E", // class name
  bases__ZN3ccc8CC9x14y2E, 2,
  &(vtc__ZN3ccc8CC9x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y3  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x14y33abcEv
  ~CC9x14y3(); // tgen
  CC9x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y3E[];
extern void _ZN3ccc8CC9x14y33efgEv();
extern void _ZN3ccc8CC9x14y33pqrEv();
extern void _ZN3ccc8CC9x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y33pqrEv,_ZThn4_N3ccc8CC9x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y33pqrEv,_ZThn4_N3ccc8CC9x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y3E[];
Class_Descriptor cd__ZN3ccc8CC9x14y3E = {  "_ZN3ccc8CC9x14y3E", // class name
  bases__ZN3ccc8CC9x14y3E, 2,
  &(vtc__ZN3ccc8CC9x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y4  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC9x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y43efgEv
  ~CC9x14y4(); // tgen
  CC9x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y4E[];
extern void _ZN3ccc8CC9x14y43efgEv();
extern void _ZN3ccc8CC9x14y43pqrEv();
extern void _ZN3ccc8CC9x14y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y43pqrEv,_ZThn4_N3ccc8CC9x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y43pqrEv,_ZThn4_N3ccc8CC9x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y4E[];
Class_Descriptor cd__ZN3ccc8CC9x14y4E = {  "_ZN3ccc8CC9x14y4E", // class name
  bases__ZN3ccc8CC9x14y4E, 2,
  &(vtc__ZN3ccc8CC9x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y5  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC9x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y53abcEv
  ~CC9x14y5(); // tgen
  CC9x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y5E[];
extern void _ZN3ccc8CC9x14y53efgEv();
extern void _ZN3ccc8CC9x14y53pqrEv();
extern void _ZN3ccc8CC9x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y53pqrEv,_ZThn4_N3ccc8CC9x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y53pqrEv,_ZThn4_N3ccc8CC9x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y5E[];
Class_Descriptor cd__ZN3ccc8CC9x14y5E = {  "_ZN3ccc8CC9x14y5E", // class name
  bases__ZN3ccc8CC9x14y5E, 2,
  &(vtc__ZN3ccc8CC9x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y6  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y63efgEv
  ~CC9x14y6(); // tgen
  CC9x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y6E[];
extern void _ZN3ccc8CC9x14y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y6E[];
Class_Descriptor cd__ZN3ccc8CC9x14y6E = {  "_ZN3ccc8CC9x14y6E", // class name
  bases__ZN3ccc8CC9x14y6E, 2,
  &(vtc__ZN3ccc8CC9x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y7  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y73pqrEv
  ~CC9x14y7(); // tgen
  CC9x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x14y73pqrEv();
extern void _ZN3ccc8CC9x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y73pqrEv,_ZThn4_N3ccc8CC9x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y73pqrEv,_ZThn4_N3ccc8CC9x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y7E[];
Class_Descriptor cd__ZN3ccc8CC9x14y7E = {  "_ZN3ccc8CC9x14y7E", // class name
  bases__ZN3ccc8CC9x14y7E, 2,
  &(vtc__ZN3ccc8CC9x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y8  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y83abcEv
  ~CC9x14y8(); // tgen
  CC9x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y8E[];
extern void _ZN3ccc8CC9x14y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y8E[];
Class_Descriptor cd__ZN3ccc8CC9x14y8E = {  "_ZN3ccc8CC9x14y8E", // class name
  bases__ZN3ccc8CC9x14y8E, 2,
  &(vtc__ZN3ccc8CC9x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y9  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y93pqrEv
  ~CC9x14y9(); // tgen
  CC9x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC9x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y9E[];
extern void _ZN3ccc8CC9x14y93efgEv();
extern void _ZN3ccc8CC9x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y93pqrEv,_ZThn4_N3ccc8CC9x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC9x14y93pqrEv,_ZThn4_N3ccc8CC9x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y9E[];
Class_Descriptor cd__ZN3ccc8CC9x14y9E = {  "_ZN3ccc8CC9x14y9E", // class name
  bases__ZN3ccc8CC9x14y9E, 2,
  &(vtc__ZN3ccc8CC9x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y10  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x14y103abcEv
  ~CC9x14y10(); // tgen
  CC9x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x14y103pqrEv();
extern void _ZN3ccc9CC9x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y103pqrEv,_ZThn4_N3ccc9CC9x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x14y103pqrEv,_ZThn4_N3ccc9CC9x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y10E[];
Class_Descriptor cd__ZN3ccc9CC9x14y10E = {  "_ZN3ccc9CC9x14y10E", // class name
  bases__ZN3ccc9CC9x14y10E, 2,
  &(vtc__ZN3ccc9CC9x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y11  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x14y113efgEv
  ~CC9x14y11(); // tgen
  CC9x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y11E[];
extern void _ZN3ccc9CC9x14y113efgEv();
extern void _ZN3ccc9CC9x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y113pqrEv,_ZThn4_N3ccc9CC9x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x14y113pqrEv,_ZThn4_N3ccc9CC9x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y11E[];
Class_Descriptor cd__ZN3ccc9CC9x14y11E = {  "_ZN3ccc9CC9x14y11E", // class name
  bases__ZN3ccc9CC9x14y11E, 2,
  &(vtc__ZN3ccc9CC9x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y12  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC9x14y123abcEv
  ~CC9x14y12(); // tgen
  CC9x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y12E[];
Class_Descriptor cd__ZN3ccc9CC9x14y12E = {  "_ZN3ccc9CC9x14y12E", // class name
  bases__ZN3ccc9CC9x14y12E, 2,
  &(vtc__ZN3ccc9CC9x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y13  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC9x14y133efgEv
  ~CC9x14y13(); // tgen
  CC9x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y13E[];
extern void _ZN3ccc9CC9x14y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y13E[];
Class_Descriptor cd__ZN3ccc9CC9x14y13E = {  "_ZN3ccc9CC9x14y13E", // class name
  bases__ZN3ccc9CC9x14y13E, 2,
  &(vtc__ZN3ccc9CC9x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y14  : ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y143pqrEv
  ~CC9x14y14(); // tgen
  CC9x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y143pqrEv,_ZThn4_N3ccc9CC9x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC9x14y143pqrEv,_ZThn4_N3ccc9CC9x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y14E[];
Class_Descriptor cd__ZN3ccc9CC9x14y14E = {  "_ZN3ccc9CC9x14y14E", // class name
  bases__ZN3ccc9CC9x14y14E, 2,
  &(vtc__ZN3ccc9CC9x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x14y15  : ::ccc::AA9 , ::ccc::BB14 {
  ~CC9x14y15(); // tgen
  CC9x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC9x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y15E[];
Class_Descriptor cd__ZN3ccc9CC9x14y15E = {  "_ZN3ccc9CC9x14y15E", // class name
  bases__ZN3ccc9CC9x14y15E, 2,
  &(vtc__ZN3ccc9CC9x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y0  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y03pqrEv
  ~CC9x15y0(); // tgen
  CC9x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y0E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y0E[];
Class_Descriptor cd__ZN3ccc8CC9x15y0E = {  "_ZN3ccc8CC9x15y0E", // class name
  bases__ZN3ccc8CC9x15y0E, 2,
  &(vtc__ZN3ccc8CC9x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y1  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x15y13efgEv
  ~CC9x15y1(); // tgen
  CC9x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y1E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y1E[];
Class_Descriptor cd__ZN3ccc8CC9x15y1E = {  "_ZN3ccc8CC9x15y1E", // class name
  bases__ZN3ccc8CC9x15y1E, 2,
  &(vtc__ZN3ccc8CC9x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y2  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y23pqrEv
  ~CC9x15y2(); // tgen
  CC9x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y2E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y2E[];
Class_Descriptor cd__ZN3ccc8CC9x15y2E = {  "_ZN3ccc8CC9x15y2E", // class name
  bases__ZN3ccc8CC9x15y2E, 2,
  &(vtc__ZN3ccc8CC9x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y3  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x15y33abcEv
  ~CC9x15y3(); // tgen
  CC9x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y3E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y3E[];
Class_Descriptor cd__ZN3ccc8CC9x15y3E = {  "_ZN3ccc8CC9x15y3E", // class name
  bases__ZN3ccc8CC9x15y3E, 2,
  &(vtc__ZN3ccc8CC9x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y4  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC9x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y43efgEv
  ~CC9x15y4(); // tgen
  CC9x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y4E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y4E[];
Class_Descriptor cd__ZN3ccc8CC9x15y4E = {  "_ZN3ccc8CC9x15y4E", // class name
  bases__ZN3ccc8CC9x15y4E, 2,
  &(vtc__ZN3ccc8CC9x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y5  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC9x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y53abcEv
  ~CC9x15y5(); // tgen
  CC9x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y5E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y5E[];
Class_Descriptor cd__ZN3ccc8CC9x15y5E = {  "_ZN3ccc8CC9x15y5E", // class name
  bases__ZN3ccc8CC9x15y5E, 2,
  &(vtc__ZN3ccc8CC9x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y6  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y63efgEv
  ~CC9x15y6(); // tgen
  CC9x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y6E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y6E[];
Class_Descriptor cd__ZN3ccc8CC9x15y6E = {  "_ZN3ccc8CC9x15y6E", // class name
  bases__ZN3ccc8CC9x15y6E, 2,
  &(vtc__ZN3ccc8CC9x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y7  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y73pqrEv
  ~CC9x15y7(); // tgen
  CC9x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y7E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y7E[];
Class_Descriptor cd__ZN3ccc8CC9x15y7E = {  "_ZN3ccc8CC9x15y7E", // class name
  bases__ZN3ccc8CC9x15y7E, 2,
  &(vtc__ZN3ccc8CC9x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y8  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y83abcEv
  ~CC9x15y8(); // tgen
  CC9x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y8E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y8E[];
Class_Descriptor cd__ZN3ccc8CC9x15y8E = {  "_ZN3ccc8CC9x15y8E", // class name
  bases__ZN3ccc8CC9x15y8E, 2,
  &(vtc__ZN3ccc8CC9x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y9  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y93pqrEv
  ~CC9x15y9(); // tgen
  CC9x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y9E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y9E[];
Class_Descriptor cd__ZN3ccc8CC9x15y9E = {  "_ZN3ccc8CC9x15y9E", // class name
  bases__ZN3ccc8CC9x15y9E, 2,
  &(vtc__ZN3ccc8CC9x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y10  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x15y103abcEv
  ~CC9x15y10(); // tgen
  CC9x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y10E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y10E[];
Class_Descriptor cd__ZN3ccc9CC9x15y10E = {  "_ZN3ccc9CC9x15y10E", // class name
  bases__ZN3ccc9CC9x15y10E, 2,
  &(vtc__ZN3ccc9CC9x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y11  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x15y113efgEv
  ~CC9x15y11(); // tgen
  CC9x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y11E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y11E[];
Class_Descriptor cd__ZN3ccc9CC9x15y11E = {  "_ZN3ccc9CC9x15y11E", // class name
  bases__ZN3ccc9CC9x15y11E, 2,
  &(vtc__ZN3ccc9CC9x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y12  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC9x15y123abcEv
  ~CC9x15y12(); // tgen
  CC9x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y12E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y12E[];
Class_Descriptor cd__ZN3ccc9CC9x15y12E = {  "_ZN3ccc9CC9x15y12E", // class name
  bases__ZN3ccc9CC9x15y12E, 2,
  &(vtc__ZN3ccc9CC9x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y13  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC9x15y133efgEv
  ~CC9x15y13(); // tgen
  CC9x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y13E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y13E[];
Class_Descriptor cd__ZN3ccc9CC9x15y13E = {  "_ZN3ccc9CC9x15y13E", // class name
  bases__ZN3ccc9CC9x15y13E, 2,
  &(vtc__ZN3ccc9CC9x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y14  : ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y143pqrEv
  ~CC9x15y14(); // tgen
  CC9x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y14E) C1{ BC2{ 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
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y14E[];
Class_Descriptor cd__ZN3ccc9CC9x15y14E = {  "_ZN3ccc9CC9x15y14E", // class name
  bases__ZN3ccc9CC9x15y14E, 2,
  &(vtc__ZN3ccc9CC9x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y15  : ::ccc::AA9 , ::ccc::BB15 {
  ~CC9x15y15(); // tgen
  CC9x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y15E) C1{ BC2{ 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
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_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,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y15E[];
Class_Descriptor cd__ZN3ccc9CC9x15y15E = {  "_ZN3ccc9CC9x15y15E", // class name
  bases__ZN3ccc9CC9x15y15E, 2,
  &(vtc__ZN3ccc9CC9x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y0  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y03pqrEv
  ~CC10x0y0(); // tgen
  CC10x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y0E[];
extern void _ZN3ccc8CC10x0y03pqrEv();
extern void _ZN3ccc8CC10x0y03abcEv();
extern void _ZN3ccc8CC10x0y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y03abcEv,_ZThn4_N3ccc8CC10x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y03efgEv,_ZThn4_N3ccc8CC10x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y03pqrEv,_ZThn4_N3ccc8CC10x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y03abcEv,_ZThn4_N3ccc8CC10x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y03efgEv,_ZThn4_N3ccc8CC10x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y03pqrEv,_ZThn4_N3ccc8CC10x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y0E[];
Class_Descriptor cd__ZN3ccc8CC10x0y0E = {  "_ZN3ccc8CC10x0y0E", // class name
  bases__ZN3ccc8CC10x0y0E, 2,
  &(vtc__ZN3ccc8CC10x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y1  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x0y13efgEv
  ~CC10x0y1(); // tgen
  CC10x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y1E[];
extern void _ZN3ccc8CC10x0y13pqrEv();
extern void _ZN3ccc8CC10x0y13abcEv();
extern void _ZN3ccc8CC10x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y13abcEv,_ZThn4_N3ccc8CC10x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y13efgEv,_ZThn4_N3ccc8CC10x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y13pqrEv,_ZThn4_N3ccc8CC10x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y13abcEv,_ZThn4_N3ccc8CC10x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y13efgEv,_ZThn4_N3ccc8CC10x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y13pqrEv,_ZThn4_N3ccc8CC10x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y1E[];
Class_Descriptor cd__ZN3ccc8CC10x0y1E = {  "_ZN3ccc8CC10x0y1E", // class name
  bases__ZN3ccc8CC10x0y1E, 2,
  &(vtc__ZN3ccc8CC10x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y2  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y23pqrEv
  ~CC10x0y2(); // tgen
  CC10x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y2E[];
extern void _ZN3ccc8CC10x0y23pqrEv();
extern void _ZN3ccc8CC10x0y23abcEv();
extern void _ZN3ccc8CC10x0y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y23abcEv,_ZThn4_N3ccc8CC10x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y23efgEv,_ZThn4_N3ccc8CC10x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y23pqrEv,_ZThn4_N3ccc8CC10x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y23abcEv,_ZThn4_N3ccc8CC10x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y23efgEv,_ZThn4_N3ccc8CC10x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y23pqrEv,_ZThn4_N3ccc8CC10x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y2E[];
Class_Descriptor cd__ZN3ccc8CC10x0y2E = {  "_ZN3ccc8CC10x0y2E", // class name
  bases__ZN3ccc8CC10x0y2E, 2,
  &(vtc__ZN3ccc8CC10x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y3  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x0y33abcEv
  ~CC10x0y3(); // tgen
  CC10x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y3E[];
extern void _ZN3ccc8CC10x0y33pqrEv();
extern void _ZN3ccc8CC10x0y33abcEv();
extern void _ZN3ccc8CC10x0y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y33abcEv,_ZThn4_N3ccc8CC10x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y33efgEv,_ZThn4_N3ccc8CC10x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y33pqrEv,_ZThn4_N3ccc8CC10x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y33abcEv,_ZThn4_N3ccc8CC10x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y33efgEv,_ZThn4_N3ccc8CC10x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y33pqrEv,_ZThn4_N3ccc8CC10x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y3E[];
Class_Descriptor cd__ZN3ccc8CC10x0y3E = {  "_ZN3ccc8CC10x0y3E", // class name
  bases__ZN3ccc8CC10x0y3E, 2,
  &(vtc__ZN3ccc8CC10x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y4  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC10x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y43efgEv
  ~CC10x0y4(); // tgen
  CC10x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y4E[];
extern void _ZN3ccc8CC10x0y43pqrEv();
extern void _ZN3ccc8CC10x0y43abcEv();
extern void _ZN3ccc8CC10x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y43abcEv,_ZThn4_N3ccc8CC10x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y43efgEv,_ZThn4_N3ccc8CC10x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y43pqrEv,_ZThn4_N3ccc8CC10x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y43abcEv,_ZThn4_N3ccc8CC10x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y43efgEv,_ZThn4_N3ccc8CC10x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y43pqrEv,_ZThn4_N3ccc8CC10x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y4E[];
Class_Descriptor cd__ZN3ccc8CC10x0y4E = {  "_ZN3ccc8CC10x0y4E", // class name
  bases__ZN3ccc8CC10x0y4E, 2,
  &(vtc__ZN3ccc8CC10x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y5  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC10x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y53abcEv
  ~CC10x0y5(); // tgen
  CC10x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y5E[];
extern void _ZN3ccc8CC10x0y53pqrEv();
extern void _ZN3ccc8CC10x0y53abcEv();
extern void _ZN3ccc8CC10x0y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y53abcEv,_ZThn4_N3ccc8CC10x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y53efgEv,_ZThn4_N3ccc8CC10x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y53pqrEv,_ZThn4_N3ccc8CC10x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y53abcEv,_ZThn4_N3ccc8CC10x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y53efgEv,_ZThn4_N3ccc8CC10x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y53pqrEv,_ZThn4_N3ccc8CC10x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y5E[];
Class_Descriptor cd__ZN3ccc8CC10x0y5E = {  "_ZN3ccc8CC10x0y5E", // class name
  bases__ZN3ccc8CC10x0y5E, 2,
  &(vtc__ZN3ccc8CC10x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y6  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y63efgEv
  ~CC10x0y6(); // tgen
  CC10x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x0y63abcEv();
extern void _ZN3ccc8CC10x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y63abcEv,_ZThn4_N3ccc8CC10x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y63efgEv,_ZThn4_N3ccc8CC10x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y63abcEv,_ZThn4_N3ccc8CC10x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y63efgEv,_ZThn4_N3ccc8CC10x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y6E[];
Class_Descriptor cd__ZN3ccc8CC10x0y6E = {  "_ZN3ccc8CC10x0y6E", // class name
  bases__ZN3ccc8CC10x0y6E, 2,
  &(vtc__ZN3ccc8CC10x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y7  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y73pqrEv
  ~CC10x0y7(); // tgen
  CC10x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y7E[];
extern void _ZN3ccc8CC10x0y73pqrEv();
extern void _ZN3ccc8CC10x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y73abcEv,_ZThn4_N3ccc8CC10x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y73pqrEv,_ZThn4_N3ccc8CC10x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y73abcEv,_ZThn4_N3ccc8CC10x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y73pqrEv,_ZThn4_N3ccc8CC10x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y7E[];
Class_Descriptor cd__ZN3ccc8CC10x0y7E = {  "_ZN3ccc8CC10x0y7E", // class name
  bases__ZN3ccc8CC10x0y7E, 2,
  &(vtc__ZN3ccc8CC10x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y8  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y83abcEv
  ~CC10x0y8(); // tgen
  CC10x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x0y83abcEv();
extern void _ZN3ccc8CC10x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y83abcEv,_ZThn4_N3ccc8CC10x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y83efgEv,_ZThn4_N3ccc8CC10x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y83abcEv,_ZThn4_N3ccc8CC10x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y83efgEv,_ZThn4_N3ccc8CC10x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y8E[];
Class_Descriptor cd__ZN3ccc8CC10x0y8E = {  "_ZN3ccc8CC10x0y8E", // class name
  bases__ZN3ccc8CC10x0y8E, 2,
  &(vtc__ZN3ccc8CC10x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y9  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y93pqrEv
  ~CC10x0y9(); // tgen
  CC10x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y9E[];
extern void _ZN3ccc8CC10x0y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y93efgEv,_ZThn4_N3ccc8CC10x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y93pqrEv,_ZThn4_N3ccc8CC10x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y93efgEv,_ZThn4_N3ccc8CC10x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x0y93pqrEv,_ZThn4_N3ccc8CC10x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y9E[];
Class_Descriptor cd__ZN3ccc8CC10x0y9E = {  "_ZN3ccc8CC10x0y9E", // class name
  bases__ZN3ccc8CC10x0y9E, 2,
  &(vtc__ZN3ccc8CC10x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y10  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x0y103abcEv
  ~CC10x0y10(); // tgen
  CC10x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y10E[];
extern void _ZN3ccc9CC10x0y103pqrEv();
extern void _ZN3ccc9CC10x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y103abcEv,_ZThn4_N3ccc9CC10x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y103pqrEv,_ZThn4_N3ccc9CC10x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y103abcEv,_ZThn4_N3ccc9CC10x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y103pqrEv,_ZThn4_N3ccc9CC10x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y10E[];
Class_Descriptor cd__ZN3ccc9CC10x0y10E = {  "_ZN3ccc9CC10x0y10E", // class name
  bases__ZN3ccc9CC10x0y10E, 2,
  &(vtc__ZN3ccc9CC10x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y11  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x0y113efgEv
  ~CC10x0y11(); // tgen
  CC10x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y11E[];
extern void _ZN3ccc9CC10x0y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y113efgEv,_ZThn4_N3ccc9CC10x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y113pqrEv,_ZThn4_N3ccc9CC10x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y113efgEv,_ZThn4_N3ccc9CC10x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y113pqrEv,_ZThn4_N3ccc9CC10x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y11E[];
Class_Descriptor cd__ZN3ccc9CC10x0y11E = {  "_ZN3ccc9CC10x0y11E", // class name
  bases__ZN3ccc9CC10x0y11E, 2,
  &(vtc__ZN3ccc9CC10x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y12  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC10x0y123abcEv
  ~CC10x0y12(); // tgen
  CC10x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y123abcEv,_ZThn4_N3ccc9CC10x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y123abcEv,_ZThn4_N3ccc9CC10x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y12E[];
Class_Descriptor cd__ZN3ccc9CC10x0y12E = {  "_ZN3ccc9CC10x0y12E", // class name
  bases__ZN3ccc9CC10x0y12E, 2,
  &(vtc__ZN3ccc9CC10x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y13  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC10x0y133efgEv
  ~CC10x0y13(); // tgen
  CC10x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y133efgEv,_ZThn4_N3ccc9CC10x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y133efgEv,_ZThn4_N3ccc9CC10x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y13E[];
Class_Descriptor cd__ZN3ccc9CC10x0y13E = {  "_ZN3ccc9CC10x0y13E", // class name
  bases__ZN3ccc9CC10x0y13E, 2,
  &(vtc__ZN3ccc9CC10x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y14  : ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y143pqrEv
  ~CC10x0y14(); // tgen
  CC10x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y14E[];
extern void _ZN3ccc9CC10x0y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y143pqrEv,_ZThn4_N3ccc9CC10x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x0y143pqrEv,_ZThn4_N3ccc9CC10x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y14E[];
Class_Descriptor cd__ZN3ccc9CC10x0y14E = {  "_ZN3ccc9CC10x0y14E", // class name
  bases__ZN3ccc9CC10x0y14E, 2,
  &(vtc__ZN3ccc9CC10x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y15  : ::ccc::AA10 , ::ccc::BB0 {
  ~CC10x0y15(); // tgen
  CC10x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y15E[];
Class_Descriptor cd__ZN3ccc9CC10x0y15E = {  "_ZN3ccc9CC10x0y15E", // class name
  bases__ZN3ccc9CC10x0y15E, 2,
  &(vtc__ZN3ccc9CC10x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y0  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y03pqrEv
  ~CC10x1y0(); // tgen
  CC10x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y0E[];
extern void _ZN3ccc8CC10x1y03pqrEv();
extern void _ZN3ccc8CC10x1y03abcEv();
extern void _ZN3ccc8CC10x1y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y03abcEv,_ZThn4_N3ccc8CC10x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y03pqrEv,_ZThn4_N3ccc8CC10x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y03efgEv,_ZThn4_N3ccc8CC10x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y03abcEv,_ZThn4_N3ccc8CC10x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y03pqrEv,_ZThn4_N3ccc8CC10x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y03efgEv,_ZThn4_N3ccc8CC10x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y0E[];
Class_Descriptor cd__ZN3ccc8CC10x1y0E = {  "_ZN3ccc8CC10x1y0E", // class name
  bases__ZN3ccc8CC10x1y0E, 2,
  &(vtc__ZN3ccc8CC10x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y1  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x1y13efgEv
  ~CC10x1y1(); // tgen
  CC10x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y1E[];
extern void _ZN3ccc8CC10x1y13pqrEv();
extern void _ZN3ccc8CC10x1y13abcEv();
extern void _ZN3ccc8CC10x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y13abcEv,_ZThn4_N3ccc8CC10x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y13pqrEv,_ZThn4_N3ccc8CC10x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y13efgEv,_ZThn4_N3ccc8CC10x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y13abcEv,_ZThn4_N3ccc8CC10x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y13pqrEv,_ZThn4_N3ccc8CC10x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y13efgEv,_ZThn4_N3ccc8CC10x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y1E[];
Class_Descriptor cd__ZN3ccc8CC10x1y1E = {  "_ZN3ccc8CC10x1y1E", // class name
  bases__ZN3ccc8CC10x1y1E, 2,
  &(vtc__ZN3ccc8CC10x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y2  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y23pqrEv
  ~CC10x1y2(); // tgen
  CC10x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y2E[];
extern void _ZN3ccc8CC10x1y23pqrEv();
extern void _ZN3ccc8CC10x1y23abcEv();
extern void _ZN3ccc8CC10x1y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y23abcEv,_ZThn4_N3ccc8CC10x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y23pqrEv,_ZThn4_N3ccc8CC10x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y23efgEv,_ZThn4_N3ccc8CC10x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y23abcEv,_ZThn4_N3ccc8CC10x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y23pqrEv,_ZThn4_N3ccc8CC10x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y23efgEv,_ZThn4_N3ccc8CC10x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y2E[];
Class_Descriptor cd__ZN3ccc8CC10x1y2E = {  "_ZN3ccc8CC10x1y2E", // class name
  bases__ZN3ccc8CC10x1y2E, 2,
  &(vtc__ZN3ccc8CC10x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y3  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x1y33abcEv
  ~CC10x1y3(); // tgen
  CC10x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y3E[];
extern void _ZN3ccc8CC10x1y33pqrEv();
extern void _ZN3ccc8CC10x1y33abcEv();
extern void _ZN3ccc8CC10x1y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y33abcEv,_ZThn4_N3ccc8CC10x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y33pqrEv,_ZThn4_N3ccc8CC10x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y33efgEv,_ZThn4_N3ccc8CC10x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y33abcEv,_ZThn4_N3ccc8CC10x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y33pqrEv,_ZThn4_N3ccc8CC10x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y33efgEv,_ZThn4_N3ccc8CC10x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y3E[];
Class_Descriptor cd__ZN3ccc8CC10x1y3E = {  "_ZN3ccc8CC10x1y3E", // class name
  bases__ZN3ccc8CC10x1y3E, 2,
  &(vtc__ZN3ccc8CC10x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y4  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC10x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y43efgEv
  ~CC10x1y4(); // tgen
  CC10x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y4E[];
extern void _ZN3ccc8CC10x1y43pqrEv();
extern void _ZN3ccc8CC10x1y43abcEv();
extern void _ZN3ccc8CC10x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y43abcEv,_ZThn4_N3ccc8CC10x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y43pqrEv,_ZThn4_N3ccc8CC10x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y43efgEv,_ZThn4_N3ccc8CC10x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y43abcEv,_ZThn4_N3ccc8CC10x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y43pqrEv,_ZThn4_N3ccc8CC10x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y43efgEv,_ZThn4_N3ccc8CC10x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y4E[];
Class_Descriptor cd__ZN3ccc8CC10x1y4E = {  "_ZN3ccc8CC10x1y4E", // class name
  bases__ZN3ccc8CC10x1y4E, 2,
  &(vtc__ZN3ccc8CC10x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y5  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC10x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y53abcEv
  ~CC10x1y5(); // tgen
  CC10x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y5E[];
extern void _ZN3ccc8CC10x1y53pqrEv();
extern void _ZN3ccc8CC10x1y53abcEv();
extern void _ZN3ccc8CC10x1y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y53abcEv,_ZThn4_N3ccc8CC10x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y53pqrEv,_ZThn4_N3ccc8CC10x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y53efgEv,_ZThn4_N3ccc8CC10x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y53abcEv,_ZThn4_N3ccc8CC10x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y53pqrEv,_ZThn4_N3ccc8CC10x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y53efgEv,_ZThn4_N3ccc8CC10x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y5E[];
Class_Descriptor cd__ZN3ccc8CC10x1y5E = {  "_ZN3ccc8CC10x1y5E", // class name
  bases__ZN3ccc8CC10x1y5E, 2,
  &(vtc__ZN3ccc8CC10x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y6  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y63efgEv
  ~CC10x1y6(); // tgen
  CC10x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x1y63abcEv();
extern void _ZN3ccc8CC10x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y63abcEv,_ZThn4_N3ccc8CC10x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y63efgEv,_ZThn4_N3ccc8CC10x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y63abcEv,_ZThn4_N3ccc8CC10x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y63efgEv,_ZThn4_N3ccc8CC10x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y6E[];
Class_Descriptor cd__ZN3ccc8CC10x1y6E = {  "_ZN3ccc8CC10x1y6E", // class name
  bases__ZN3ccc8CC10x1y6E, 2,
  &(vtc__ZN3ccc8CC10x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y7  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y73pqrEv
  ~CC10x1y7(); // tgen
  CC10x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y7E[];
extern void _ZN3ccc8CC10x1y73pqrEv();
extern void _ZN3ccc8CC10x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y73abcEv,_ZThn4_N3ccc8CC10x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y73pqrEv,_ZThn4_N3ccc8CC10x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y73abcEv,_ZThn4_N3ccc8CC10x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y73pqrEv,_ZThn4_N3ccc8CC10x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y7E[];
Class_Descriptor cd__ZN3ccc8CC10x1y7E = {  "_ZN3ccc8CC10x1y7E", // class name
  bases__ZN3ccc8CC10x1y7E, 2,
  &(vtc__ZN3ccc8CC10x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y8  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y83abcEv
  ~CC10x1y8(); // tgen
  CC10x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x1y83abcEv();
extern void _ZN3ccc8CC10x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y83abcEv,_ZThn4_N3ccc8CC10x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y83efgEv,_ZThn4_N3ccc8CC10x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y83abcEv,_ZThn4_N3ccc8CC10x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y83efgEv,_ZThn4_N3ccc8CC10x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y8E[];
Class_Descriptor cd__ZN3ccc8CC10x1y8E = {  "_ZN3ccc8CC10x1y8E", // class name
  bases__ZN3ccc8CC10x1y8E, 2,
  &(vtc__ZN3ccc8CC10x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y9  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y93pqrEv
  ~CC10x1y9(); // tgen
  CC10x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y9E[];
extern void _ZN3ccc8CC10x1y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y93pqrEv,_ZThn4_N3ccc8CC10x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y93efgEv,_ZThn4_N3ccc8CC10x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y93pqrEv,_ZThn4_N3ccc8CC10x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x1y93efgEv,_ZThn4_N3ccc8CC10x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y9E[];
Class_Descriptor cd__ZN3ccc8CC10x1y9E = {  "_ZN3ccc8CC10x1y9E", // class name
  bases__ZN3ccc8CC10x1y9E, 2,
  &(vtc__ZN3ccc8CC10x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y10  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x1y103abcEv
  ~CC10x1y10(); // tgen
  CC10x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y10E[];
extern void _ZN3ccc9CC10x1y103pqrEv();
extern void _ZN3ccc9CC10x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y103abcEv,_ZThn4_N3ccc9CC10x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y103pqrEv,_ZThn4_N3ccc9CC10x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y103abcEv,_ZThn4_N3ccc9CC10x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y103pqrEv,_ZThn4_N3ccc9CC10x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y10E[];
Class_Descriptor cd__ZN3ccc9CC10x1y10E = {  "_ZN3ccc9CC10x1y10E", // class name
  bases__ZN3ccc9CC10x1y10E, 2,
  &(vtc__ZN3ccc9CC10x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y11  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x1y113efgEv
  ~CC10x1y11(); // tgen
  CC10x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y11E[];
extern void _ZN3ccc9CC10x1y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y113pqrEv,_ZThn4_N3ccc9CC10x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y113efgEv,_ZThn4_N3ccc9CC10x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y113pqrEv,_ZThn4_N3ccc9CC10x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y113efgEv,_ZThn4_N3ccc9CC10x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y11E[];
Class_Descriptor cd__ZN3ccc9CC10x1y11E = {  "_ZN3ccc9CC10x1y11E", // class name
  bases__ZN3ccc9CC10x1y11E, 2,
  &(vtc__ZN3ccc9CC10x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y12  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC10x1y123abcEv
  ~CC10x1y12(); // tgen
  CC10x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y123abcEv,_ZThn4_N3ccc9CC10x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y123abcEv,_ZThn4_N3ccc9CC10x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y12E[];
Class_Descriptor cd__ZN3ccc9CC10x1y12E = {  "_ZN3ccc9CC10x1y12E", // class name
  bases__ZN3ccc9CC10x1y12E, 2,
  &(vtc__ZN3ccc9CC10x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y13  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC10x1y133efgEv
  ~CC10x1y13(); // tgen
  CC10x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y133efgEv,_ZThn4_N3ccc9CC10x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y133efgEv,_ZThn4_N3ccc9CC10x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y13E[];
Class_Descriptor cd__ZN3ccc9CC10x1y13E = {  "_ZN3ccc9CC10x1y13E", // class name
  bases__ZN3ccc9CC10x1y13E, 2,
  &(vtc__ZN3ccc9CC10x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y14  : ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y143pqrEv
  ~CC10x1y14(); // tgen
  CC10x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y14E[];
extern void _ZN3ccc9CC10x1y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y143pqrEv,_ZThn4_N3ccc9CC10x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x1y143pqrEv,_ZThn4_N3ccc9CC10x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y14E[];
Class_Descriptor cd__ZN3ccc9CC10x1y14E = {  "_ZN3ccc9CC10x1y14E", // class name
  bases__ZN3ccc9CC10x1y14E, 2,
  &(vtc__ZN3ccc9CC10x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x1y15  : ::ccc::AA10 , ::ccc::BB1 {
  ~CC10x1y15(); // tgen
  CC10x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y15E[];
Class_Descriptor cd__ZN3ccc9CC10x1y15E = {  "_ZN3ccc9CC10x1y15E", // class name
  bases__ZN3ccc9CC10x1y15E, 2,
  &(vtc__ZN3ccc9CC10x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y0  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y03pqrEv
  ~CC10x2y0(); // tgen
  CC10x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y0E[];
extern void _ZN3ccc8CC10x2y03pqrEv();
extern void _ZN3ccc8CC10x2y03abcEv();
extern void _ZN3ccc8CC10x2y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y03efgEv,_ZThn4_N3ccc8CC10x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y03abcEv,_ZThn4_N3ccc8CC10x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y03pqrEv,_ZThn4_N3ccc8CC10x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y03efgEv,_ZThn4_N3ccc8CC10x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y03abcEv,_ZThn4_N3ccc8CC10x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y03pqrEv,_ZThn4_N3ccc8CC10x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y0E[];
Class_Descriptor cd__ZN3ccc8CC10x2y0E = {  "_ZN3ccc8CC10x2y0E", // class name
  bases__ZN3ccc8CC10x2y0E, 2,
  &(vtc__ZN3ccc8CC10x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y1  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x2y13efgEv
  ~CC10x2y1(); // tgen
  CC10x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y1E[];
extern void _ZN3ccc8CC10x2y13pqrEv();
extern void _ZN3ccc8CC10x2y13abcEv();
extern void _ZN3ccc8CC10x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y13efgEv,_ZThn4_N3ccc8CC10x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y13abcEv,_ZThn4_N3ccc8CC10x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y13pqrEv,_ZThn4_N3ccc8CC10x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y13efgEv,_ZThn4_N3ccc8CC10x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y13abcEv,_ZThn4_N3ccc8CC10x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y13pqrEv,_ZThn4_N3ccc8CC10x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y1E[];
Class_Descriptor cd__ZN3ccc8CC10x2y1E = {  "_ZN3ccc8CC10x2y1E", // class name
  bases__ZN3ccc8CC10x2y1E, 2,
  &(vtc__ZN3ccc8CC10x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y2  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y23pqrEv
  ~CC10x2y2(); // tgen
  CC10x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y2E[];
extern void _ZN3ccc8CC10x2y23pqrEv();
extern void _ZN3ccc8CC10x2y23abcEv();
extern void _ZN3ccc8CC10x2y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y23efgEv,_ZThn4_N3ccc8CC10x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y23abcEv,_ZThn4_N3ccc8CC10x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y23pqrEv,_ZThn4_N3ccc8CC10x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y23efgEv,_ZThn4_N3ccc8CC10x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y23abcEv,_ZThn4_N3ccc8CC10x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y23pqrEv,_ZThn4_N3ccc8CC10x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y2E[];
Class_Descriptor cd__ZN3ccc8CC10x2y2E = {  "_ZN3ccc8CC10x2y2E", // class name
  bases__ZN3ccc8CC10x2y2E, 2,
  &(vtc__ZN3ccc8CC10x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y3  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x2y33abcEv
  ~CC10x2y3(); // tgen
  CC10x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y3E[];
extern void _ZN3ccc8CC10x2y33pqrEv();
extern void _ZN3ccc8CC10x2y33abcEv();
extern void _ZN3ccc8CC10x2y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y33efgEv,_ZThn4_N3ccc8CC10x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y33abcEv,_ZThn4_N3ccc8CC10x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y33pqrEv,_ZThn4_N3ccc8CC10x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y33efgEv,_ZThn4_N3ccc8CC10x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y33abcEv,_ZThn4_N3ccc8CC10x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y33pqrEv,_ZThn4_N3ccc8CC10x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y3E[];
Class_Descriptor cd__ZN3ccc8CC10x2y3E = {  "_ZN3ccc8CC10x2y3E", // class name
  bases__ZN3ccc8CC10x2y3E, 2,
  &(vtc__ZN3ccc8CC10x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y4  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC10x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y43efgEv
  ~CC10x2y4(); // tgen
  CC10x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y4E[];
extern void _ZN3ccc8CC10x2y43pqrEv();
extern void _ZN3ccc8CC10x2y43abcEv();
extern void _ZN3ccc8CC10x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y43efgEv,_ZThn4_N3ccc8CC10x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y43abcEv,_ZThn4_N3ccc8CC10x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y43pqrEv,_ZThn4_N3ccc8CC10x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y43efgEv,_ZThn4_N3ccc8CC10x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y43abcEv,_ZThn4_N3ccc8CC10x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y43pqrEv,_ZThn4_N3ccc8CC10x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y4E[];
Class_Descriptor cd__ZN3ccc8CC10x2y4E = {  "_ZN3ccc8CC10x2y4E", // class name
  bases__ZN3ccc8CC10x2y4E, 2,
  &(vtc__ZN3ccc8CC10x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y5  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC10x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y53abcEv
  ~CC10x2y5(); // tgen
  CC10x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y5E[];
extern void _ZN3ccc8CC10x2y53pqrEv();
extern void _ZN3ccc8CC10x2y53abcEv();
extern void _ZN3ccc8CC10x2y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y53efgEv,_ZThn4_N3ccc8CC10x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y53abcEv,_ZThn4_N3ccc8CC10x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y53pqrEv,_ZThn4_N3ccc8CC10x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y53efgEv,_ZThn4_N3ccc8CC10x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y53abcEv,_ZThn4_N3ccc8CC10x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y53pqrEv,_ZThn4_N3ccc8CC10x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y5E[];
Class_Descriptor cd__ZN3ccc8CC10x2y5E = {  "_ZN3ccc8CC10x2y5E", // class name
  bases__ZN3ccc8CC10x2y5E, 2,
  &(vtc__ZN3ccc8CC10x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y6  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y63efgEv
  ~CC10x2y6(); // tgen
  CC10x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x2y63abcEv();
extern void _ZN3ccc8CC10x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y63efgEv,_ZThn4_N3ccc8CC10x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y63abcEv,_ZThn4_N3ccc8CC10x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y63efgEv,_ZThn4_N3ccc8CC10x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y63abcEv,_ZThn4_N3ccc8CC10x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y6E[];
Class_Descriptor cd__ZN3ccc8CC10x2y6E = {  "_ZN3ccc8CC10x2y6E", // class name
  bases__ZN3ccc8CC10x2y6E, 2,
  &(vtc__ZN3ccc8CC10x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y7  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y73pqrEv
  ~CC10x2y7(); // tgen
  CC10x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y7E[];
extern void _ZN3ccc8CC10x2y73pqrEv();
extern void _ZN3ccc8CC10x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y73abcEv,_ZThn4_N3ccc8CC10x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y73pqrEv,_ZThn4_N3ccc8CC10x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y73abcEv,_ZThn4_N3ccc8CC10x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y73pqrEv,_ZThn4_N3ccc8CC10x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y7E[];
Class_Descriptor cd__ZN3ccc8CC10x2y7E = {  "_ZN3ccc8CC10x2y7E", // class name
  bases__ZN3ccc8CC10x2y7E, 2,
  &(vtc__ZN3ccc8CC10x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y8  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y83abcEv
  ~CC10x2y8(); // tgen
  CC10x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x2y83abcEv();
extern void _ZN3ccc8CC10x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y83efgEv,_ZThn4_N3ccc8CC10x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y83abcEv,_ZThn4_N3ccc8CC10x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y83efgEv,_ZThn4_N3ccc8CC10x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y83abcEv,_ZThn4_N3ccc8CC10x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y8E[];
Class_Descriptor cd__ZN3ccc8CC10x2y8E = {  "_ZN3ccc8CC10x2y8E", // class name
  bases__ZN3ccc8CC10x2y8E, 2,
  &(vtc__ZN3ccc8CC10x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y9  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y93pqrEv
  ~CC10x2y9(); // tgen
  CC10x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y9E[];
extern void _ZN3ccc8CC10x2y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y93efgEv,_ZThn4_N3ccc8CC10x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y93pqrEv,_ZThn4_N3ccc8CC10x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y93efgEv,_ZThn4_N3ccc8CC10x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x2y93pqrEv,_ZThn4_N3ccc8CC10x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y9E[];
Class_Descriptor cd__ZN3ccc8CC10x2y9E = {  "_ZN3ccc8CC10x2y9E", // class name
  bases__ZN3ccc8CC10x2y9E, 2,
  &(vtc__ZN3ccc8CC10x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y10  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x2y103abcEv
  ~CC10x2y10(); // tgen
  CC10x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y10E[];
extern void _ZN3ccc9CC10x2y103pqrEv();
extern void _ZN3ccc9CC10x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y103abcEv,_ZThn4_N3ccc9CC10x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y103pqrEv,_ZThn4_N3ccc9CC10x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y103abcEv,_ZThn4_N3ccc9CC10x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y103pqrEv,_ZThn4_N3ccc9CC10x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y10E[];
Class_Descriptor cd__ZN3ccc9CC10x2y10E = {  "_ZN3ccc9CC10x2y10E", // class name
  bases__ZN3ccc9CC10x2y10E, 2,
  &(vtc__ZN3ccc9CC10x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y11  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x2y113efgEv
  ~CC10x2y11(); // tgen
  CC10x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y11E[];
extern void _ZN3ccc9CC10x2y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y113efgEv,_ZThn4_N3ccc9CC10x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y113pqrEv,_ZThn4_N3ccc9CC10x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y113efgEv,_ZThn4_N3ccc9CC10x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y113pqrEv,_ZThn4_N3ccc9CC10x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y11E[];
Class_Descriptor cd__ZN3ccc9CC10x2y11E = {  "_ZN3ccc9CC10x2y11E", // class name
  bases__ZN3ccc9CC10x2y11E, 2,
  &(vtc__ZN3ccc9CC10x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y12  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC10x2y123abcEv
  ~CC10x2y12(); // tgen
  CC10x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y123abcEv,_ZThn4_N3ccc9CC10x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y123abcEv,_ZThn4_N3ccc9CC10x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y12E[];
Class_Descriptor cd__ZN3ccc9CC10x2y12E = {  "_ZN3ccc9CC10x2y12E", // class name
  bases__ZN3ccc9CC10x2y12E, 2,
  &(vtc__ZN3ccc9CC10x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y13  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC10x2y133efgEv
  ~CC10x2y13(); // tgen
  CC10x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y133efgEv,_ZThn4_N3ccc9CC10x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y133efgEv,_ZThn4_N3ccc9CC10x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y13E[];
Class_Descriptor cd__ZN3ccc9CC10x2y13E = {  "_ZN3ccc9CC10x2y13E", // class name
  bases__ZN3ccc9CC10x2y13E, 2,
  &(vtc__ZN3ccc9CC10x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y14  : ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y143pqrEv
  ~CC10x2y14(); // tgen
  CC10x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y14E[];
extern void _ZN3ccc9CC10x2y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y143pqrEv,_ZThn4_N3ccc9CC10x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x2y143pqrEv,_ZThn4_N3ccc9CC10x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y14E[];
Class_Descriptor cd__ZN3ccc9CC10x2y14E = {  "_ZN3ccc9CC10x2y14E", // class name
  bases__ZN3ccc9CC10x2y14E, 2,
  &(vtc__ZN3ccc9CC10x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x2y15  : ::ccc::AA10 , ::ccc::BB2 {
  ~CC10x2y15(); // tgen
  CC10x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y15E[];
Class_Descriptor cd__ZN3ccc9CC10x2y15E = {  "_ZN3ccc9CC10x2y15E", // class name
  bases__ZN3ccc9CC10x2y15E, 2,
  &(vtc__ZN3ccc9CC10x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y0  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y03pqrEv
  ~CC10x3y0(); // tgen
  CC10x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y0E[];
extern void _ZN3ccc8CC10x3y03pqrEv();
extern void _ZN3ccc8CC10x3y03abcEv();
extern void _ZN3ccc8CC10x3y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y03efgEv,_ZThn4_N3ccc8CC10x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y03pqrEv,_ZThn4_N3ccc8CC10x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y03abcEv,_ZThn4_N3ccc8CC10x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y03efgEv,_ZThn4_N3ccc8CC10x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y03pqrEv,_ZThn4_N3ccc8CC10x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y03abcEv,_ZThn4_N3ccc8CC10x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y0E[];
Class_Descriptor cd__ZN3ccc8CC10x3y0E = {  "_ZN3ccc8CC10x3y0E", // class name
  bases__ZN3ccc8CC10x3y0E, 2,
  &(vtc__ZN3ccc8CC10x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y1  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x3y13efgEv
  ~CC10x3y1(); // tgen
  CC10x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y1E[];
extern void _ZN3ccc8CC10x3y13pqrEv();
extern void _ZN3ccc8CC10x3y13abcEv();
extern void _ZN3ccc8CC10x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y13efgEv,_ZThn4_N3ccc8CC10x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y13pqrEv,_ZThn4_N3ccc8CC10x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y13abcEv,_ZThn4_N3ccc8CC10x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y13efgEv,_ZThn4_N3ccc8CC10x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y13pqrEv,_ZThn4_N3ccc8CC10x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y13abcEv,_ZThn4_N3ccc8CC10x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y1E[];
Class_Descriptor cd__ZN3ccc8CC10x3y1E = {  "_ZN3ccc8CC10x3y1E", // class name
  bases__ZN3ccc8CC10x3y1E, 2,
  &(vtc__ZN3ccc8CC10x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y2  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y23pqrEv
  ~CC10x3y2(); // tgen
  CC10x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y2E[];
extern void _ZN3ccc8CC10x3y23pqrEv();
extern void _ZN3ccc8CC10x3y23abcEv();
extern void _ZN3ccc8CC10x3y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y23efgEv,_ZThn4_N3ccc8CC10x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y23pqrEv,_ZThn4_N3ccc8CC10x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y23abcEv,_ZThn4_N3ccc8CC10x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y23efgEv,_ZThn4_N3ccc8CC10x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y23pqrEv,_ZThn4_N3ccc8CC10x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y23abcEv,_ZThn4_N3ccc8CC10x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y2E[];
Class_Descriptor cd__ZN3ccc8CC10x3y2E = {  "_ZN3ccc8CC10x3y2E", // class name
  bases__ZN3ccc8CC10x3y2E, 2,
  &(vtc__ZN3ccc8CC10x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y3  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x3y33abcEv
  ~CC10x3y3(); // tgen
  CC10x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y3E[];
extern void _ZN3ccc8CC10x3y33pqrEv();
extern void _ZN3ccc8CC10x3y33abcEv();
extern void _ZN3ccc8CC10x3y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y33efgEv,_ZThn4_N3ccc8CC10x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y33pqrEv,_ZThn4_N3ccc8CC10x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y33abcEv,_ZThn4_N3ccc8CC10x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y33efgEv,_ZThn4_N3ccc8CC10x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y33pqrEv,_ZThn4_N3ccc8CC10x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y33abcEv,_ZThn4_N3ccc8CC10x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y3E[];
Class_Descriptor cd__ZN3ccc8CC10x3y3E = {  "_ZN3ccc8CC10x3y3E", // class name
  bases__ZN3ccc8CC10x3y3E, 2,
  &(vtc__ZN3ccc8CC10x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y4  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC10x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y43efgEv
  ~CC10x3y4(); // tgen
  CC10x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y4E[];
extern void _ZN3ccc8CC10x3y43pqrEv();
extern void _ZN3ccc8CC10x3y43abcEv();
extern void _ZN3ccc8CC10x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y43efgEv,_ZThn4_N3ccc8CC10x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y43pqrEv,_ZThn4_N3ccc8CC10x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y43abcEv,_ZThn4_N3ccc8CC10x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y43efgEv,_ZThn4_N3ccc8CC10x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y43pqrEv,_ZThn4_N3ccc8CC10x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y43abcEv,_ZThn4_N3ccc8CC10x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y4E[];
Class_Descriptor cd__ZN3ccc8CC10x3y4E = {  "_ZN3ccc8CC10x3y4E", // class name
  bases__ZN3ccc8CC10x3y4E, 2,
  &(vtc__ZN3ccc8CC10x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y5  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC10x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y53abcEv
  ~CC10x3y5(); // tgen
  CC10x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y5E[];
extern void _ZN3ccc8CC10x3y53pqrEv();
extern void _ZN3ccc8CC10x3y53abcEv();
extern void _ZN3ccc8CC10x3y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y53efgEv,_ZThn4_N3ccc8CC10x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y53pqrEv,_ZThn4_N3ccc8CC10x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y53abcEv,_ZThn4_N3ccc8CC10x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y53efgEv,_ZThn4_N3ccc8CC10x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y53pqrEv,_ZThn4_N3ccc8CC10x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y53abcEv,_ZThn4_N3ccc8CC10x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y5E[];
Class_Descriptor cd__ZN3ccc8CC10x3y5E = {  "_ZN3ccc8CC10x3y5E", // class name
  bases__ZN3ccc8CC10x3y5E, 2,
  &(vtc__ZN3ccc8CC10x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y6  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y63efgEv
  ~CC10x3y6(); // tgen
  CC10x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x3y63abcEv();
extern void _ZN3ccc8CC10x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y63efgEv,_ZThn4_N3ccc8CC10x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y63abcEv,_ZThn4_N3ccc8CC10x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y63efgEv,_ZThn4_N3ccc8CC10x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y63abcEv,_ZThn4_N3ccc8CC10x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y6E[];
Class_Descriptor cd__ZN3ccc8CC10x3y6E = {  "_ZN3ccc8CC10x3y6E", // class name
  bases__ZN3ccc8CC10x3y6E, 2,
  &(vtc__ZN3ccc8CC10x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y7  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y73pqrEv
  ~CC10x3y7(); // tgen
  CC10x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y7E[];
extern void _ZN3ccc8CC10x3y73pqrEv();
extern void _ZN3ccc8CC10x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y73pqrEv,_ZThn4_N3ccc8CC10x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y73abcEv,_ZThn4_N3ccc8CC10x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y73pqrEv,_ZThn4_N3ccc8CC10x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y73abcEv,_ZThn4_N3ccc8CC10x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y7E[];
Class_Descriptor cd__ZN3ccc8CC10x3y7E = {  "_ZN3ccc8CC10x3y7E", // class name
  bases__ZN3ccc8CC10x3y7E, 2,
  &(vtc__ZN3ccc8CC10x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y8  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y83abcEv
  ~CC10x3y8(); // tgen
  CC10x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x3y83abcEv();
extern void _ZN3ccc8CC10x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y83efgEv,_ZThn4_N3ccc8CC10x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y83abcEv,_ZThn4_N3ccc8CC10x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y83efgEv,_ZThn4_N3ccc8CC10x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y83abcEv,_ZThn4_N3ccc8CC10x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y8E[];
Class_Descriptor cd__ZN3ccc8CC10x3y8E = {  "_ZN3ccc8CC10x3y8E", // class name
  bases__ZN3ccc8CC10x3y8E, 2,
  &(vtc__ZN3ccc8CC10x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y9  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y93pqrEv
  ~CC10x3y9(); // tgen
  CC10x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y9E[];
extern void _ZN3ccc8CC10x3y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y93efgEv,_ZThn4_N3ccc8CC10x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y93pqrEv,_ZThn4_N3ccc8CC10x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y93efgEv,_ZThn4_N3ccc8CC10x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x3y93pqrEv,_ZThn4_N3ccc8CC10x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y9E[];
Class_Descriptor cd__ZN3ccc8CC10x3y9E = {  "_ZN3ccc8CC10x3y9E", // class name
  bases__ZN3ccc8CC10x3y9E, 2,
  &(vtc__ZN3ccc8CC10x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y10  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x3y103abcEv
  ~CC10x3y10(); // tgen
  CC10x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y10E[];
extern void _ZN3ccc9CC10x3y103pqrEv();
extern void _ZN3ccc9CC10x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y103pqrEv,_ZThn4_N3ccc9CC10x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y103abcEv,_ZThn4_N3ccc9CC10x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y103pqrEv,_ZThn4_N3ccc9CC10x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y103abcEv,_ZThn4_N3ccc9CC10x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y10E[];
Class_Descriptor cd__ZN3ccc9CC10x3y10E = {  "_ZN3ccc9CC10x3y10E", // class name
  bases__ZN3ccc9CC10x3y10E, 2,
  &(vtc__ZN3ccc9CC10x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y11  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x3y113efgEv
  ~CC10x3y11(); // tgen
  CC10x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y11E[];
extern void _ZN3ccc9CC10x3y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y113efgEv,_ZThn4_N3ccc9CC10x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y113pqrEv,_ZThn4_N3ccc9CC10x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y113efgEv,_ZThn4_N3ccc9CC10x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y113pqrEv,_ZThn4_N3ccc9CC10x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y11E[];
Class_Descriptor cd__ZN3ccc9CC10x3y11E = {  "_ZN3ccc9CC10x3y11E", // class name
  bases__ZN3ccc9CC10x3y11E, 2,
  &(vtc__ZN3ccc9CC10x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y12  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC10x3y123abcEv
  ~CC10x3y12(); // tgen
  CC10x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y123abcEv,_ZThn4_N3ccc9CC10x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y123abcEv,_ZThn4_N3ccc9CC10x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y12E[];
Class_Descriptor cd__ZN3ccc9CC10x3y12E = {  "_ZN3ccc9CC10x3y12E", // class name
  bases__ZN3ccc9CC10x3y12E, 2,
  &(vtc__ZN3ccc9CC10x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y13  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC10x3y133efgEv
  ~CC10x3y13(); // tgen
  CC10x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y133efgEv,_ZThn4_N3ccc9CC10x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y133efgEv,_ZThn4_N3ccc9CC10x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y13E[];
Class_Descriptor cd__ZN3ccc9CC10x3y13E = {  "_ZN3ccc9CC10x3y13E", // class name
  bases__ZN3ccc9CC10x3y13E, 2,
  &(vtc__ZN3ccc9CC10x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y14  : ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y143pqrEv
  ~CC10x3y14(); // tgen
  CC10x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y14E[];
extern void _ZN3ccc9CC10x3y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y143pqrEv,_ZThn4_N3ccc9CC10x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x3y143pqrEv,_ZThn4_N3ccc9CC10x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y14E[];
Class_Descriptor cd__ZN3ccc9CC10x3y14E = {  "_ZN3ccc9CC10x3y14E", // class name
  bases__ZN3ccc9CC10x3y14E, 2,
  &(vtc__ZN3ccc9CC10x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x3y15  : ::ccc::AA10 , ::ccc::BB3 {
  ~CC10x3y15(); // tgen
  CC10x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y15E[];
Class_Descriptor cd__ZN3ccc9CC10x3y15E = {  "_ZN3ccc9CC10x3y15E", // class name
  bases__ZN3ccc9CC10x3y15E, 2,
  &(vtc__ZN3ccc9CC10x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y0  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y03pqrEv
  ~CC10x4y0(); // tgen
  CC10x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y0E[];
extern void _ZN3ccc8CC10x4y03pqrEv();
extern void _ZN3ccc8CC10x4y03abcEv();
extern void _ZN3ccc8CC10x4y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y03pqrEv,_ZThn4_N3ccc8CC10x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y03abcEv,_ZThn4_N3ccc8CC10x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y03efgEv,_ZThn4_N3ccc8CC10x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y03pqrEv,_ZThn4_N3ccc8CC10x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y03abcEv,_ZThn4_N3ccc8CC10x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y03efgEv,_ZThn4_N3ccc8CC10x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y0E[];
Class_Descriptor cd__ZN3ccc8CC10x4y0E = {  "_ZN3ccc8CC10x4y0E", // class name
  bases__ZN3ccc8CC10x4y0E, 2,
  &(vtc__ZN3ccc8CC10x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y1  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x4y13efgEv
  ~CC10x4y1(); // tgen
  CC10x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y1E[];
extern void _ZN3ccc8CC10x4y13pqrEv();
extern void _ZN3ccc8CC10x4y13abcEv();
extern void _ZN3ccc8CC10x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y13pqrEv,_ZThn4_N3ccc8CC10x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y13abcEv,_ZThn4_N3ccc8CC10x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y13efgEv,_ZThn4_N3ccc8CC10x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y13pqrEv,_ZThn4_N3ccc8CC10x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y13abcEv,_ZThn4_N3ccc8CC10x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y13efgEv,_ZThn4_N3ccc8CC10x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y1E[];
Class_Descriptor cd__ZN3ccc8CC10x4y1E = {  "_ZN3ccc8CC10x4y1E", // class name
  bases__ZN3ccc8CC10x4y1E, 2,
  &(vtc__ZN3ccc8CC10x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y2  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y23pqrEv
  ~CC10x4y2(); // tgen
  CC10x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y2E[];
extern void _ZN3ccc8CC10x4y23pqrEv();
extern void _ZN3ccc8CC10x4y23abcEv();
extern void _ZN3ccc8CC10x4y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y23pqrEv,_ZThn4_N3ccc8CC10x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y23abcEv,_ZThn4_N3ccc8CC10x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y23efgEv,_ZThn4_N3ccc8CC10x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y23pqrEv,_ZThn4_N3ccc8CC10x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y23abcEv,_ZThn4_N3ccc8CC10x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y23efgEv,_ZThn4_N3ccc8CC10x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y2E[];
Class_Descriptor cd__ZN3ccc8CC10x4y2E = {  "_ZN3ccc8CC10x4y2E", // class name
  bases__ZN3ccc8CC10x4y2E, 2,
  &(vtc__ZN3ccc8CC10x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y3  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x4y33abcEv
  ~CC10x4y3(); // tgen
  CC10x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y3E[];
extern void _ZN3ccc8CC10x4y33pqrEv();
extern void _ZN3ccc8CC10x4y33abcEv();
extern void _ZN3ccc8CC10x4y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y33pqrEv,_ZThn4_N3ccc8CC10x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y33abcEv,_ZThn4_N3ccc8CC10x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y33efgEv,_ZThn4_N3ccc8CC10x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y33pqrEv,_ZThn4_N3ccc8CC10x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y33abcEv,_ZThn4_N3ccc8CC10x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y33efgEv,_ZThn4_N3ccc8CC10x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y3E[];
Class_Descriptor cd__ZN3ccc8CC10x4y3E = {  "_ZN3ccc8CC10x4y3E", // class name
  bases__ZN3ccc8CC10x4y3E, 2,
  &(vtc__ZN3ccc8CC10x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y4  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC10x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y43efgEv
  ~CC10x4y4(); // tgen
  CC10x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y4E[];
extern void _ZN3ccc8CC10x4y43pqrEv();
extern void _ZN3ccc8CC10x4y43abcEv();
extern void _ZN3ccc8CC10x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y43pqrEv,_ZThn4_N3ccc8CC10x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y43abcEv,_ZThn4_N3ccc8CC10x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y43efgEv,_ZThn4_N3ccc8CC10x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y43pqrEv,_ZThn4_N3ccc8CC10x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y43abcEv,_ZThn4_N3ccc8CC10x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y43efgEv,_ZThn4_N3ccc8CC10x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y4E[];
Class_Descriptor cd__ZN3ccc8CC10x4y4E = {  "_ZN3ccc8CC10x4y4E", // class name
  bases__ZN3ccc8CC10x4y4E, 2,
  &(vtc__ZN3ccc8CC10x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y5  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC10x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y53abcEv
  ~CC10x4y5(); // tgen
  CC10x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y5E[];
extern void _ZN3ccc8CC10x4y53pqrEv();
extern void _ZN3ccc8CC10x4y53abcEv();
extern void _ZN3ccc8CC10x4y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y53pqrEv,_ZThn4_N3ccc8CC10x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y53abcEv,_ZThn4_N3ccc8CC10x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y53efgEv,_ZThn4_N3ccc8CC10x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y53pqrEv,_ZThn4_N3ccc8CC10x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y53abcEv,_ZThn4_N3ccc8CC10x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y53efgEv,_ZThn4_N3ccc8CC10x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y5E[];
Class_Descriptor cd__ZN3ccc8CC10x4y5E = {  "_ZN3ccc8CC10x4y5E", // class name
  bases__ZN3ccc8CC10x4y5E, 2,
  &(vtc__ZN3ccc8CC10x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y6  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y63efgEv
  ~CC10x4y6(); // tgen
  CC10x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x4y63abcEv();
extern void _ZN3ccc8CC10x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y63abcEv,_ZThn4_N3ccc8CC10x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y63efgEv,_ZThn4_N3ccc8CC10x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y63abcEv,_ZThn4_N3ccc8CC10x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y63efgEv,_ZThn4_N3ccc8CC10x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y6E[];
Class_Descriptor cd__ZN3ccc8CC10x4y6E = {  "_ZN3ccc8CC10x4y6E", // class name
  bases__ZN3ccc8CC10x4y6E, 2,
  &(vtc__ZN3ccc8CC10x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y7  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y73pqrEv
  ~CC10x4y7(); // tgen
  CC10x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y7E[];
extern void _ZN3ccc8CC10x4y73pqrEv();
extern void _ZN3ccc8CC10x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y73pqrEv,_ZThn4_N3ccc8CC10x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y73abcEv,_ZThn4_N3ccc8CC10x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y73pqrEv,_ZThn4_N3ccc8CC10x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y73abcEv,_ZThn4_N3ccc8CC10x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y7E[];
Class_Descriptor cd__ZN3ccc8CC10x4y7E = {  "_ZN3ccc8CC10x4y7E", // class name
  bases__ZN3ccc8CC10x4y7E, 2,
  &(vtc__ZN3ccc8CC10x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y8  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y83abcEv
  ~CC10x4y8(); // tgen
  CC10x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x4y83abcEv();
extern void _ZN3ccc8CC10x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y83abcEv,_ZThn4_N3ccc8CC10x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y83efgEv,_ZThn4_N3ccc8CC10x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y83abcEv,_ZThn4_N3ccc8CC10x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y83efgEv,_ZThn4_N3ccc8CC10x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y8E[];
Class_Descriptor cd__ZN3ccc8CC10x4y8E = {  "_ZN3ccc8CC10x4y8E", // class name
  bases__ZN3ccc8CC10x4y8E, 2,
  &(vtc__ZN3ccc8CC10x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y9  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y93pqrEv
  ~CC10x4y9(); // tgen
  CC10x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y9E[];
extern void _ZN3ccc8CC10x4y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y93pqrEv,_ZThn4_N3ccc8CC10x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y93efgEv,_ZThn4_N3ccc8CC10x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y93pqrEv,_ZThn4_N3ccc8CC10x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x4y93efgEv,_ZThn4_N3ccc8CC10x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y9E[];
Class_Descriptor cd__ZN3ccc8CC10x4y9E = {  "_ZN3ccc8CC10x4y9E", // class name
  bases__ZN3ccc8CC10x4y9E, 2,
  &(vtc__ZN3ccc8CC10x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y10  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x4y103abcEv
  ~CC10x4y10(); // tgen
  CC10x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y10E[];
extern void _ZN3ccc9CC10x4y103pqrEv();
extern void _ZN3ccc9CC10x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y103pqrEv,_ZThn4_N3ccc9CC10x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y103abcEv,_ZThn4_N3ccc9CC10x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y103pqrEv,_ZThn4_N3ccc9CC10x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y103abcEv,_ZThn4_N3ccc9CC10x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y10E[];
Class_Descriptor cd__ZN3ccc9CC10x4y10E = {  "_ZN3ccc9CC10x4y10E", // class name
  bases__ZN3ccc9CC10x4y10E, 2,
  &(vtc__ZN3ccc9CC10x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y11  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x4y113efgEv
  ~CC10x4y11(); // tgen
  CC10x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y11E[];
extern void _ZN3ccc9CC10x4y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y113pqrEv,_ZThn4_N3ccc9CC10x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y113efgEv,_ZThn4_N3ccc9CC10x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y113pqrEv,_ZThn4_N3ccc9CC10x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y113efgEv,_ZThn4_N3ccc9CC10x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y11E[];
Class_Descriptor cd__ZN3ccc9CC10x4y11E = {  "_ZN3ccc9CC10x4y11E", // class name
  bases__ZN3ccc9CC10x4y11E, 2,
  &(vtc__ZN3ccc9CC10x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y12  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC10x4y123abcEv
  ~CC10x4y12(); // tgen
  CC10x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y123abcEv,_ZThn4_N3ccc9CC10x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y123abcEv,_ZThn4_N3ccc9CC10x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y12E[];
Class_Descriptor cd__ZN3ccc9CC10x4y12E = {  "_ZN3ccc9CC10x4y12E", // class name
  bases__ZN3ccc9CC10x4y12E, 2,
  &(vtc__ZN3ccc9CC10x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y13  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC10x4y133efgEv
  ~CC10x4y13(); // tgen
  CC10x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y133efgEv,_ZThn4_N3ccc9CC10x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y133efgEv,_ZThn4_N3ccc9CC10x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y13E[];
Class_Descriptor cd__ZN3ccc9CC10x4y13E = {  "_ZN3ccc9CC10x4y13E", // class name
  bases__ZN3ccc9CC10x4y13E, 2,
  &(vtc__ZN3ccc9CC10x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y14  : ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y143pqrEv
  ~CC10x4y14(); // tgen
  CC10x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y14E[];
extern void _ZN3ccc9CC10x4y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y143pqrEv,_ZThn4_N3ccc9CC10x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x4y143pqrEv,_ZThn4_N3ccc9CC10x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y14E[];
Class_Descriptor cd__ZN3ccc9CC10x4y14E = {  "_ZN3ccc9CC10x4y14E", // class name
  bases__ZN3ccc9CC10x4y14E, 2,
  &(vtc__ZN3ccc9CC10x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x4y15  : ::ccc::AA10 , ::ccc::BB4 {
  ~CC10x4y15(); // tgen
  CC10x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y15E[];
Class_Descriptor cd__ZN3ccc9CC10x4y15E = {  "_ZN3ccc9CC10x4y15E", // class name
  bases__ZN3ccc9CC10x4y15E, 2,
  &(vtc__ZN3ccc9CC10x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y0  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y03pqrEv
  ~CC10x5y0(); // tgen
  CC10x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y0E[];
extern void _ZN3ccc8CC10x5y03pqrEv();
extern void _ZN3ccc8CC10x5y03abcEv();
extern void _ZN3ccc8CC10x5y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y03pqrEv,_ZThn4_N3ccc8CC10x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y03efgEv,_ZThn4_N3ccc8CC10x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y03abcEv,_ZThn4_N3ccc8CC10x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y03pqrEv,_ZThn4_N3ccc8CC10x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y03efgEv,_ZThn4_N3ccc8CC10x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y03abcEv,_ZThn4_N3ccc8CC10x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y0E[];
Class_Descriptor cd__ZN3ccc8CC10x5y0E = {  "_ZN3ccc8CC10x5y0E", // class name
  bases__ZN3ccc8CC10x5y0E, 2,
  &(vtc__ZN3ccc8CC10x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y1  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x5y13efgEv
  ~CC10x5y1(); // tgen
  CC10x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y1E[];
extern void _ZN3ccc8CC10x5y13pqrEv();
extern void _ZN3ccc8CC10x5y13abcEv();
extern void _ZN3ccc8CC10x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y13pqrEv,_ZThn4_N3ccc8CC10x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y13efgEv,_ZThn4_N3ccc8CC10x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y13abcEv,_ZThn4_N3ccc8CC10x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y13pqrEv,_ZThn4_N3ccc8CC10x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y13efgEv,_ZThn4_N3ccc8CC10x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y13abcEv,_ZThn4_N3ccc8CC10x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y1E[];
Class_Descriptor cd__ZN3ccc8CC10x5y1E = {  "_ZN3ccc8CC10x5y1E", // class name
  bases__ZN3ccc8CC10x5y1E, 2,
  &(vtc__ZN3ccc8CC10x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y2  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y23pqrEv
  ~CC10x5y2(); // tgen
  CC10x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y2E[];
extern void _ZN3ccc8CC10x5y23pqrEv();
extern void _ZN3ccc8CC10x5y23abcEv();
extern void _ZN3ccc8CC10x5y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y23pqrEv,_ZThn4_N3ccc8CC10x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y23efgEv,_ZThn4_N3ccc8CC10x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y23abcEv,_ZThn4_N3ccc8CC10x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y23pqrEv,_ZThn4_N3ccc8CC10x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y23efgEv,_ZThn4_N3ccc8CC10x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y23abcEv,_ZThn4_N3ccc8CC10x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y2E[];
Class_Descriptor cd__ZN3ccc8CC10x5y2E = {  "_ZN3ccc8CC10x5y2E", // class name
  bases__ZN3ccc8CC10x5y2E, 2,
  &(vtc__ZN3ccc8CC10x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y3  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x5y33abcEv
  ~CC10x5y3(); // tgen
  CC10x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y3E[];
extern void _ZN3ccc8CC10x5y33pqrEv();
extern void _ZN3ccc8CC10x5y33abcEv();
extern void _ZN3ccc8CC10x5y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y33pqrEv,_ZThn4_N3ccc8CC10x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y33efgEv,_ZThn4_N3ccc8CC10x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y33abcEv,_ZThn4_N3ccc8CC10x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y33pqrEv,_ZThn4_N3ccc8CC10x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y33efgEv,_ZThn4_N3ccc8CC10x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y33abcEv,_ZThn4_N3ccc8CC10x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y3E[];
Class_Descriptor cd__ZN3ccc8CC10x5y3E = {  "_ZN3ccc8CC10x5y3E", // class name
  bases__ZN3ccc8CC10x5y3E, 2,
  &(vtc__ZN3ccc8CC10x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y4  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC10x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y43efgEv
  ~CC10x5y4(); // tgen
  CC10x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y4E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y4E[];
extern void _ZN3ccc8CC10x5y43pqrEv();
extern void _ZN3ccc8CC10x5y43abcEv();
extern void _ZN3ccc8CC10x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y43pqrEv,_ZThn4_N3ccc8CC10x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y43efgEv,_ZThn4_N3ccc8CC10x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y43abcEv,_ZThn4_N3ccc8CC10x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y43pqrEv,_ZThn4_N3ccc8CC10x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y43efgEv,_ZThn4_N3ccc8CC10x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y43abcEv,_ZThn4_N3ccc8CC10x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y4E[];
Class_Descriptor cd__ZN3ccc8CC10x5y4E = {  "_ZN3ccc8CC10x5y4E", // class name
  bases__ZN3ccc8CC10x5y4E, 2,
  &(vtc__ZN3ccc8CC10x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y5  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC10x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y53abcEv
  ~CC10x5y5(); // tgen
  CC10x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y5E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y5E[];
extern void _ZN3ccc8CC10x5y53pqrEv();
extern void _ZN3ccc8CC10x5y53abcEv();
extern void _ZN3ccc8CC10x5y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y53pqrEv,_ZThn4_N3ccc8CC10x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y53efgEv,_ZThn4_N3ccc8CC10x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y53abcEv,_ZThn4_N3ccc8CC10x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y53pqrEv,_ZThn4_N3ccc8CC10x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y53efgEv,_ZThn4_N3ccc8CC10x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y53abcEv,_ZThn4_N3ccc8CC10x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y5E[];
Class_Descriptor cd__ZN3ccc8CC10x5y5E = {  "_ZN3ccc8CC10x5y5E", // class name
  bases__ZN3ccc8CC10x5y5E, 2,
  &(vtc__ZN3ccc8CC10x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y6  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y63efgEv
  ~CC10x5y6(); // tgen
  CC10x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y6E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x5y63abcEv();
extern void _ZN3ccc8CC10x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y63efgEv,_ZThn4_N3ccc8CC10x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y63abcEv,_ZThn4_N3ccc8CC10x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y63efgEv,_ZThn4_N3ccc8CC10x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y63abcEv,_ZThn4_N3ccc8CC10x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y6E[];
Class_Descriptor cd__ZN3ccc8CC10x5y6E = {  "_ZN3ccc8CC10x5y6E", // class name
  bases__ZN3ccc8CC10x5y6E, 2,
  &(vtc__ZN3ccc8CC10x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y7  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y73pqrEv
  ~CC10x5y7(); // tgen
  CC10x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y7E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y7E[];
extern void _ZN3ccc8CC10x5y73pqrEv();
extern void _ZN3ccc8CC10x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y73pqrEv,_ZThn4_N3ccc8CC10x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y73abcEv,_ZThn4_N3ccc8CC10x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y73pqrEv,_ZThn4_N3ccc8CC10x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y73abcEv,_ZThn4_N3ccc8CC10x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y7E[];
Class_Descriptor cd__ZN3ccc8CC10x5y7E = {  "_ZN3ccc8CC10x5y7E", // class name
  bases__ZN3ccc8CC10x5y7E, 2,
  &(vtc__ZN3ccc8CC10x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y8  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y83abcEv
  ~CC10x5y8(); // tgen
  CC10x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y8E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x5y83abcEv();
extern void _ZN3ccc8CC10x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y83efgEv,_ZThn4_N3ccc8CC10x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y83abcEv,_ZThn4_N3ccc8CC10x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y83efgEv,_ZThn4_N3ccc8CC10x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y83abcEv,_ZThn4_N3ccc8CC10x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y8E[];
Class_Descriptor cd__ZN3ccc8CC10x5y8E = {  "_ZN3ccc8CC10x5y8E", // class name
  bases__ZN3ccc8CC10x5y8E, 2,
  &(vtc__ZN3ccc8CC10x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y9  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y93pqrEv
  ~CC10x5y9(); // tgen
  CC10x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y9E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y9E[];
extern void _ZN3ccc8CC10x5y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y93pqrEv,_ZThn4_N3ccc8CC10x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y93efgEv,_ZThn4_N3ccc8CC10x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y93pqrEv,_ZThn4_N3ccc8CC10x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x5y93efgEv,_ZThn4_N3ccc8CC10x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y9E[];
Class_Descriptor cd__ZN3ccc8CC10x5y9E = {  "_ZN3ccc8CC10x5y9E", // class name
  bases__ZN3ccc8CC10x5y9E, 2,
  &(vtc__ZN3ccc8CC10x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y10  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x5y103abcEv
  ~CC10x5y10(); // tgen
  CC10x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y10E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y10E[];
extern void _ZN3ccc9CC10x5y103pqrEv();
extern void _ZN3ccc9CC10x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y103pqrEv,_ZThn4_N3ccc9CC10x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y103abcEv,_ZThn4_N3ccc9CC10x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y103pqrEv,_ZThn4_N3ccc9CC10x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y103abcEv,_ZThn4_N3ccc9CC10x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y10E[];
Class_Descriptor cd__ZN3ccc9CC10x5y10E = {  "_ZN3ccc9CC10x5y10E", // class name
  bases__ZN3ccc9CC10x5y10E, 2,
  &(vtc__ZN3ccc9CC10x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y11  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x5y113efgEv
  ~CC10x5y11(); // tgen
  CC10x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y11E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y11E[];
extern void _ZN3ccc9CC10x5y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y113pqrEv,_ZThn4_N3ccc9CC10x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y113efgEv,_ZThn4_N3ccc9CC10x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y113pqrEv,_ZThn4_N3ccc9CC10x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y113efgEv,_ZThn4_N3ccc9CC10x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y11E[];
Class_Descriptor cd__ZN3ccc9CC10x5y11E = {  "_ZN3ccc9CC10x5y11E", // class name
  bases__ZN3ccc9CC10x5y11E, 2,
  &(vtc__ZN3ccc9CC10x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y12  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC10x5y123abcEv
  ~CC10x5y12(); // tgen
  CC10x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y12E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y123abcEv,_ZThn4_N3ccc9CC10x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y123abcEv,_ZThn4_N3ccc9CC10x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y12E[];
Class_Descriptor cd__ZN3ccc9CC10x5y12E = {  "_ZN3ccc9CC10x5y12E", // class name
  bases__ZN3ccc9CC10x5y12E, 2,
  &(vtc__ZN3ccc9CC10x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y13  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC10x5y133efgEv
  ~CC10x5y13(); // tgen
  CC10x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y13E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y133efgEv,_ZThn4_N3ccc9CC10x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y133efgEv,_ZThn4_N3ccc9CC10x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y13E[];
Class_Descriptor cd__ZN3ccc9CC10x5y13E = {  "_ZN3ccc9CC10x5y13E", // class name
  bases__ZN3ccc9CC10x5y13E, 2,
  &(vtc__ZN3ccc9CC10x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y13E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y14  : ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y143pqrEv
  ~CC10x5y14(); // tgen
  CC10x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y14E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y14E[];
extern void _ZN3ccc9CC10x5y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y143pqrEv,_ZThn4_N3ccc9CC10x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x5y143pqrEv,_ZThn4_N3ccc9CC10x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y14E[];
Class_Descriptor cd__ZN3ccc9CC10x5y14E = {  "_ZN3ccc9CC10x5y14E", // class name
  bases__ZN3ccc9CC10x5y14E, 2,
  &(vtc__ZN3ccc9CC10x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x5y15  : ::ccc::AA10 , ::ccc::BB5 {
  ~CC10x5y15(); // tgen
  CC10x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y15E) C1{ BC2{ 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*), 0, "_ZN3ccc9CC10x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_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,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y15E[];
Class_Descriptor cd__ZN3ccc9CC10x5y15E = {  "_ZN3ccc9CC10x5y15E", // class name
  bases__ZN3ccc9CC10x5y15E, 2,
  &(vtc__ZN3ccc9CC10x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y0  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y03pqrEv
  ~CC10x6y0(); // tgen
  CC10x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y0E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y0E[];
extern void _ZN3ccc8CC10x6y03pqrEv();
extern void _ZN3ccc8CC10x6y03abcEv();
extern void _ZN3ccc8CC10x6y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y03abcEv,_ZThn4_N3ccc8CC10x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y03efgEv,_ZThn4_N3ccc8CC10x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y03abcEv,_ZThn4_N3ccc8CC10x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y03efgEv,_ZThn4_N3ccc8CC10x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y0E[];
Class_Descriptor cd__ZN3ccc8CC10x6y0E = {  "_ZN3ccc8CC10x6y0E", // class name
  bases__ZN3ccc8CC10x6y0E, 2,
  &(vtc__ZN3ccc8CC10x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y1  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x6y13efgEv
  ~CC10x6y1(); // tgen
  CC10x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y1E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y1E[];
extern void _ZN3ccc8CC10x6y13pqrEv();
extern void _ZN3ccc8CC10x6y13abcEv();
extern void _ZN3ccc8CC10x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y13abcEv,_ZThn4_N3ccc8CC10x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y13efgEv,_ZThn4_N3ccc8CC10x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y13abcEv,_ZThn4_N3ccc8CC10x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y13efgEv,_ZThn4_N3ccc8CC10x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y1E[];
Class_Descriptor cd__ZN3ccc8CC10x6y1E = {  "_ZN3ccc8CC10x6y1E", // class name
  bases__ZN3ccc8CC10x6y1E, 2,
  &(vtc__ZN3ccc8CC10x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y2  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y23pqrEv
  ~CC10x6y2(); // tgen
  CC10x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y2E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y2E[];
extern void _ZN3ccc8CC10x6y23pqrEv();
extern void _ZN3ccc8CC10x6y23abcEv();
extern void _ZN3ccc8CC10x6y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y23abcEv,_ZThn4_N3ccc8CC10x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y23efgEv,_ZThn4_N3ccc8CC10x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y23abcEv,_ZThn4_N3ccc8CC10x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y23efgEv,_ZThn4_N3ccc8CC10x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y2E[];
Class_Descriptor cd__ZN3ccc8CC10x6y2E = {  "_ZN3ccc8CC10x6y2E", // class name
  bases__ZN3ccc8CC10x6y2E, 2,
  &(vtc__ZN3ccc8CC10x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y3  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x6y33abcEv
  ~CC10x6y3(); // tgen
  CC10x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y3E) C1{ BC2{ 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*), 0, "_ZN3ccc8CC10x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_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,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y3E[];
extern void _ZN3ccc8CC10x6y33pqrEv();
extern void _ZN3ccc8CC10x6y33abcEv();
extern void _ZN3ccc8CC10x6y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y33abcEv,_ZThn4_N3ccc8CC10x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y33efgEv,_ZThn4_N3ccc8CC10x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y33abcEv,_ZThn4_N3ccc8CC10x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y33efgEv,_ZThn4_N3ccc8CC10x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y3E[];
Class_Descriptor cd__ZN3ccc8CC10x6y3E = {  "_ZN3ccc8CC10x6y3E", // class name
  bases__ZN3ccc8CC10x6y3E, 2,
  &(vtc__ZN3ccc8CC10x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y4  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC10x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x6y43efgEv
  ~CC10x6y4(); // tgen
  CC10x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y4E) C1{ BC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y43pqrEv");}
void  ccc::CC10x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y43abcEv");}
void  ccc::CC10x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y43efgEv");}
ccc::CC10x6y4 ::~CC10x6y4(){ note_dtor("_ZN3ccc8CC10x6y4E", this);} // tgen
ccc::CC10x6y4 ::CC10x6y4(){ note_ctor("_ZN3ccc8CC10x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y4E, buf);
    ::ccc::CC10x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y4E);
    dp->::ccc::CC10x6y4::~CC10x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y4E(Test__ZN3ccc8CC10x6y4E, "_ZN3ccc8CC10x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y4C1Ev();
extern void _ZN3ccc8CC10x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y4E[] = {
  NSPAIR(_ZN3ccc8CC10x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y4D1Ev),
  {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__ZN3ccc8CC10x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y4E[];
extern void _ZN3ccc8CC10x6y43pqrEv();
extern void _ZN3ccc8CC10x6y43abcEv();
extern void _ZN3ccc8CC10x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y43abcEv,_ZThn4_N3ccc8CC10x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y43efgEv,_ZThn4_N3ccc8CC10x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y43abcEv,_ZThn4_N3ccc8CC10x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y43efgEv,_ZThn4_N3ccc8CC10x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y4E[];
Class_Descriptor cd__ZN3ccc8CC10x6y4E = {  "_ZN3ccc8CC10x6y4E", // class name
  bases__ZN3ccc8CC10x6y4E, 2,
  &(vtc__ZN3ccc8CC10x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y5  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC10x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x6y53abcEv
  ~CC10x6y5(); // tgen
  CC10x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y5E) C1{ BC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y53pqrEv");}
void  ccc::CC10x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y53efgEv");}
void  ccc::CC10x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y53abcEv");}
ccc::CC10x6y5 ::~CC10x6y5(){ note_dtor("_ZN3ccc8CC10x6y5E", this);} // tgen
ccc::CC10x6y5 ::CC10x6y5(){ note_ctor("_ZN3ccc8CC10x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y5E, buf);
    ::ccc::CC10x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y5E);
    dp->::ccc::CC10x6y5::~CC10x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y5E(Test__ZN3ccc8CC10x6y5E, "_ZN3ccc8CC10x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y5C1Ev();
extern void _ZN3ccc8CC10x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y5E[] = {
  NSPAIR(_ZN3ccc8CC10x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y5D1Ev),
  {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__ZN3ccc8CC10x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y5E[];
extern void _ZN3ccc8CC10x6y53pqrEv();
extern void _ZN3ccc8CC10x6y53abcEv();
extern void _ZN3ccc8CC10x6y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y53abcEv,_ZThn4_N3ccc8CC10x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y53efgEv,_ZThn4_N3ccc8CC10x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y53abcEv,_ZThn4_N3ccc8CC10x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y53efgEv,_ZThn4_N3ccc8CC10x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y5E[];
Class_Descriptor cd__ZN3ccc8CC10x6y5E = {  "_ZN3ccc8CC10x6y5E", // class name
  bases__ZN3ccc8CC10x6y5E, 2,
  &(vtc__ZN3ccc8CC10x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y6  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x6y63efgEv
  ~CC10x6y6(); // tgen
  CC10x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y6E) C1{ BC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y63abcEv");}
void  ccc::CC10x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y63efgEv");}
ccc::CC10x6y6 ::~CC10x6y6(){ note_dtor("_ZN3ccc8CC10x6y6E", this);} // tgen
ccc::CC10x6y6 ::CC10x6y6(){ note_ctor("_ZN3ccc8CC10x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y6E, buf);
    ::ccc::CC10x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y6E);
    dp->::ccc::CC10x6y6::~CC10x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y6E(Test__ZN3ccc8CC10x6y6E, "_ZN3ccc8CC10x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y6C1Ev();
extern void _ZN3ccc8CC10x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y6E[] = {
  NSPAIR(_ZN3ccc8CC10x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y6D1Ev),
  {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__ZN3ccc8CC10x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x6y63abcEv();
extern void _ZN3ccc8CC10x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y63abcEv,_ZThn4_N3ccc8CC10x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y63efgEv,_ZThn4_N3ccc8CC10x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y63abcEv,_ZThn4_N3ccc8CC10x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y63efgEv,_ZThn4_N3ccc8CC10x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y6E[];
Class_Descriptor cd__ZN3ccc8CC10x6y6E = {  "_ZN3ccc8CC10x6y6E", // class name
  bases__ZN3ccc8CC10x6y6E, 2,
  &(vtc__ZN3ccc8CC10x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y7  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y73pqrEv
  ~CC10x6y7(); // tgen
  CC10x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y7E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y73abcEv");}
void  ccc::CC10x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y73pqrEv");}
ccc::CC10x6y7 ::~CC10x6y7(){ note_dtor("_ZN3ccc8CC10x6y7E", this);} // tgen
ccc::CC10x6y7 ::CC10x6y7(){ note_ctor("_ZN3ccc8CC10x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y7E, buf);
    ::ccc::CC10x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y7E);
    dp->::ccc::CC10x6y7::~CC10x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y7E(Test__ZN3ccc8CC10x6y7E, "_ZN3ccc8CC10x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y7C1Ev();
extern void _ZN3ccc8CC10x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y7E[] = {
  NSPAIR(_ZN3ccc8CC10x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y7D1Ev),
  {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__ZN3ccc8CC10x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y7E[];
extern void _ZN3ccc8CC10x6y73pqrEv();
extern void _ZN3ccc8CC10x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y73abcEv,_ZThn4_N3ccc8CC10x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y73abcEv,_ZThn4_N3ccc8CC10x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y7E[];
Class_Descriptor cd__ZN3ccc8CC10x6y7E = {  "_ZN3ccc8CC10x6y7E", // class name
  bases__ZN3ccc8CC10x6y7E, 2,
  &(vtc__ZN3ccc8CC10x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y8  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x6y83abcEv
  ~CC10x6y8(); // tgen
  CC10x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y8E) C1{ BC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y83efgEv");}
void  ccc::CC10x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y83abcEv");}
ccc::CC10x6y8 ::~CC10x6y8(){ note_dtor("_ZN3ccc8CC10x6y8E", this);} // tgen
ccc::CC10x6y8 ::CC10x6y8(){ note_ctor("_ZN3ccc8CC10x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y8E, buf);
    ::ccc::CC10x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y8E);
    dp->::ccc::CC10x6y8::~CC10x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y8E(Test__ZN3ccc8CC10x6y8E, "_ZN3ccc8CC10x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y8C1Ev();
extern void _ZN3ccc8CC10x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y8E[] = {
  NSPAIR(_ZN3ccc8CC10x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y8D1Ev),
  {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__ZN3ccc8CC10x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x6y83abcEv();
extern void _ZN3ccc8CC10x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y83abcEv,_ZThn4_N3ccc8CC10x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y83efgEv,_ZThn4_N3ccc8CC10x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y83abcEv,_ZThn4_N3ccc8CC10x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y83efgEv,_ZThn4_N3ccc8CC10x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y8E[];
Class_Descriptor cd__ZN3ccc8CC10x6y8E = {  "_ZN3ccc8CC10x6y8E", // class name
  bases__ZN3ccc8CC10x6y8E, 2,
  &(vtc__ZN3ccc8CC10x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y9  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y93pqrEv
  ~CC10x6y9(); // tgen
  CC10x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y9E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y93efgEv");}
void  ccc::CC10x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y93pqrEv");}
ccc::CC10x6y9 ::~CC10x6y9(){ note_dtor("_ZN3ccc8CC10x6y9E", this);} // tgen
ccc::CC10x6y9 ::CC10x6y9(){ note_ctor("_ZN3ccc8CC10x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y9E, buf);
    ::ccc::CC10x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC10x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y9E);
    dp->::ccc::CC10x6y9::~CC10x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y9E(Test__ZN3ccc8CC10x6y9E, "_ZN3ccc8CC10x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y9C1Ev();
extern void _ZN3ccc8CC10x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y9E[] = {
  NSPAIR(_ZN3ccc8CC10x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y9D1Ev),
  {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__ZN3ccc8CC10x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y9E[];
extern void _ZN3ccc8CC10x6y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y93efgEv,_ZThn4_N3ccc8CC10x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x6y93efgEv,_ZThn4_N3ccc8CC10x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y9E[];
Class_Descriptor cd__ZN3ccc8CC10x6y9E = {  "_ZN3ccc8CC10x6y9E", // class name
  bases__ZN3ccc8CC10x6y9E, 2,
  &(vtc__ZN3ccc8CC10x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y10  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC10x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x6y103abcEv
  ~CC10x6y10(); // tgen
  CC10x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y10E) C1{ BC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x6y103pqrEv");}
void  ccc::CC10x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x6y103abcEv");}
ccc::CC10x6y10 ::~CC10x6y10(){ note_dtor("_ZN3ccc9CC10x6y10E", this);} // tgen
ccc::CC10x6y10 ::CC10x6y10(){ note_ctor("_ZN3ccc9CC10x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y10E, buf);
    ::ccc::CC10x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y10E);
    dp->::ccc::CC10x6y10::~CC10x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y10E(Test__ZN3ccc9CC10x6y10E, "_ZN3ccc9CC10x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y10C1Ev();
extern void _ZN3ccc9CC10x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y10E[] = {
  NSPAIR(_ZN3ccc9CC10x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y10D1Ev),
  {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__ZN3ccc9CC10x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y10E[];
extern void _ZN3ccc9CC10x6y103pqrEv();
extern void _ZN3ccc9CC10x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x6y103abcEv,_ZThn4_N3ccc9CC10x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x6y103abcEv,_ZThn4_N3ccc9CC10x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y10E[];
Class_Descriptor cd__ZN3ccc9CC10x6y10E = {  "_ZN3ccc9CC10x6y10E", // class name
  bases__ZN3ccc9CC10x6y10E, 2,
  &(vtc__ZN3ccc9CC10x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y11  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC10x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x6y113efgEv
  ~CC10x6y11(); // tgen
  CC10x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y11E) C1{ BC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x6y113pqrEv");}
void  ccc::CC10x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x6y113efgEv");}
ccc::CC10x6y11 ::~CC10x6y11(){ note_dtor("_ZN3ccc9CC10x6y11E", this);} // tgen
ccc::CC10x6y11 ::CC10x6y11(){ note_ctor("_ZN3ccc9CC10x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y11E, buf);
    ::ccc::CC10x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y11E);
    dp->::ccc::CC10x6y11::~CC10x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y11E(Test__ZN3ccc9CC10x6y11E, "_ZN3ccc9CC10x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y11C1Ev();
extern void _ZN3ccc9CC10x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y11E[] = {
  NSPAIR(_ZN3ccc9CC10x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y11D1Ev),
  {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__ZN3ccc9CC10x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y11E[];
extern void _ZN3ccc9CC10x6y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x6y113efgEv,_ZThn4_N3ccc9CC10x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x6y113efgEv,_ZThn4_N3ccc9CC10x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y11E[];
Class_Descriptor cd__ZN3ccc9CC10x6y11E = {  "_ZN3ccc9CC10x6y11E", // class name
  bases__ZN3ccc9CC10x6y11E, 2,
  &(vtc__ZN3ccc9CC10x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y12  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC10x6y123abcEv
  ~CC10x6y12(); // tgen
  CC10x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y12E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC10x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x6y123abcEv");}
ccc::CC10x6y12 ::~CC10x6y12(){ note_dtor("_ZN3ccc9CC10x6y12E", this);} // tgen
ccc::CC10x6y12 ::CC10x6y12(){ note_ctor("_ZN3ccc9CC10x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y12E, buf);
    ::ccc::CC10x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y12E);
    dp->::ccc::CC10x6y12::~CC10x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y12E(Test__ZN3ccc9CC10x6y12E, "_ZN3ccc9CC10x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y12C1Ev();
extern void _ZN3ccc9CC10x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y12E[] = {
  NSPAIR(_ZN3ccc9CC10x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y12D1Ev),
  {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__ZN3ccc9CC10x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x6y123abcEv,_ZThn4_N3ccc9CC10x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x6y123abcEv,_ZThn4_N3ccc9CC10x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y12E[];
Class_Descriptor cd__ZN3ccc9CC10x6y12E = {  "_ZN3ccc9CC10x6y12E", // class name
  bases__ZN3ccc9CC10x6y12E, 2,
  &(vtc__ZN3ccc9CC10x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y13  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC10x6y133efgEv
  ~CC10x6y13(); // tgen
  CC10x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y13E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x6y133efgEv");}
ccc::CC10x6y13 ::~CC10x6y13(){ note_dtor("_ZN3ccc9CC10x6y13E", this);} // tgen
ccc::CC10x6y13 ::CC10x6y13(){ note_ctor("_ZN3ccc9CC10x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y13E, buf);
    ::ccc::CC10x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y13E);
    dp->::ccc::CC10x6y13::~CC10x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y13E(Test__ZN3ccc9CC10x6y13E, "_ZN3ccc9CC10x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y13C1Ev();
extern void _ZN3ccc9CC10x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y13E[] = {
  NSPAIR(_ZN3ccc9CC10x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y13D1Ev),
  {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__ZN3ccc9CC10x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x6y133efgEv,_ZThn4_N3ccc9CC10x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x6y133efgEv,_ZThn4_N3ccc9CC10x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y13E[];
Class_Descriptor cd__ZN3ccc9CC10x6y13E = {  "_ZN3ccc9CC10x6y13E", // class name
  bases__ZN3ccc9CC10x6y13E, 2,
  &(vtc__ZN3ccc9CC10x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y14  : ::ccc::AA10 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC10x6y143pqrEv
  ~CC10x6y14(); // tgen
  CC10x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y14E) C1{ BC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x6y143pqrEv");}
ccc::CC10x6y14 ::~CC10x6y14(){ note_dtor("_ZN3ccc9CC10x6y14E", this);} // tgen
ccc::CC10x6y14 ::CC10x6y14(){ note_ctor("_ZN3ccc9CC10x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y14E, buf);
    ::ccc::CC10x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y14E);
    dp->::ccc::CC10x6y14::~CC10x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y14E(Test__ZN3ccc9CC10x6y14E, "_ZN3ccc9CC10x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y14C1Ev();
extern void _ZN3ccc9CC10x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y14E[] = {
  NSPAIR(_ZN3ccc9CC10x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y14D1Ev),
  {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__ZN3ccc9CC10x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y14E[];
extern void _ZN3ccc9CC10x6y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y14E[];
Class_Descriptor cd__ZN3ccc9CC10x6y14E = {  "_ZN3ccc9CC10x6y14E", // class name
  bases__ZN3ccc9CC10x6y14E, 2,
  &(vtc__ZN3ccc9CC10x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x6y15  : ::ccc::AA10 , ::ccc::BB6 {
  ~CC10x6y15(); // tgen
  CC10x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x6y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x6y15 ::~CC10x6y15(){ note_dtor("_ZN3ccc9CC10x6y15E", this);} // tgen
ccc::CC10x6y15 ::CC10x6y15(){ note_ctor("_ZN3ccc9CC10x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x6y15E, buf);
    ::ccc::CC10x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x6y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC10x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x6y15E);
    dp->::ccc::CC10x6y15::~CC10x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x6y15E(Test__ZN3ccc9CC10x6y15E, "_ZN3ccc9CC10x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x6y15C1Ev();
extern void _ZN3ccc9CC10x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x6y15E[] = {
  NSPAIR(_ZN3ccc9CC10x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x6y15D1Ev),
  {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__ZN3ccc9CC10x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x6y15E[];
Class_Descriptor cd__ZN3ccc9CC10x6y15E = {  "_ZN3ccc9CC10x6y15E", // class name
  bases__ZN3ccc9CC10x6y15E, 2,
  &(vtc__ZN3ccc9CC10x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y0  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC10x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y03pqrEv
  ~CC10x7y0(); // tgen
  CC10x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y0E) C1{ BC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y03abcEv");}
void  ccc::CC10x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y03efgEv");}
void  ccc::CC10x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y03pqrEv");}
ccc::CC10x7y0 ::~CC10x7y0(){ note_dtor("_ZN3ccc8CC10x7y0E", this);} // tgen
ccc::CC10x7y0 ::CC10x7y0(){ note_ctor("_ZN3ccc8CC10x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y0E, buf);
    ::ccc::CC10x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y0E);
    dp->::ccc::CC10x7y0::~CC10x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y0E(Test__ZN3ccc8CC10x7y0E, "_ZN3ccc8CC10x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y0C1Ev();
extern void _ZN3ccc8CC10x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y0E[] = {
  NSPAIR(_ZN3ccc8CC10x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y0E[];
extern void _ZN3ccc8CC10x7y03pqrEv();
extern void _ZN3ccc8CC10x7y03abcEv();
extern void _ZN3ccc8CC10x7y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y03abcEv,_ZThn4_N3ccc8CC10x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y03pqrEv,_ZThn4_N3ccc8CC10x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y03abcEv,_ZThn4_N3ccc8CC10x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y03pqrEv,_ZThn4_N3ccc8CC10x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y0E[];
Class_Descriptor cd__ZN3ccc8CC10x7y0E = {  "_ZN3ccc8CC10x7y0E", // class name
  bases__ZN3ccc8CC10x7y0E, 2,
  &(vtc__ZN3ccc8CC10x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y1  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC10x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x7y13efgEv
  ~CC10x7y1(); // tgen
  CC10x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y1E) C1{ BC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y13abcEv");}
void  ccc::CC10x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y13pqrEv");}
void  ccc::CC10x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y13efgEv");}
ccc::CC10x7y1 ::~CC10x7y1(){ note_dtor("_ZN3ccc8CC10x7y1E", this);} // tgen
ccc::CC10x7y1 ::CC10x7y1(){ note_ctor("_ZN3ccc8CC10x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y1E, buf);
    ::ccc::CC10x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y1E);
    dp->::ccc::CC10x7y1::~CC10x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y1E(Test__ZN3ccc8CC10x7y1E, "_ZN3ccc8CC10x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y1C1Ev();
extern void _ZN3ccc8CC10x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y1E[] = {
  NSPAIR(_ZN3ccc8CC10x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y1E[];
extern void _ZN3ccc8CC10x7y13pqrEv();
extern void _ZN3ccc8CC10x7y13abcEv();
extern void _ZN3ccc8CC10x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y13abcEv,_ZThn4_N3ccc8CC10x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y13pqrEv,_ZThn4_N3ccc8CC10x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y13abcEv,_ZThn4_N3ccc8CC10x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y13pqrEv,_ZThn4_N3ccc8CC10x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y1E[];
Class_Descriptor cd__ZN3ccc8CC10x7y1E = {  "_ZN3ccc8CC10x7y1E", // class name
  bases__ZN3ccc8CC10x7y1E, 2,
  &(vtc__ZN3ccc8CC10x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y2  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC10x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y23pqrEv
  ~CC10x7y2(); // tgen
  CC10x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y2E) C1{ BC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y23efgEv");}
void  ccc::CC10x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y23abcEv");}
void  ccc::CC10x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y23pqrEv");}
ccc::CC10x7y2 ::~CC10x7y2(){ note_dtor("_ZN3ccc8CC10x7y2E", this);} // tgen
ccc::CC10x7y2 ::CC10x7y2(){ note_ctor("_ZN3ccc8CC10x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y2E, buf);
    ::ccc::CC10x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y2E);
    dp->::ccc::CC10x7y2::~CC10x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y2E(Test__ZN3ccc8CC10x7y2E, "_ZN3ccc8CC10x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y2C1Ev();
extern void _ZN3ccc8CC10x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y2E[] = {
  NSPAIR(_ZN3ccc8CC10x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y2E[];
extern void _ZN3ccc8CC10x7y23pqrEv();
extern void _ZN3ccc8CC10x7y23abcEv();
extern void _ZN3ccc8CC10x7y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y23abcEv,_ZThn4_N3ccc8CC10x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y23pqrEv,_ZThn4_N3ccc8CC10x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y23abcEv,_ZThn4_N3ccc8CC10x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y23pqrEv,_ZThn4_N3ccc8CC10x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y2E[];
Class_Descriptor cd__ZN3ccc8CC10x7y2E = {  "_ZN3ccc8CC10x7y2E", // class name
  bases__ZN3ccc8CC10x7y2E, 2,
  &(vtc__ZN3ccc8CC10x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y3  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC10x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x7y33abcEv
  ~CC10x7y3(); // tgen
  CC10x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y3E) C1{ BC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y33efgEv");}
void  ccc::CC10x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y33pqrEv");}
void  ccc::CC10x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y33abcEv");}
ccc::CC10x7y3 ::~CC10x7y3(){ note_dtor("_ZN3ccc8CC10x7y3E", this);} // tgen
ccc::CC10x7y3 ::CC10x7y3(){ note_ctor("_ZN3ccc8CC10x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y3E, buf);
    ::ccc::CC10x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y3E);
    dp->::ccc::CC10x7y3::~CC10x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y3E(Test__ZN3ccc8CC10x7y3E, "_ZN3ccc8CC10x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y3C1Ev();
extern void _ZN3ccc8CC10x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y3E[] = {
  NSPAIR(_ZN3ccc8CC10x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y3E[];
extern void _ZN3ccc8CC10x7y33pqrEv();
extern void _ZN3ccc8CC10x7y33abcEv();
extern void _ZN3ccc8CC10x7y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y33abcEv,_ZThn4_N3ccc8CC10x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y33pqrEv,_ZThn4_N3ccc8CC10x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y33abcEv,_ZThn4_N3ccc8CC10x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y33pqrEv,_ZThn4_N3ccc8CC10x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y3E[];
Class_Descriptor cd__ZN3ccc8CC10x7y3E = {  "_ZN3ccc8CC10x7y3E", // class name
  bases__ZN3ccc8CC10x7y3E, 2,
  &(vtc__ZN3ccc8CC10x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y4  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC10x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x7y43efgEv
  ~CC10x7y4(); // tgen
  CC10x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y4E) C1{ BC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y43pqrEv");}
void  ccc::CC10x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y43abcEv");}
void  ccc::CC10x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y43efgEv");}
ccc::CC10x7y4 ::~CC10x7y4(){ note_dtor("_ZN3ccc8CC10x7y4E", this);} // tgen
ccc::CC10x7y4 ::CC10x7y4(){ note_ctor("_ZN3ccc8CC10x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y4E, buf);
    ::ccc::CC10x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y4E);
    dp->::ccc::CC10x7y4::~CC10x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y4E(Test__ZN3ccc8CC10x7y4E, "_ZN3ccc8CC10x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y4C1Ev();
extern void _ZN3ccc8CC10x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y4E[] = {
  NSPAIR(_ZN3ccc8CC10x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y4E[];
extern void _ZN3ccc8CC10x7y43pqrEv();
extern void _ZN3ccc8CC10x7y43abcEv();
extern void _ZN3ccc8CC10x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y43abcEv,_ZThn4_N3ccc8CC10x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y43pqrEv,_ZThn4_N3ccc8CC10x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y43abcEv,_ZThn4_N3ccc8CC10x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y43pqrEv,_ZThn4_N3ccc8CC10x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y4E[];
Class_Descriptor cd__ZN3ccc8CC10x7y4E = {  "_ZN3ccc8CC10x7y4E", // class name
  bases__ZN3ccc8CC10x7y4E, 2,
  &(vtc__ZN3ccc8CC10x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y5  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC10x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x7y53abcEv
  ~CC10x7y5(); // tgen
  CC10x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y5E) C1{ BC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y53pqrEv");}
void  ccc::CC10x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y53efgEv");}
void  ccc::CC10x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y53abcEv");}
ccc::CC10x7y5 ::~CC10x7y5(){ note_dtor("_ZN3ccc8CC10x7y5E", this);} // tgen
ccc::CC10x7y5 ::CC10x7y5(){ note_ctor("_ZN3ccc8CC10x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y5E, buf);
    ::ccc::CC10x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y5E);
    dp->::ccc::CC10x7y5::~CC10x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y5E(Test__ZN3ccc8CC10x7y5E, "_ZN3ccc8CC10x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y5C1Ev();
extern void _ZN3ccc8CC10x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y5E[] = {
  NSPAIR(_ZN3ccc8CC10x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y5E[];
extern void _ZN3ccc8CC10x7y53pqrEv();
extern void _ZN3ccc8CC10x7y53abcEv();
extern void _ZN3ccc8CC10x7y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y53abcEv,_ZThn4_N3ccc8CC10x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y53pqrEv,_ZThn4_N3ccc8CC10x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y53abcEv,_ZThn4_N3ccc8CC10x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y53pqrEv,_ZThn4_N3ccc8CC10x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y5E[];
Class_Descriptor cd__ZN3ccc8CC10x7y5E = {  "_ZN3ccc8CC10x7y5E", // class name
  bases__ZN3ccc8CC10x7y5E, 2,
  &(vtc__ZN3ccc8CC10x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y6  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC10x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x7y63efgEv
  ~CC10x7y6(); // tgen
  CC10x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y6E) C1{ BC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y63abcEv");}
void  ccc::CC10x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y63efgEv");}
ccc::CC10x7y6 ::~CC10x7y6(){ note_dtor("_ZN3ccc8CC10x7y6E", this);} // tgen
ccc::CC10x7y6 ::CC10x7y6(){ note_ctor("_ZN3ccc8CC10x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y6E, buf);
    ::ccc::CC10x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y6E);
    dp->::ccc::CC10x7y6::~CC10x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y6E(Test__ZN3ccc8CC10x7y6E, "_ZN3ccc8CC10x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y6C1Ev();
extern void _ZN3ccc8CC10x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y6E[] = {
  NSPAIR(_ZN3ccc8CC10x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x7y63abcEv();
extern void _ZN3ccc8CC10x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y63abcEv,_ZThn4_N3ccc8CC10x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y63abcEv,_ZThn4_N3ccc8CC10x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y6E[];
Class_Descriptor cd__ZN3ccc8CC10x7y6E = {  "_ZN3ccc8CC10x7y6E", // class name
  bases__ZN3ccc8CC10x7y6E, 2,
  &(vtc__ZN3ccc8CC10x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y7  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC10x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y73pqrEv
  ~CC10x7y7(); // tgen
  CC10x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y7E) C1{ BC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y73abcEv");}
void  ccc::CC10x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y73pqrEv");}
ccc::CC10x7y7 ::~CC10x7y7(){ note_dtor("_ZN3ccc8CC10x7y7E", this);} // tgen
ccc::CC10x7y7 ::CC10x7y7(){ note_ctor("_ZN3ccc8CC10x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y7E, buf);
    ::ccc::CC10x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y7E);
    dp->::ccc::CC10x7y7::~CC10x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y7E(Test__ZN3ccc8CC10x7y7E, "_ZN3ccc8CC10x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y7C1Ev();
extern void _ZN3ccc8CC10x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y7E[] = {
  NSPAIR(_ZN3ccc8CC10x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y7E[];
extern void _ZN3ccc8CC10x7y73pqrEv();
extern void _ZN3ccc8CC10x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y73abcEv,_ZThn4_N3ccc8CC10x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y73pqrEv,_ZThn4_N3ccc8CC10x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y73abcEv,_ZThn4_N3ccc8CC10x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y73pqrEv,_ZThn4_N3ccc8CC10x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y7E[];
Class_Descriptor cd__ZN3ccc8CC10x7y7E = {  "_ZN3ccc8CC10x7y7E", // class name
  bases__ZN3ccc8CC10x7y7E, 2,
  &(vtc__ZN3ccc8CC10x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y8  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC10x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x7y83abcEv
  ~CC10x7y8(); // tgen
  CC10x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y8E) C1{ BC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y83efgEv");}
void  ccc::CC10x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x7y83abcEv");}
ccc::CC10x7y8 ::~CC10x7y8(){ note_dtor("_ZN3ccc8CC10x7y8E", this);} // tgen
ccc::CC10x7y8 ::CC10x7y8(){ note_ctor("_ZN3ccc8CC10x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y8E, buf);
    ::ccc::CC10x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y8E);
    dp->::ccc::CC10x7y8::~CC10x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y8E(Test__ZN3ccc8CC10x7y8E, "_ZN3ccc8CC10x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y8C1Ev();
extern void _ZN3ccc8CC10x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y8E[] = {
  NSPAIR(_ZN3ccc8CC10x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x7y83abcEv();
extern void _ZN3ccc8CC10x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y83abcEv,_ZThn4_N3ccc8CC10x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y83abcEv,_ZThn4_N3ccc8CC10x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y8E[];
Class_Descriptor cd__ZN3ccc8CC10x7y8E = {  "_ZN3ccc8CC10x7y8E", // class name
  bases__ZN3ccc8CC10x7y8E, 2,
  &(vtc__ZN3ccc8CC10x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y9  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC10x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x7y93pqrEv
  ~CC10x7y9(); // tgen
  CC10x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x7y9E) C1{ BC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x7y93efgEv");}
void  ccc::CC10x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x7y93pqrEv");}
ccc::CC10x7y9 ::~CC10x7y9(){ note_dtor("_ZN3ccc8CC10x7y9E", this);} // tgen
ccc::CC10x7y9 ::CC10x7y9(){ note_ctor("_ZN3ccc8CC10x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x7y9E, buf);
    ::ccc::CC10x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x7y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC10x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x7y9E);
    dp->::ccc::CC10x7y9::~CC10x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x7y9E(Test__ZN3ccc8CC10x7y9E, "_ZN3ccc8CC10x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x7y9C1Ev();
extern void _ZN3ccc8CC10x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x7y9E[] = {
  NSPAIR(_ZN3ccc8CC10x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC10x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y9E[];
extern void _ZN3ccc8CC10x7y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x7y93pqrEv,_ZThn4_N3ccc8CC10x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x7y93pqrEv,_ZThn4_N3ccc8CC10x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x7y9E[];
Class_Descriptor cd__ZN3ccc8CC10x7y9E = {  "_ZN3ccc8CC10x7y9E", // class name
  bases__ZN3ccc8CC10x7y9E, 2,
  &(vtc__ZN3ccc8CC10x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y10  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC10x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x7y103abcEv
  ~CC10x7y10(); // tgen
  CC10x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y10E) C1{ BC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x7y103pqrEv");}
void  ccc::CC10x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x7y103abcEv");}
ccc::CC10x7y10 ::~CC10x7y10(){ note_dtor("_ZN3ccc9CC10x7y10E", this);} // tgen
ccc::CC10x7y10 ::CC10x7y10(){ note_ctor("_ZN3ccc9CC10x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y10E, buf);
    ::ccc::CC10x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y10E);
    dp->::ccc::CC10x7y10::~CC10x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y10E(Test__ZN3ccc9CC10x7y10E, "_ZN3ccc9CC10x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y10C1Ev();
extern void _ZN3ccc9CC10x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y10E[] = {
  NSPAIR(_ZN3ccc9CC10x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y10E[];
extern void _ZN3ccc9CC10x7y103pqrEv();
extern void _ZN3ccc9CC10x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x7y103abcEv,_ZThn4_N3ccc9CC10x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x7y103pqrEv,_ZThn4_N3ccc9CC10x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x7y103abcEv,_ZThn4_N3ccc9CC10x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x7y103pqrEv,_ZThn4_N3ccc9CC10x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y10E[];
Class_Descriptor cd__ZN3ccc9CC10x7y10E = {  "_ZN3ccc9CC10x7y10E", // class name
  bases__ZN3ccc9CC10x7y10E, 2,
  &(vtc__ZN3ccc9CC10x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y11  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC10x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x7y113efgEv
  ~CC10x7y11(); // tgen
  CC10x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y11E) C1{ BC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x7y113pqrEv");}
void  ccc::CC10x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x7y113efgEv");}
ccc::CC10x7y11 ::~CC10x7y11(){ note_dtor("_ZN3ccc9CC10x7y11E", this);} // tgen
ccc::CC10x7y11 ::CC10x7y11(){ note_ctor("_ZN3ccc9CC10x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y11E, buf);
    ::ccc::CC10x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y11E);
    dp->::ccc::CC10x7y11::~CC10x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y11E(Test__ZN3ccc9CC10x7y11E, "_ZN3ccc9CC10x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y11C1Ev();
extern void _ZN3ccc9CC10x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y11E[] = {
  NSPAIR(_ZN3ccc9CC10x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y11E[];
extern void _ZN3ccc9CC10x7y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x7y113pqrEv,_ZThn4_N3ccc9CC10x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x7y113pqrEv,_ZThn4_N3ccc9CC10x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y11E[];
Class_Descriptor cd__ZN3ccc9CC10x7y11E = {  "_ZN3ccc9CC10x7y11E", // class name
  bases__ZN3ccc9CC10x7y11E, 2,
  &(vtc__ZN3ccc9CC10x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y12  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC10x7y123abcEv
  ~CC10x7y12(); // tgen
  CC10x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y12E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC10x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x7y123abcEv");}
ccc::CC10x7y12 ::~CC10x7y12(){ note_dtor("_ZN3ccc9CC10x7y12E", this);} // tgen
ccc::CC10x7y12 ::CC10x7y12(){ note_ctor("_ZN3ccc9CC10x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y12E, buf);
    ::ccc::CC10x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y12E);
    dp->::ccc::CC10x7y12::~CC10x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y12E(Test__ZN3ccc9CC10x7y12E, "_ZN3ccc9CC10x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y12C1Ev();
extern void _ZN3ccc9CC10x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y12E[] = {
  NSPAIR(_ZN3ccc9CC10x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x7y123abcEv,_ZThn4_N3ccc9CC10x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x7y123abcEv,_ZThn4_N3ccc9CC10x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y12E[];
Class_Descriptor cd__ZN3ccc9CC10x7y12E = {  "_ZN3ccc9CC10x7y12E", // class name
  bases__ZN3ccc9CC10x7y12E, 2,
  &(vtc__ZN3ccc9CC10x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y13  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC10x7y133efgEv
  ~CC10x7y13(); // tgen
  CC10x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y13E) C1{ BC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC10x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x7y133efgEv");}
ccc::CC10x7y13 ::~CC10x7y13(){ note_dtor("_ZN3ccc9CC10x7y13E", this);} // tgen
ccc::CC10x7y13 ::CC10x7y13(){ note_ctor("_ZN3ccc9CC10x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y13E, buf);
    ::ccc::CC10x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y13E);
    dp->::ccc::CC10x7y13::~CC10x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y13E(Test__ZN3ccc9CC10x7y13E, "_ZN3ccc9CC10x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y13C1Ev();
extern void _ZN3ccc9CC10x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y13E[] = {
  NSPAIR(_ZN3ccc9CC10x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y13E[];
Class_Descriptor cd__ZN3ccc9CC10x7y13E = {  "_ZN3ccc9CC10x7y13E", // class name
  bases__ZN3ccc9CC10x7y13E, 2,
  &(vtc__ZN3ccc9CC10x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y14  : ::ccc::AA10 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC10x7y143pqrEv
  ~CC10x7y14(); // tgen
  CC10x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y14E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC10x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x7y143pqrEv");}
ccc::CC10x7y14 ::~CC10x7y14(){ note_dtor("_ZN3ccc9CC10x7y14E", this);} // tgen
ccc::CC10x7y14 ::CC10x7y14(){ note_ctor("_ZN3ccc9CC10x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y14E, buf);
    ::ccc::CC10x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y14E);
    dp->::ccc::CC10x7y14::~CC10x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y14E(Test__ZN3ccc9CC10x7y14E, "_ZN3ccc9CC10x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y14C1Ev();
extern void _ZN3ccc9CC10x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y14E[] = {
  NSPAIR(_ZN3ccc9CC10x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y14E[];
extern void _ZN3ccc9CC10x7y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x7y143pqrEv,_ZThn4_N3ccc9CC10x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x7y143pqrEv,_ZThn4_N3ccc9CC10x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y14E[];
Class_Descriptor cd__ZN3ccc9CC10x7y14E = {  "_ZN3ccc9CC10x7y14E", // class name
  bases__ZN3ccc9CC10x7y14E, 2,
  &(vtc__ZN3ccc9CC10x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x7y15  : ::ccc::AA10 , ::ccc::BB7 {
  ~CC10x7y15(); // tgen
  CC10x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x7y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x7y15 ::~CC10x7y15(){ note_dtor("_ZN3ccc9CC10x7y15E", this);} // tgen
ccc::CC10x7y15 ::CC10x7y15(){ note_ctor("_ZN3ccc9CC10x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x7y15E, buf);
    ::ccc::CC10x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x7y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC10x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x7y15E);
    dp->::ccc::CC10x7y15::~CC10x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x7y15E(Test__ZN3ccc9CC10x7y15E, "_ZN3ccc9CC10x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x7y15C1Ev();
extern void _ZN3ccc9CC10x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x7y15E[] = {
  NSPAIR(_ZN3ccc9CC10x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC10x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x7y15E[];
Class_Descriptor cd__ZN3ccc9CC10x7y15E = {  "_ZN3ccc9CC10x7y15E", // class name
  bases__ZN3ccc9CC10x7y15E, 2,
  &(vtc__ZN3ccc9CC10x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y0  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC10x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y03pqrEv
  ~CC10x8y0(); // tgen
  CC10x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y0E) C1{ BC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y03abcEv");}
void  ccc::CC10x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y03efgEv");}
void  ccc::CC10x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y03pqrEv");}
ccc::CC10x8y0 ::~CC10x8y0(){ note_dtor("_ZN3ccc8CC10x8y0E", this);} // tgen
ccc::CC10x8y0 ::CC10x8y0(){ note_ctor("_ZN3ccc8CC10x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y0E, buf);
    ::ccc::CC10x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y0E);
    dp->::ccc::CC10x8y0::~CC10x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y0E(Test__ZN3ccc8CC10x8y0E, "_ZN3ccc8CC10x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y0C1Ev();
extern void _ZN3ccc8CC10x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y0E[] = {
  NSPAIR(_ZN3ccc8CC10x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y0E[];
extern void _ZN3ccc8CC10x8y03pqrEv();
extern void _ZN3ccc8CC10x8y03abcEv();
extern void _ZN3ccc8CC10x8y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y03efgEv,_ZThn4_N3ccc8CC10x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y03abcEv,_ZThn4_N3ccc8CC10x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y03efgEv,_ZThn4_N3ccc8CC10x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y03abcEv,_ZThn4_N3ccc8CC10x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y0E[];
Class_Descriptor cd__ZN3ccc8CC10x8y0E = {  "_ZN3ccc8CC10x8y0E", // class name
  bases__ZN3ccc8CC10x8y0E, 2,
  &(vtc__ZN3ccc8CC10x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y1  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC10x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x8y13efgEv
  ~CC10x8y1(); // tgen
  CC10x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y1E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y13abcEv");}
void  ccc::CC10x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y13pqrEv");}
void  ccc::CC10x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y13efgEv");}
ccc::CC10x8y1 ::~CC10x8y1(){ note_dtor("_ZN3ccc8CC10x8y1E", this);} // tgen
ccc::CC10x8y1 ::CC10x8y1(){ note_ctor("_ZN3ccc8CC10x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y1E, buf);
    ::ccc::CC10x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y1E);
    dp->::ccc::CC10x8y1::~CC10x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y1E(Test__ZN3ccc8CC10x8y1E, "_ZN3ccc8CC10x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y1C1Ev();
extern void _ZN3ccc8CC10x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y1E[] = {
  NSPAIR(_ZN3ccc8CC10x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y1E[];
extern void _ZN3ccc8CC10x8y13pqrEv();
extern void _ZN3ccc8CC10x8y13abcEv();
extern void _ZN3ccc8CC10x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y13efgEv,_ZThn4_N3ccc8CC10x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y13abcEv,_ZThn4_N3ccc8CC10x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y13efgEv,_ZThn4_N3ccc8CC10x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y13abcEv,_ZThn4_N3ccc8CC10x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y1E[];
Class_Descriptor cd__ZN3ccc8CC10x8y1E = {  "_ZN3ccc8CC10x8y1E", // class name
  bases__ZN3ccc8CC10x8y1E, 2,
  &(vtc__ZN3ccc8CC10x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y2  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC10x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y23pqrEv
  ~CC10x8y2(); // tgen
  CC10x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y2E) C1{ BC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y23efgEv");}
void  ccc::CC10x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y23abcEv");}
void  ccc::CC10x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y23pqrEv");}
ccc::CC10x8y2 ::~CC10x8y2(){ note_dtor("_ZN3ccc8CC10x8y2E", this);} // tgen
ccc::CC10x8y2 ::CC10x8y2(){ note_ctor("_ZN3ccc8CC10x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y2E, buf);
    ::ccc::CC10x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y2E);
    dp->::ccc::CC10x8y2::~CC10x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y2E(Test__ZN3ccc8CC10x8y2E, "_ZN3ccc8CC10x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y2C1Ev();
extern void _ZN3ccc8CC10x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y2E[] = {
  NSPAIR(_ZN3ccc8CC10x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y2E[];
extern void _ZN3ccc8CC10x8y23pqrEv();
extern void _ZN3ccc8CC10x8y23abcEv();
extern void _ZN3ccc8CC10x8y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y23efgEv,_ZThn4_N3ccc8CC10x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y23abcEv,_ZThn4_N3ccc8CC10x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y23efgEv,_ZThn4_N3ccc8CC10x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y23abcEv,_ZThn4_N3ccc8CC10x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y2E[];
Class_Descriptor cd__ZN3ccc8CC10x8y2E = {  "_ZN3ccc8CC10x8y2E", // class name
  bases__ZN3ccc8CC10x8y2E, 2,
  &(vtc__ZN3ccc8CC10x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y3  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC10x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x8y33abcEv
  ~CC10x8y3(); // tgen
  CC10x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y3E) C1{ BC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y33efgEv");}
void  ccc::CC10x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y33pqrEv");}
void  ccc::CC10x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y33abcEv");}
ccc::CC10x8y3 ::~CC10x8y3(){ note_dtor("_ZN3ccc8CC10x8y3E", this);} // tgen
ccc::CC10x8y3 ::CC10x8y3(){ note_ctor("_ZN3ccc8CC10x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y3E, buf);
    ::ccc::CC10x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y3E);
    dp->::ccc::CC10x8y3::~CC10x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y3E(Test__ZN3ccc8CC10x8y3E, "_ZN3ccc8CC10x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y3C1Ev();
extern void _ZN3ccc8CC10x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y3E[] = {
  NSPAIR(_ZN3ccc8CC10x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y3E[];
extern void _ZN3ccc8CC10x8y33pqrEv();
extern void _ZN3ccc8CC10x8y33abcEv();
extern void _ZN3ccc8CC10x8y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y33efgEv,_ZThn4_N3ccc8CC10x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y33abcEv,_ZThn4_N3ccc8CC10x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y33efgEv,_ZThn4_N3ccc8CC10x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y33abcEv,_ZThn4_N3ccc8CC10x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y3E[];
Class_Descriptor cd__ZN3ccc8CC10x8y3E = {  "_ZN3ccc8CC10x8y3E", // class name
  bases__ZN3ccc8CC10x8y3E, 2,
  &(vtc__ZN3ccc8CC10x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y4  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC10x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x8y43efgEv
  ~CC10x8y4(); // tgen
  CC10x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y4E) C1{ BC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y43pqrEv");}
void  ccc::CC10x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y43abcEv");}
void  ccc::CC10x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y43efgEv");}
ccc::CC10x8y4 ::~CC10x8y4(){ note_dtor("_ZN3ccc8CC10x8y4E", this);} // tgen
ccc::CC10x8y4 ::CC10x8y4(){ note_ctor("_ZN3ccc8CC10x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y4E, buf);
    ::ccc::CC10x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y4E);
    dp->::ccc::CC10x8y4::~CC10x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y4E(Test__ZN3ccc8CC10x8y4E, "_ZN3ccc8CC10x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y4C1Ev();
extern void _ZN3ccc8CC10x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y4E[] = {
  NSPAIR(_ZN3ccc8CC10x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y4E[];
extern void _ZN3ccc8CC10x8y43pqrEv();
extern void _ZN3ccc8CC10x8y43abcEv();
extern void _ZN3ccc8CC10x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y43efgEv,_ZThn4_N3ccc8CC10x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y43abcEv,_ZThn4_N3ccc8CC10x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y43efgEv,_ZThn4_N3ccc8CC10x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y43abcEv,_ZThn4_N3ccc8CC10x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y4E[];
Class_Descriptor cd__ZN3ccc8CC10x8y4E = {  "_ZN3ccc8CC10x8y4E", // class name
  bases__ZN3ccc8CC10x8y4E, 2,
  &(vtc__ZN3ccc8CC10x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y5  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC10x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x8y53abcEv
  ~CC10x8y5(); // tgen
  CC10x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y5E) C1{ BC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y53pqrEv");}
void  ccc::CC10x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y53efgEv");}
void  ccc::CC10x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y53abcEv");}
ccc::CC10x8y5 ::~CC10x8y5(){ note_dtor("_ZN3ccc8CC10x8y5E", this);} // tgen
ccc::CC10x8y5 ::CC10x8y5(){ note_ctor("_ZN3ccc8CC10x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y5E, buf);
    ::ccc::CC10x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y5E);
    dp->::ccc::CC10x8y5::~CC10x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y5E(Test__ZN3ccc8CC10x8y5E, "_ZN3ccc8CC10x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y5C1Ev();
extern void _ZN3ccc8CC10x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y5E[] = {
  NSPAIR(_ZN3ccc8CC10x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y5E[];
extern void _ZN3ccc8CC10x8y53pqrEv();
extern void _ZN3ccc8CC10x8y53abcEv();
extern void _ZN3ccc8CC10x8y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y53efgEv,_ZThn4_N3ccc8CC10x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y53abcEv,_ZThn4_N3ccc8CC10x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y53efgEv,_ZThn4_N3ccc8CC10x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y53abcEv,_ZThn4_N3ccc8CC10x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y5E[];
Class_Descriptor cd__ZN3ccc8CC10x8y5E = {  "_ZN3ccc8CC10x8y5E", // class name
  bases__ZN3ccc8CC10x8y5E, 2,
  &(vtc__ZN3ccc8CC10x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y6  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC10x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x8y63efgEv
  ~CC10x8y6(); // tgen
  CC10x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y6E) C1{ BC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y63abcEv");}
void  ccc::CC10x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y63efgEv");}
ccc::CC10x8y6 ::~CC10x8y6(){ note_dtor("_ZN3ccc8CC10x8y6E", this);} // tgen
ccc::CC10x8y6 ::CC10x8y6(){ note_ctor("_ZN3ccc8CC10x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y6E, buf);
    ::ccc::CC10x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y6E);
    dp->::ccc::CC10x8y6::~CC10x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y6E(Test__ZN3ccc8CC10x8y6E, "_ZN3ccc8CC10x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y6C1Ev();
extern void _ZN3ccc8CC10x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y6E[] = {
  NSPAIR(_ZN3ccc8CC10x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x8y63abcEv();
extern void _ZN3ccc8CC10x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y63efgEv,_ZThn4_N3ccc8CC10x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y63abcEv,_ZThn4_N3ccc8CC10x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y63efgEv,_ZThn4_N3ccc8CC10x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y63abcEv,_ZThn4_N3ccc8CC10x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y6E[];
Class_Descriptor cd__ZN3ccc8CC10x8y6E = {  "_ZN3ccc8CC10x8y6E", // class name
  bases__ZN3ccc8CC10x8y6E, 2,
  &(vtc__ZN3ccc8CC10x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y7  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC10x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y73pqrEv
  ~CC10x8y7(); // tgen
  CC10x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y7E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y73abcEv");}
void  ccc::CC10x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y73pqrEv");}
ccc::CC10x8y7 ::~CC10x8y7(){ note_dtor("_ZN3ccc8CC10x8y7E", this);} // tgen
ccc::CC10x8y7 ::CC10x8y7(){ note_ctor("_ZN3ccc8CC10x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y7E, buf);
    ::ccc::CC10x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y7E);
    dp->::ccc::CC10x8y7::~CC10x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y7E(Test__ZN3ccc8CC10x8y7E, "_ZN3ccc8CC10x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y7C1Ev();
extern void _ZN3ccc8CC10x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y7E[] = {
  NSPAIR(_ZN3ccc8CC10x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y7E[];
extern void _ZN3ccc8CC10x8y73pqrEv();
extern void _ZN3ccc8CC10x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y73abcEv,_ZThn4_N3ccc8CC10x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y73abcEv,_ZThn4_N3ccc8CC10x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y7E[];
Class_Descriptor cd__ZN3ccc8CC10x8y7E = {  "_ZN3ccc8CC10x8y7E", // class name
  bases__ZN3ccc8CC10x8y7E, 2,
  &(vtc__ZN3ccc8CC10x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y8  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC10x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x8y83abcEv
  ~CC10x8y8(); // tgen
  CC10x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y8E) C1{ BC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y83efgEv");}
void  ccc::CC10x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x8y83abcEv");}
ccc::CC10x8y8 ::~CC10x8y8(){ note_dtor("_ZN3ccc8CC10x8y8E", this);} // tgen
ccc::CC10x8y8 ::CC10x8y8(){ note_ctor("_ZN3ccc8CC10x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y8E, buf);
    ::ccc::CC10x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y8E);
    dp->::ccc::CC10x8y8::~CC10x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y8E(Test__ZN3ccc8CC10x8y8E, "_ZN3ccc8CC10x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y8C1Ev();
extern void _ZN3ccc8CC10x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y8E[] = {
  NSPAIR(_ZN3ccc8CC10x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x8y83abcEv();
extern void _ZN3ccc8CC10x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y83efgEv,_ZThn4_N3ccc8CC10x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y83abcEv,_ZThn4_N3ccc8CC10x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y83efgEv,_ZThn4_N3ccc8CC10x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y83abcEv,_ZThn4_N3ccc8CC10x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y8E[];
Class_Descriptor cd__ZN3ccc8CC10x8y8E = {  "_ZN3ccc8CC10x8y8E", // class name
  bases__ZN3ccc8CC10x8y8E, 2,
  &(vtc__ZN3ccc8CC10x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y9  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC10x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x8y93pqrEv
  ~CC10x8y9(); // tgen
  CC10x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x8y9E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x8y93efgEv");}
void  ccc::CC10x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x8y93pqrEv");}
ccc::CC10x8y9 ::~CC10x8y9(){ note_dtor("_ZN3ccc8CC10x8y9E", this);} // tgen
ccc::CC10x8y9 ::CC10x8y9(){ note_ctor("_ZN3ccc8CC10x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x8y9E, buf);
    ::ccc::CC10x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x8y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC10x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x8y9E);
    dp->::ccc::CC10x8y9::~CC10x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x8y9E(Test__ZN3ccc8CC10x8y9E, "_ZN3ccc8CC10x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x8y9C1Ev();
extern void _ZN3ccc8CC10x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x8y9E[] = {
  NSPAIR(_ZN3ccc8CC10x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC10x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y9E[];
extern void _ZN3ccc8CC10x8y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x8y93efgEv,_ZThn4_N3ccc8CC10x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x8y93efgEv,_ZThn4_N3ccc8CC10x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x8y9E[];
Class_Descriptor cd__ZN3ccc8CC10x8y9E = {  "_ZN3ccc8CC10x8y9E", // class name
  bases__ZN3ccc8CC10x8y9E, 2,
  &(vtc__ZN3ccc8CC10x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y10  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC10x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x8y103abcEv
  ~CC10x8y10(); // tgen
  CC10x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y10E) C1{ BC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x8y103pqrEv");}
void  ccc::CC10x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x8y103abcEv");}
ccc::CC10x8y10 ::~CC10x8y10(){ note_dtor("_ZN3ccc9CC10x8y10E", this);} // tgen
ccc::CC10x8y10 ::CC10x8y10(){ note_ctor("_ZN3ccc9CC10x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y10E, buf);
    ::ccc::CC10x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y10E);
    dp->::ccc::CC10x8y10::~CC10x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y10E(Test__ZN3ccc9CC10x8y10E, "_ZN3ccc9CC10x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y10C1Ev();
extern void _ZN3ccc9CC10x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y10E[] = {
  NSPAIR(_ZN3ccc9CC10x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y10E[];
extern void _ZN3ccc9CC10x8y103pqrEv();
extern void _ZN3ccc9CC10x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x8y103abcEv,_ZThn4_N3ccc9CC10x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x8y103abcEv,_ZThn4_N3ccc9CC10x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y10E[];
Class_Descriptor cd__ZN3ccc9CC10x8y10E = {  "_ZN3ccc9CC10x8y10E", // class name
  bases__ZN3ccc9CC10x8y10E, 2,
  &(vtc__ZN3ccc9CC10x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y11  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC10x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x8y113efgEv
  ~CC10x8y11(); // tgen
  CC10x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y11E) C1{ BC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x8y113pqrEv");}
void  ccc::CC10x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x8y113efgEv");}
ccc::CC10x8y11 ::~CC10x8y11(){ note_dtor("_ZN3ccc9CC10x8y11E", this);} // tgen
ccc::CC10x8y11 ::CC10x8y11(){ note_ctor("_ZN3ccc9CC10x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y11E, buf);
    ::ccc::CC10x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y11E);
    dp->::ccc::CC10x8y11::~CC10x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y11E(Test__ZN3ccc9CC10x8y11E, "_ZN3ccc9CC10x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y11C1Ev();
extern void _ZN3ccc9CC10x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y11E[] = {
  NSPAIR(_ZN3ccc9CC10x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y11E[];
extern void _ZN3ccc9CC10x8y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x8y113efgEv,_ZThn4_N3ccc9CC10x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x8y113efgEv,_ZThn4_N3ccc9CC10x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y11E[];
Class_Descriptor cd__ZN3ccc9CC10x8y11E = {  "_ZN3ccc9CC10x8y11E", // class name
  bases__ZN3ccc9CC10x8y11E, 2,
  &(vtc__ZN3ccc9CC10x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y12  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC10x8y123abcEv
  ~CC10x8y12(); // tgen
  CC10x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y12E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC10x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x8y123abcEv");}
ccc::CC10x8y12 ::~CC10x8y12(){ note_dtor("_ZN3ccc9CC10x8y12E", this);} // tgen
ccc::CC10x8y12 ::CC10x8y12(){ note_ctor("_ZN3ccc9CC10x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y12E, buf);
    ::ccc::CC10x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y12E);
    dp->::ccc::CC10x8y12::~CC10x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y12E(Test__ZN3ccc9CC10x8y12E, "_ZN3ccc9CC10x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y12C1Ev();
extern void _ZN3ccc9CC10x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y12E[] = {
  NSPAIR(_ZN3ccc9CC10x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x8y123abcEv,_ZThn4_N3ccc9CC10x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x8y123abcEv,_ZThn4_N3ccc9CC10x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y12E[];
Class_Descriptor cd__ZN3ccc9CC10x8y12E = {  "_ZN3ccc9CC10x8y12E", // class name
  bases__ZN3ccc9CC10x8y12E, 2,
  &(vtc__ZN3ccc9CC10x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y13  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC10x8y133efgEv
  ~CC10x8y13(); // tgen
  CC10x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y13E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x8y133efgEv");}
ccc::CC10x8y13 ::~CC10x8y13(){ note_dtor("_ZN3ccc9CC10x8y13E", this);} // tgen
ccc::CC10x8y13 ::CC10x8y13(){ note_ctor("_ZN3ccc9CC10x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y13E, buf);
    ::ccc::CC10x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y13E);
    dp->::ccc::CC10x8y13::~CC10x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y13E(Test__ZN3ccc9CC10x8y13E, "_ZN3ccc9CC10x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y13C1Ev();
extern void _ZN3ccc9CC10x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y13E[] = {
  NSPAIR(_ZN3ccc9CC10x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x8y133efgEv,_ZThn4_N3ccc9CC10x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x8y133efgEv,_ZThn4_N3ccc9CC10x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y13E[];
Class_Descriptor cd__ZN3ccc9CC10x8y13E = {  "_ZN3ccc9CC10x8y13E", // class name
  bases__ZN3ccc9CC10x8y13E, 2,
  &(vtc__ZN3ccc9CC10x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y14  : ::ccc::AA10 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC10x8y143pqrEv
  ~CC10x8y14(); // tgen
  CC10x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y14E) C1{ BC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x8y143pqrEv");}
ccc::CC10x8y14 ::~CC10x8y14(){ note_dtor("_ZN3ccc9CC10x8y14E", this);} // tgen
ccc::CC10x8y14 ::CC10x8y14(){ note_ctor("_ZN3ccc9CC10x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y14E, buf);
    ::ccc::CC10x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y14E);
    dp->::ccc::CC10x8y14::~CC10x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y14E(Test__ZN3ccc9CC10x8y14E, "_ZN3ccc9CC10x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y14C1Ev();
extern void _ZN3ccc9CC10x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y14E[] = {
  NSPAIR(_ZN3ccc9CC10x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y14E[];
extern void _ZN3ccc9CC10x8y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y14E[];
Class_Descriptor cd__ZN3ccc9CC10x8y14E = {  "_ZN3ccc9CC10x8y14E", // class name
  bases__ZN3ccc9CC10x8y14E, 2,
  &(vtc__ZN3ccc9CC10x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x8y15  : ::ccc::AA10 , ::ccc::BB8 {
  ~CC10x8y15(); // tgen
  CC10x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x8y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x8y15 ::~CC10x8y15(){ note_dtor("_ZN3ccc9CC10x8y15E", this);} // tgen
ccc::CC10x8y15 ::CC10x8y15(){ note_ctor("_ZN3ccc9CC10x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x8y15E, buf);
    ::ccc::CC10x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x8y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC10x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x8y15E);
    dp->::ccc::CC10x8y15::~CC10x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x8y15E(Test__ZN3ccc9CC10x8y15E, "_ZN3ccc9CC10x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x8y15C1Ev();
extern void _ZN3ccc9CC10x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x8y15E[] = {
  NSPAIR(_ZN3ccc9CC10x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC10x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x8y15E[];
Class_Descriptor cd__ZN3ccc9CC10x8y15E = {  "_ZN3ccc9CC10x8y15E", // class name
  bases__ZN3ccc9CC10x8y15E, 2,
  &(vtc__ZN3ccc9CC10x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y0  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC10x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y03pqrEv
  ~CC10x9y0(); // tgen
  CC10x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y0E) C1{ BC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y03abcEv");}
void  ccc::CC10x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y03efgEv");}
void  ccc::CC10x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y03pqrEv");}
ccc::CC10x9y0 ::~CC10x9y0(){ note_dtor("_ZN3ccc8CC10x9y0E", this);} // tgen
ccc::CC10x9y0 ::CC10x9y0(){ note_ctor("_ZN3ccc8CC10x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y0E, buf);
    ::ccc::CC10x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y0E);
    dp->::ccc::CC10x9y0::~CC10x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y0E(Test__ZN3ccc8CC10x9y0E, "_ZN3ccc8CC10x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y0C1Ev();
extern void _ZN3ccc8CC10x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y0E[] = {
  NSPAIR(_ZN3ccc8CC10x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y0E[];
extern void _ZN3ccc8CC10x9y03pqrEv();
extern void _ZN3ccc8CC10x9y03abcEv();
extern void _ZN3ccc8CC10x9y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y03efgEv,_ZThn4_N3ccc8CC10x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y03pqrEv,_ZThn4_N3ccc8CC10x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y03efgEv,_ZThn4_N3ccc8CC10x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y03pqrEv,_ZThn4_N3ccc8CC10x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y0E[];
Class_Descriptor cd__ZN3ccc8CC10x9y0E = {  "_ZN3ccc8CC10x9y0E", // class name
  bases__ZN3ccc8CC10x9y0E, 2,
  &(vtc__ZN3ccc8CC10x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y1  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC10x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x9y13efgEv
  ~CC10x9y1(); // tgen
  CC10x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y1E) C1{ BC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y13abcEv");}
void  ccc::CC10x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y13pqrEv");}
void  ccc::CC10x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y13efgEv");}
ccc::CC10x9y1 ::~CC10x9y1(){ note_dtor("_ZN3ccc8CC10x9y1E", this);} // tgen
ccc::CC10x9y1 ::CC10x9y1(){ note_ctor("_ZN3ccc8CC10x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y1E, buf);
    ::ccc::CC10x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y1E);
    dp->::ccc::CC10x9y1::~CC10x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y1E(Test__ZN3ccc8CC10x9y1E, "_ZN3ccc8CC10x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y1C1Ev();
extern void _ZN3ccc8CC10x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y1E[] = {
  NSPAIR(_ZN3ccc8CC10x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y1E[];
extern void _ZN3ccc8CC10x9y13pqrEv();
extern void _ZN3ccc8CC10x9y13abcEv();
extern void _ZN3ccc8CC10x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y13efgEv,_ZThn4_N3ccc8CC10x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y13pqrEv,_ZThn4_N3ccc8CC10x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y13efgEv,_ZThn4_N3ccc8CC10x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y13pqrEv,_ZThn4_N3ccc8CC10x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y1E[];
Class_Descriptor cd__ZN3ccc8CC10x9y1E = {  "_ZN3ccc8CC10x9y1E", // class name
  bases__ZN3ccc8CC10x9y1E, 2,
  &(vtc__ZN3ccc8CC10x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y2  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC10x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y23pqrEv
  ~CC10x9y2(); // tgen
  CC10x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y2E) C1{ BC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y23efgEv");}
void  ccc::CC10x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y23abcEv");}
void  ccc::CC10x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y23pqrEv");}
ccc::CC10x9y2 ::~CC10x9y2(){ note_dtor("_ZN3ccc8CC10x9y2E", this);} // tgen
ccc::CC10x9y2 ::CC10x9y2(){ note_ctor("_ZN3ccc8CC10x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y2E, buf);
    ::ccc::CC10x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y2E);
    dp->::ccc::CC10x9y2::~CC10x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y2E(Test__ZN3ccc8CC10x9y2E, "_ZN3ccc8CC10x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y2C1Ev();
extern void _ZN3ccc8CC10x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y2E[] = {
  NSPAIR(_ZN3ccc8CC10x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y2E[];
extern void _ZN3ccc8CC10x9y23pqrEv();
extern void _ZN3ccc8CC10x9y23abcEv();
extern void _ZN3ccc8CC10x9y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y23efgEv,_ZThn4_N3ccc8CC10x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y23pqrEv,_ZThn4_N3ccc8CC10x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y23efgEv,_ZThn4_N3ccc8CC10x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y23pqrEv,_ZThn4_N3ccc8CC10x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y2E[];
Class_Descriptor cd__ZN3ccc8CC10x9y2E = {  "_ZN3ccc8CC10x9y2E", // class name
  bases__ZN3ccc8CC10x9y2E, 2,
  &(vtc__ZN3ccc8CC10x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y3  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC10x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x9y33abcEv
  ~CC10x9y3(); // tgen
  CC10x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y3E) C1{ BC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y33efgEv");}
void  ccc::CC10x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y33pqrEv");}
void  ccc::CC10x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y33abcEv");}
ccc::CC10x9y3 ::~CC10x9y3(){ note_dtor("_ZN3ccc8CC10x9y3E", this);} // tgen
ccc::CC10x9y3 ::CC10x9y3(){ note_ctor("_ZN3ccc8CC10x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y3E, buf);
    ::ccc::CC10x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y3E);
    dp->::ccc::CC10x9y3::~CC10x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y3E(Test__ZN3ccc8CC10x9y3E, "_ZN3ccc8CC10x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y3C1Ev();
extern void _ZN3ccc8CC10x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y3E[] = {
  NSPAIR(_ZN3ccc8CC10x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y3E[];
extern void _ZN3ccc8CC10x9y33pqrEv();
extern void _ZN3ccc8CC10x9y33abcEv();
extern void _ZN3ccc8CC10x9y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y33efgEv,_ZThn4_N3ccc8CC10x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y33pqrEv,_ZThn4_N3ccc8CC10x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y33efgEv,_ZThn4_N3ccc8CC10x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y33pqrEv,_ZThn4_N3ccc8CC10x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y3E[];
Class_Descriptor cd__ZN3ccc8CC10x9y3E = {  "_ZN3ccc8CC10x9y3E", // class name
  bases__ZN3ccc8CC10x9y3E, 2,
  &(vtc__ZN3ccc8CC10x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y4  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC10x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x9y43efgEv
  ~CC10x9y4(); // tgen
  CC10x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y4E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y43pqrEv");}
void  ccc::CC10x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y43abcEv");}
void  ccc::CC10x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y43efgEv");}
ccc::CC10x9y4 ::~CC10x9y4(){ note_dtor("_ZN3ccc8CC10x9y4E", this);} // tgen
ccc::CC10x9y4 ::CC10x9y4(){ note_ctor("_ZN3ccc8CC10x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y4E, buf);
    ::ccc::CC10x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y4E);
    dp->::ccc::CC10x9y4::~CC10x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y4E(Test__ZN3ccc8CC10x9y4E, "_ZN3ccc8CC10x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y4C1Ev();
extern void _ZN3ccc8CC10x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y4E[] = {
  NSPAIR(_ZN3ccc8CC10x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y4E[];
extern void _ZN3ccc8CC10x9y43pqrEv();
extern void _ZN3ccc8CC10x9y43abcEv();
extern void _ZN3ccc8CC10x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y43efgEv,_ZThn4_N3ccc8CC10x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y43pqrEv,_ZThn4_N3ccc8CC10x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y43efgEv,_ZThn4_N3ccc8CC10x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y43pqrEv,_ZThn4_N3ccc8CC10x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y4E[];
Class_Descriptor cd__ZN3ccc8CC10x9y4E = {  "_ZN3ccc8CC10x9y4E", // class name
  bases__ZN3ccc8CC10x9y4E, 2,
  &(vtc__ZN3ccc8CC10x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y5  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC10x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x9y53abcEv
  ~CC10x9y5(); // tgen
  CC10x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y5E) C1{ BC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y53pqrEv");}
void  ccc::CC10x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y53efgEv");}
void  ccc::CC10x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y53abcEv");}
ccc::CC10x9y5 ::~CC10x9y5(){ note_dtor("_ZN3ccc8CC10x9y5E", this);} // tgen
ccc::CC10x9y5 ::CC10x9y5(){ note_ctor("_ZN3ccc8CC10x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y5E, buf);
    ::ccc::CC10x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y5E);
    dp->::ccc::CC10x9y5::~CC10x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y5E(Test__ZN3ccc8CC10x9y5E, "_ZN3ccc8CC10x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y5C1Ev();
extern void _ZN3ccc8CC10x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y5E[] = {
  NSPAIR(_ZN3ccc8CC10x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y5E[];
extern void _ZN3ccc8CC10x9y53pqrEv();
extern void _ZN3ccc8CC10x9y53abcEv();
extern void _ZN3ccc8CC10x9y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y53efgEv,_ZThn4_N3ccc8CC10x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y53pqrEv,_ZThn4_N3ccc8CC10x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y53efgEv,_ZThn4_N3ccc8CC10x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y53pqrEv,_ZThn4_N3ccc8CC10x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y5E[];
Class_Descriptor cd__ZN3ccc8CC10x9y5E = {  "_ZN3ccc8CC10x9y5E", // class name
  bases__ZN3ccc8CC10x9y5E, 2,
  &(vtc__ZN3ccc8CC10x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y6  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC10x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x9y63efgEv
  ~CC10x9y6(); // tgen
  CC10x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y6E) C1{ BC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y63abcEv");}
void  ccc::CC10x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y63efgEv");}
ccc::CC10x9y6 ::~CC10x9y6(){ note_dtor("_ZN3ccc8CC10x9y6E", this);} // tgen
ccc::CC10x9y6 ::CC10x9y6(){ note_ctor("_ZN3ccc8CC10x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y6E, buf);
    ::ccc::CC10x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y6E);
    dp->::ccc::CC10x9y6::~CC10x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y6E(Test__ZN3ccc8CC10x9y6E, "_ZN3ccc8CC10x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y6C1Ev();
extern void _ZN3ccc8CC10x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y6E[] = {
  NSPAIR(_ZN3ccc8CC10x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x9y63abcEv();
extern void _ZN3ccc8CC10x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y63efgEv,_ZThn4_N3ccc8CC10x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y63efgEv,_ZThn4_N3ccc8CC10x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y6E[];
Class_Descriptor cd__ZN3ccc8CC10x9y6E = {  "_ZN3ccc8CC10x9y6E", // class name
  bases__ZN3ccc8CC10x9y6E, 2,
  &(vtc__ZN3ccc8CC10x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y7  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC10x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y73pqrEv
  ~CC10x9y7(); // tgen
  CC10x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y7E) C1{ BC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y73abcEv");}
void  ccc::CC10x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y73pqrEv");}
ccc::CC10x9y7 ::~CC10x9y7(){ note_dtor("_ZN3ccc8CC10x9y7E", this);} // tgen
ccc::CC10x9y7 ::CC10x9y7(){ note_ctor("_ZN3ccc8CC10x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y7E, buf);
    ::ccc::CC10x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y7E);
    dp->::ccc::CC10x9y7::~CC10x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y7E(Test__ZN3ccc8CC10x9y7E, "_ZN3ccc8CC10x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y7C1Ev();
extern void _ZN3ccc8CC10x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y7E[] = {
  NSPAIR(_ZN3ccc8CC10x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y7E[];
extern void _ZN3ccc8CC10x9y73pqrEv();
extern void _ZN3ccc8CC10x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y73pqrEv,_ZThn4_N3ccc8CC10x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y73pqrEv,_ZThn4_N3ccc8CC10x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y7E[];
Class_Descriptor cd__ZN3ccc8CC10x9y7E = {  "_ZN3ccc8CC10x9y7E", // class name
  bases__ZN3ccc8CC10x9y7E, 2,
  &(vtc__ZN3ccc8CC10x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y8  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC10x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x9y83abcEv
  ~CC10x9y8(); // tgen
  CC10x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y8E) C1{ BC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y83efgEv");}
void  ccc::CC10x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x9y83abcEv");}
ccc::CC10x9y8 ::~CC10x9y8(){ note_dtor("_ZN3ccc8CC10x9y8E", this);} // tgen
ccc::CC10x9y8 ::CC10x9y8(){ note_ctor("_ZN3ccc8CC10x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y8E, buf);
    ::ccc::CC10x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y8E);
    dp->::ccc::CC10x9y8::~CC10x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y8E(Test__ZN3ccc8CC10x9y8E, "_ZN3ccc8CC10x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y8C1Ev();
extern void _ZN3ccc8CC10x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y8E[] = {
  NSPAIR(_ZN3ccc8CC10x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8CC10x9y83abcEv();
extern void _ZN3ccc8CC10x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y83efgEv,_ZThn4_N3ccc8CC10x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y83efgEv,_ZThn4_N3ccc8CC10x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y8E[];
Class_Descriptor cd__ZN3ccc8CC10x9y8E = {  "_ZN3ccc8CC10x9y8E", // class name
  bases__ZN3ccc8CC10x9y8E, 2,
  &(vtc__ZN3ccc8CC10x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y9  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC10x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x9y93pqrEv
  ~CC10x9y9(); // tgen
  CC10x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x9y9E) C1{ BC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x9y93efgEv");}
void  ccc::CC10x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x9y93pqrEv");}
ccc::CC10x9y9 ::~CC10x9y9(){ note_dtor("_ZN3ccc8CC10x9y9E", this);} // tgen
ccc::CC10x9y9 ::CC10x9y9(){ note_ctor("_ZN3ccc8CC10x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x9y9E, buf);
    ::ccc::CC10x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x9y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8CC10x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC10x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x9y9E);
    dp->::ccc::CC10x9y9::~CC10x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x9y9E(Test__ZN3ccc8CC10x9y9E, "_ZN3ccc8CC10x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x9y9C1Ev();
extern void _ZN3ccc8CC10x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x9y9E[] = {
  NSPAIR(_ZN3ccc8CC10x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC10x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y9E[];
extern void _ZN3ccc8CC10x9y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8CC10x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y93efgEv,_ZThn4_N3ccc8CC10x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x9y93pqrEv,_ZThn4_N3ccc8CC10x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y93efgEv,_ZThn4_N3ccc8CC10x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC10x9y93pqrEv,_ZThn4_N3ccc8CC10x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x9y9E[];
Class_Descriptor cd__ZN3ccc8CC10x9y9E = {  "_ZN3ccc8CC10x9y9E", // class name
  bases__ZN3ccc8CC10x9y9E, 2,
  &(vtc__ZN3ccc8CC10x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y10  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC10x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x9y103abcEv
  ~CC10x9y10(); // tgen
  CC10x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y10E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x9y103pqrEv");}
void  ccc::CC10x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x9y103abcEv");}
ccc::CC10x9y10 ::~CC10x9y10(){ note_dtor("_ZN3ccc9CC10x9y10E", this);} // tgen
ccc::CC10x9y10 ::CC10x9y10(){ note_ctor("_ZN3ccc9CC10x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y10E, buf);
    ::ccc::CC10x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y10E);
    dp->::ccc::CC10x9y10::~CC10x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y10E(Test__ZN3ccc9CC10x9y10E, "_ZN3ccc9CC10x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y10C1Ev();
extern void _ZN3ccc9CC10x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y10E[] = {
  NSPAIR(_ZN3ccc9CC10x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y10E[];
extern void _ZN3ccc9CC10x9y103pqrEv();
extern void _ZN3ccc9CC10x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x9y103pqrEv,_ZThn4_N3ccc9CC10x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x9y103pqrEv,_ZThn4_N3ccc9CC10x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y10E[];
Class_Descriptor cd__ZN3ccc9CC10x9y10E = {  "_ZN3ccc9CC10x9y10E", // class name
  bases__ZN3ccc9CC10x9y10E, 2,
  &(vtc__ZN3ccc9CC10x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y11  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC10x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x9y113efgEv
  ~CC10x9y11(); // tgen
  CC10x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y11E) C1{ BC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x9y113pqrEv");}
void  ccc::CC10x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x9y113efgEv");}
ccc::CC10x9y11 ::~CC10x9y11(){ note_dtor("_ZN3ccc9CC10x9y11E", this);} // tgen
ccc::CC10x9y11 ::CC10x9y11(){ note_ctor("_ZN3ccc9CC10x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y11E, buf);
    ::ccc::CC10x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y11E);
    dp->::ccc::CC10x9y11::~CC10x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y11E(Test__ZN3ccc9CC10x9y11E, "_ZN3ccc9CC10x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y11C1Ev();
extern void _ZN3ccc9CC10x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y11E[] = {
  NSPAIR(_ZN3ccc9CC10x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y11E[];
extern void _ZN3ccc9CC10x9y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x9y113efgEv,_ZThn4_N3ccc9CC10x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x9y113pqrEv,_ZThn4_N3ccc9CC10x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x9y113efgEv,_ZThn4_N3ccc9CC10x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x9y113pqrEv,_ZThn4_N3ccc9CC10x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y11E[];
Class_Descriptor cd__ZN3ccc9CC10x9y11E = {  "_ZN3ccc9CC10x9y11E", // class name
  bases__ZN3ccc9CC10x9y11E, 2,
  &(vtc__ZN3ccc9CC10x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y12  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC10x9y123abcEv
  ~CC10x9y12(); // tgen
  CC10x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y12E) C1{ BC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x9y123abcEv");}
ccc::CC10x9y12 ::~CC10x9y12(){ note_dtor("_ZN3ccc9CC10x9y12E", this);} // tgen
ccc::CC10x9y12 ::CC10x9y12(){ note_ctor("_ZN3ccc9CC10x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y12E, buf);
    ::ccc::CC10x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y12E);
    dp->::ccc::CC10x9y12::~CC10x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y12E(Test__ZN3ccc9CC10x9y12E, "_ZN3ccc9CC10x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y12C1Ev();
extern void _ZN3ccc9CC10x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y12E[] = {
  NSPAIR(_ZN3ccc9CC10x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y12E[];
Class_Descriptor cd__ZN3ccc9CC10x9y12E = {  "_ZN3ccc9CC10x9y12E", // class name
  bases__ZN3ccc9CC10x9y12E, 2,
  &(vtc__ZN3ccc9CC10x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y13  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC10x9y133efgEv
  ~CC10x9y13(); // tgen
  CC10x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y13E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x9y133efgEv");}
ccc::CC10x9y13 ::~CC10x9y13(){ note_dtor("_ZN3ccc9CC10x9y13E", this);} // tgen
ccc::CC10x9y13 ::CC10x9y13(){ note_ctor("_ZN3ccc9CC10x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y13E, buf);
    ::ccc::CC10x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y13E);
    dp->::ccc::CC10x9y13::~CC10x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y13E(Test__ZN3ccc9CC10x9y13E, "_ZN3ccc9CC10x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y13C1Ev();
extern void _ZN3ccc9CC10x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y13E[] = {
  NSPAIR(_ZN3ccc9CC10x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x9y133efgEv,_ZThn4_N3ccc9CC10x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x9y133efgEv,_ZThn4_N3ccc9CC10x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y13E[];
Class_Descriptor cd__ZN3ccc9CC10x9y13E = {  "_ZN3ccc9CC10x9y13E", // class name
  bases__ZN3ccc9CC10x9y13E, 2,
  &(vtc__ZN3ccc9CC10x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y14  : ::ccc::AA10 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC10x9y143pqrEv
  ~CC10x9y14(); // tgen
  CC10x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y14E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC10x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x9y143pqrEv");}
ccc::CC10x9y14 ::~CC10x9y14(){ note_dtor("_ZN3ccc9CC10x9y14E", this);} // tgen
ccc::CC10x9y14 ::CC10x9y14(){ note_ctor("_ZN3ccc9CC10x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y14E, buf);
    ::ccc::CC10x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y14E);
    dp->::ccc::CC10x9y14::~CC10x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y14E(Test__ZN3ccc9CC10x9y14E, "_ZN3ccc9CC10x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y14C1Ev();
extern void _ZN3ccc9CC10x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y14E[] = {
  NSPAIR(_ZN3ccc9CC10x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y14E[];
extern void _ZN3ccc9CC10x9y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x9y143pqrEv,_ZThn4_N3ccc9CC10x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x9y143pqrEv,_ZThn4_N3ccc9CC10x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y14E[];
Class_Descriptor cd__ZN3ccc9CC10x9y14E = {  "_ZN3ccc9CC10x9y14E", // class name
  bases__ZN3ccc9CC10x9y14E, 2,
  &(vtc__ZN3ccc9CC10x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x9y15  : ::ccc::AA10 , ::ccc::BB9 {
  ~CC10x9y15(); // tgen
  CC10x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x9y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x9y15 ::~CC10x9y15(){ note_dtor("_ZN3ccc9CC10x9y15E", this);} // tgen
ccc::CC10x9y15 ::CC10x9y15(){ note_ctor("_ZN3ccc9CC10x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x9y15E, buf);
    ::ccc::CC10x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x9y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC10x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x9y15E);
    dp->::ccc::CC10x9y15::~CC10x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x9y15E(Test__ZN3ccc9CC10x9y15E, "_ZN3ccc9CC10x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x9y15C1Ev();
extern void _ZN3ccc9CC10x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x9y15E[] = {
  NSPAIR(_ZN3ccc9CC10x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC10x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x9y15E[];
Class_Descriptor cd__ZN3ccc9CC10x9y15E = {  "_ZN3ccc9CC10x9y15E", // class name
  bases__ZN3ccc9CC10x9y15E, 2,
  &(vtc__ZN3ccc9CC10x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y0  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC10x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y03pqrEv
  ~CC10x10y0(); // tgen
  CC10x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y0E) C1{ BC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y03abcEv");}
void  ccc::CC10x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y03efgEv");}
void  ccc::CC10x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y03pqrEv");}
ccc::CC10x10y0 ::~CC10x10y0(){ note_dtor("_ZN3ccc9CC10x10y0E", this);} // tgen
ccc::CC10x10y0 ::CC10x10y0(){ note_ctor("_ZN3ccc9CC10x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y0E, buf);
    ::ccc::CC10x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y0E);
    dp->::ccc::CC10x10y0::~CC10x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y0E(Test__ZN3ccc9CC10x10y0E, "_ZN3ccc9CC10x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y0C1Ev();
extern void _ZN3ccc9CC10x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y0E[] = {
  NSPAIR(_ZN3ccc9CC10x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y0E[];
extern void _ZN3ccc9CC10x10y03pqrEv();
extern void _ZN3ccc9CC10x10y03abcEv();
extern void _ZN3ccc9CC10x10y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y03pqrEv,_ZThn4_N3ccc9CC10x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y03abcEv,_ZThn4_N3ccc9CC10x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y03pqrEv,_ZThn4_N3ccc9CC10x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y03abcEv,_ZThn4_N3ccc9CC10x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y0E[];
Class_Descriptor cd__ZN3ccc9CC10x10y0E = {  "_ZN3ccc9CC10x10y0E", // class name
  bases__ZN3ccc9CC10x10y0E, 2,
  &(vtc__ZN3ccc9CC10x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y1  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC10x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x10y13efgEv
  ~CC10x10y1(); // tgen
  CC10x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y1E) C1{ BC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y13abcEv");}
void  ccc::CC10x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y13pqrEv");}
void  ccc::CC10x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y13efgEv");}
ccc::CC10x10y1 ::~CC10x10y1(){ note_dtor("_ZN3ccc9CC10x10y1E", this);} // tgen
ccc::CC10x10y1 ::CC10x10y1(){ note_ctor("_ZN3ccc9CC10x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y1E, buf);
    ::ccc::CC10x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y1E);
    dp->::ccc::CC10x10y1::~CC10x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y1E(Test__ZN3ccc9CC10x10y1E, "_ZN3ccc9CC10x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y1C1Ev();
extern void _ZN3ccc9CC10x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y1E[] = {
  NSPAIR(_ZN3ccc9CC10x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y1E[];
extern void _ZN3ccc9CC10x10y13pqrEv();
extern void _ZN3ccc9CC10x10y13abcEv();
extern void _ZN3ccc9CC10x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y13pqrEv,_ZThn4_N3ccc9CC10x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y13abcEv,_ZThn4_N3ccc9CC10x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y13pqrEv,_ZThn4_N3ccc9CC10x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y13abcEv,_ZThn4_N3ccc9CC10x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y1E[];
Class_Descriptor cd__ZN3ccc9CC10x10y1E = {  "_ZN3ccc9CC10x10y1E", // class name
  bases__ZN3ccc9CC10x10y1E, 2,
  &(vtc__ZN3ccc9CC10x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y2  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC10x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y23pqrEv
  ~CC10x10y2(); // tgen
  CC10x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y2E) C1{ BC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y23efgEv");}
void  ccc::CC10x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y23abcEv");}
void  ccc::CC10x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y23pqrEv");}
ccc::CC10x10y2 ::~CC10x10y2(){ note_dtor("_ZN3ccc9CC10x10y2E", this);} // tgen
ccc::CC10x10y2 ::CC10x10y2(){ note_ctor("_ZN3ccc9CC10x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y2E, buf);
    ::ccc::CC10x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y2E);
    dp->::ccc::CC10x10y2::~CC10x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y2E(Test__ZN3ccc9CC10x10y2E, "_ZN3ccc9CC10x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y2C1Ev();
extern void _ZN3ccc9CC10x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y2E[] = {
  NSPAIR(_ZN3ccc9CC10x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y2E[];
extern void _ZN3ccc9CC10x10y23pqrEv();
extern void _ZN3ccc9CC10x10y23abcEv();
extern void _ZN3ccc9CC10x10y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y23pqrEv,_ZThn4_N3ccc9CC10x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y23abcEv,_ZThn4_N3ccc9CC10x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y23pqrEv,_ZThn4_N3ccc9CC10x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y23abcEv,_ZThn4_N3ccc9CC10x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y2E[];
Class_Descriptor cd__ZN3ccc9CC10x10y2E = {  "_ZN3ccc9CC10x10y2E", // class name
  bases__ZN3ccc9CC10x10y2E, 2,
  &(vtc__ZN3ccc9CC10x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y3  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC10x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x10y33abcEv
  ~CC10x10y3(); // tgen
  CC10x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y3E) C1{ BC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y33efgEv");}
void  ccc::CC10x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y33pqrEv");}
void  ccc::CC10x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y33abcEv");}
ccc::CC10x10y3 ::~CC10x10y3(){ note_dtor("_ZN3ccc9CC10x10y3E", this);} // tgen
ccc::CC10x10y3 ::CC10x10y3(){ note_ctor("_ZN3ccc9CC10x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y3E, buf);
    ::ccc::CC10x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y3E);
    dp->::ccc::CC10x10y3::~CC10x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y3E(Test__ZN3ccc9CC10x10y3E, "_ZN3ccc9CC10x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y3C1Ev();
extern void _ZN3ccc9CC10x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y3E[] = {
  NSPAIR(_ZN3ccc9CC10x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y3E[];
extern void _ZN3ccc9CC10x10y33pqrEv();
extern void _ZN3ccc9CC10x10y33abcEv();
extern void _ZN3ccc9CC10x10y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y33pqrEv,_ZThn4_N3ccc9CC10x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y33abcEv,_ZThn4_N3ccc9CC10x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y33pqrEv,_ZThn4_N3ccc9CC10x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y33abcEv,_ZThn4_N3ccc9CC10x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y3E[];
Class_Descriptor cd__ZN3ccc9CC10x10y3E = {  "_ZN3ccc9CC10x10y3E", // class name
  bases__ZN3ccc9CC10x10y3E, 2,
  &(vtc__ZN3ccc9CC10x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y4  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC10x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x10y43efgEv
  ~CC10x10y4(); // tgen
  CC10x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y4E) C1{ BC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y43pqrEv");}
void  ccc::CC10x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y43abcEv");}
void  ccc::CC10x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y43efgEv");}
ccc::CC10x10y4 ::~CC10x10y4(){ note_dtor("_ZN3ccc9CC10x10y4E", this);} // tgen
ccc::CC10x10y4 ::CC10x10y4(){ note_ctor("_ZN3ccc9CC10x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y4E, buf);
    ::ccc::CC10x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y4E);
    dp->::ccc::CC10x10y4::~CC10x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y4E(Test__ZN3ccc9CC10x10y4E, "_ZN3ccc9CC10x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y4C1Ev();
extern void _ZN3ccc9CC10x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y4E[] = {
  NSPAIR(_ZN3ccc9CC10x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y4E[];
extern void _ZN3ccc9CC10x10y43pqrEv();
extern void _ZN3ccc9CC10x10y43abcEv();
extern void _ZN3ccc9CC10x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y43pqrEv,_ZThn4_N3ccc9CC10x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y43abcEv,_ZThn4_N3ccc9CC10x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y43pqrEv,_ZThn4_N3ccc9CC10x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y43abcEv,_ZThn4_N3ccc9CC10x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y4E[];
Class_Descriptor cd__ZN3ccc9CC10x10y4E = {  "_ZN3ccc9CC10x10y4E", // class name
  bases__ZN3ccc9CC10x10y4E, 2,
  &(vtc__ZN3ccc9CC10x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y5  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC10x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x10y53abcEv
  ~CC10x10y5(); // tgen
  CC10x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y5E) C1{ BC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y53pqrEv");}
void  ccc::CC10x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y53efgEv");}
void  ccc::CC10x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y53abcEv");}
ccc::CC10x10y5 ::~CC10x10y5(){ note_dtor("_ZN3ccc9CC10x10y5E", this);} // tgen
ccc::CC10x10y5 ::CC10x10y5(){ note_ctor("_ZN3ccc9CC10x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y5E, buf);
    ::ccc::CC10x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y5E);
    dp->::ccc::CC10x10y5::~CC10x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y5E(Test__ZN3ccc9CC10x10y5E, "_ZN3ccc9CC10x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y5C1Ev();
extern void _ZN3ccc9CC10x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y5E[] = {
  NSPAIR(_ZN3ccc9CC10x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y5E[];
extern void _ZN3ccc9CC10x10y53pqrEv();
extern void _ZN3ccc9CC10x10y53abcEv();
extern void _ZN3ccc9CC10x10y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y53pqrEv,_ZThn4_N3ccc9CC10x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y53abcEv,_ZThn4_N3ccc9CC10x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y53pqrEv,_ZThn4_N3ccc9CC10x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y53abcEv,_ZThn4_N3ccc9CC10x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y5E[];
Class_Descriptor cd__ZN3ccc9CC10x10y5E = {  "_ZN3ccc9CC10x10y5E", // class name
  bases__ZN3ccc9CC10x10y5E, 2,
  &(vtc__ZN3ccc9CC10x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y6  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC10x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x10y63efgEv
  ~CC10x10y6(); // tgen
  CC10x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y6E) C1{ BC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y63abcEv");}
void  ccc::CC10x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y63efgEv");}
ccc::CC10x10y6 ::~CC10x10y6(){ note_dtor("_ZN3ccc9CC10x10y6E", this);} // tgen
ccc::CC10x10y6 ::CC10x10y6(){ note_ctor("_ZN3ccc9CC10x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y6E, buf);
    ::ccc::CC10x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y6E);
    dp->::ccc::CC10x10y6::~CC10x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y6E(Test__ZN3ccc9CC10x10y6E, "_ZN3ccc9CC10x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y6C1Ev();
extern void _ZN3ccc9CC10x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y6E[] = {
  NSPAIR(_ZN3ccc9CC10x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x10y63abcEv();
extern void _ZN3ccc9CC10x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y63abcEv,_ZThn4_N3ccc9CC10x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y63abcEv,_ZThn4_N3ccc9CC10x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y6E[];
Class_Descriptor cd__ZN3ccc9CC10x10y6E = {  "_ZN3ccc9CC10x10y6E", // class name
  bases__ZN3ccc9CC10x10y6E, 2,
  &(vtc__ZN3ccc9CC10x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y7  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC10x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y73pqrEv
  ~CC10x10y7(); // tgen
  CC10x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y7E) C1{ BC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y73abcEv");}
void  ccc::CC10x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y73pqrEv");}
ccc::CC10x10y7 ::~CC10x10y7(){ note_dtor("_ZN3ccc9CC10x10y7E", this);} // tgen
ccc::CC10x10y7 ::CC10x10y7(){ note_ctor("_ZN3ccc9CC10x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y7E, buf);
    ::ccc::CC10x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y7E);
    dp->::ccc::CC10x10y7::~CC10x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y7E(Test__ZN3ccc9CC10x10y7E, "_ZN3ccc9CC10x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y7C1Ev();
extern void _ZN3ccc9CC10x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y7E[] = {
  NSPAIR(_ZN3ccc9CC10x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y7E[];
extern void _ZN3ccc9CC10x10y73pqrEv();
extern void _ZN3ccc9CC10x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y73pqrEv,_ZThn4_N3ccc9CC10x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y73abcEv,_ZThn4_N3ccc9CC10x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y73pqrEv,_ZThn4_N3ccc9CC10x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y73abcEv,_ZThn4_N3ccc9CC10x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y7E[];
Class_Descriptor cd__ZN3ccc9CC10x10y7E = {  "_ZN3ccc9CC10x10y7E", // class name
  bases__ZN3ccc9CC10x10y7E, 2,
  &(vtc__ZN3ccc9CC10x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y8  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC10x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x10y83abcEv
  ~CC10x10y8(); // tgen
  CC10x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y8E) C1{ BC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y83efgEv");}
void  ccc::CC10x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x10y83abcEv");}
ccc::CC10x10y8 ::~CC10x10y8(){ note_dtor("_ZN3ccc9CC10x10y8E", this);} // tgen
ccc::CC10x10y8 ::CC10x10y8(){ note_ctor("_ZN3ccc9CC10x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y8E, buf);
    ::ccc::CC10x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y8E);
    dp->::ccc::CC10x10y8::~CC10x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y8E(Test__ZN3ccc9CC10x10y8E, "_ZN3ccc9CC10x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y8C1Ev();
extern void _ZN3ccc9CC10x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y8E[] = {
  NSPAIR(_ZN3ccc9CC10x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x10y83abcEv();
extern void _ZN3ccc9CC10x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y83abcEv,_ZThn4_N3ccc9CC10x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y83abcEv,_ZThn4_N3ccc9CC10x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y8E[];
Class_Descriptor cd__ZN3ccc9CC10x10y8E = {  "_ZN3ccc9CC10x10y8E", // class name
  bases__ZN3ccc9CC10x10y8E, 2,
  &(vtc__ZN3ccc9CC10x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y9  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC10x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x10y93pqrEv
  ~CC10x10y9(); // tgen
  CC10x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x10y9E) C1{ BC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x10y93efgEv");}
void  ccc::CC10x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x10y93pqrEv");}
ccc::CC10x10y9 ::~CC10x10y9(){ note_dtor("_ZN3ccc9CC10x10y9E", this);} // tgen
ccc::CC10x10y9 ::CC10x10y9(){ note_ctor("_ZN3ccc9CC10x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x10y9E, buf);
    ::ccc::CC10x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x10y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC10x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x10y9E);
    dp->::ccc::CC10x10y9::~CC10x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x10y9E(Test__ZN3ccc9CC10x10y9E, "_ZN3ccc9CC10x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x10y9C1Ev();
extern void _ZN3ccc9CC10x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x10y9E[] = {
  NSPAIR(_ZN3ccc9CC10x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC10x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y9E[];
extern void _ZN3ccc9CC10x10y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x10y93pqrEv,_ZThn4_N3ccc9CC10x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x10y93pqrEv,_ZThn4_N3ccc9CC10x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x10y9E[];
Class_Descriptor cd__ZN3ccc9CC10x10y9E = {  "_ZN3ccc9CC10x10y9E", // class name
  bases__ZN3ccc9CC10x10y9E, 2,
  &(vtc__ZN3ccc9CC10x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y10  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC10x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x10y103abcEv
  ~CC10x10y10(); // tgen
  CC10x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y10E) C1{ BC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x10y103pqrEv");}
void  ccc::CC10x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x10y103abcEv");}
ccc::CC10x10y10 ::~CC10x10y10(){ note_dtor("_ZN3ccc10CC10x10y10E", this);} // tgen
ccc::CC10x10y10 ::CC10x10y10(){ note_ctor("_ZN3ccc10CC10x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y10E, buf);
    ::ccc::CC10x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y10E);
    dp->::ccc::CC10x10y10::~CC10x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y10E(Test__ZN3ccc10CC10x10y10E, "_ZN3ccc10CC10x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y10C1Ev();
extern void _ZN3ccc10CC10x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y10E[] = {
  NSPAIR(_ZN3ccc10CC10x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y10E[];
extern void _ZN3ccc10CC10x10y103pqrEv();
extern void _ZN3ccc10CC10x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x10y103pqrEv,_ZThn4_N3ccc10CC10x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC10x10y103abcEv,_ZThn4_N3ccc10CC10x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x10y103pqrEv,_ZThn4_N3ccc10CC10x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x10y103abcEv,_ZThn4_N3ccc10CC10x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y10E[];
Class_Descriptor cd__ZN3ccc10CC10x10y10E = {  "_ZN3ccc10CC10x10y10E", // class name
  bases__ZN3ccc10CC10x10y10E, 2,
  &(vtc__ZN3ccc10CC10x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y11  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC10x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x10y113efgEv
  ~CC10x10y11(); // tgen
  CC10x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y11E) C1{ BC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x10y113pqrEv");}
void  ccc::CC10x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x10y113efgEv");}
ccc::CC10x10y11 ::~CC10x10y11(){ note_dtor("_ZN3ccc10CC10x10y11E", this);} // tgen
ccc::CC10x10y11 ::CC10x10y11(){ note_ctor("_ZN3ccc10CC10x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y11E, buf);
    ::ccc::CC10x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y11E);
    dp->::ccc::CC10x10y11::~CC10x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y11E(Test__ZN3ccc10CC10x10y11E, "_ZN3ccc10CC10x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y11C1Ev();
extern void _ZN3ccc10CC10x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y11E[] = {
  NSPAIR(_ZN3ccc10CC10x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y11E[];
extern void _ZN3ccc10CC10x10y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x10y113pqrEv,_ZThn4_N3ccc10CC10x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x10y113pqrEv,_ZThn4_N3ccc10CC10x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y11E[];
Class_Descriptor cd__ZN3ccc10CC10x10y11E = {  "_ZN3ccc10CC10x10y11E", // class name
  bases__ZN3ccc10CC10x10y11E, 2,
  &(vtc__ZN3ccc10CC10x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y12  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC10x10y123abcEv
  ~CC10x10y12(); // tgen
  CC10x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y12E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC10x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x10y123abcEv");}
ccc::CC10x10y12 ::~CC10x10y12(){ note_dtor("_ZN3ccc10CC10x10y12E", this);} // tgen
ccc::CC10x10y12 ::CC10x10y12(){ note_ctor("_ZN3ccc10CC10x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y12E, buf);
    ::ccc::CC10x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y12E);
    dp->::ccc::CC10x10y12::~CC10x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y12E(Test__ZN3ccc10CC10x10y12E, "_ZN3ccc10CC10x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y12C1Ev();
extern void _ZN3ccc10CC10x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y12E[] = {
  NSPAIR(_ZN3ccc10CC10x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x10y123abcEv,_ZThn4_N3ccc10CC10x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x10y123abcEv,_ZThn4_N3ccc10CC10x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y12E[];
Class_Descriptor cd__ZN3ccc10CC10x10y12E = {  "_ZN3ccc10CC10x10y12E", // class name
  bases__ZN3ccc10CC10x10y12E, 2,
  &(vtc__ZN3ccc10CC10x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y13  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC10x10y133efgEv
  ~CC10x10y13(); // tgen
  CC10x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y13E) C1{ BC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC10x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x10y133efgEv");}
ccc::CC10x10y13 ::~CC10x10y13(){ note_dtor("_ZN3ccc10CC10x10y13E", this);} // tgen
ccc::CC10x10y13 ::CC10x10y13(){ note_ctor("_ZN3ccc10CC10x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y13E, buf);
    ::ccc::CC10x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y13E);
    dp->::ccc::CC10x10y13::~CC10x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y13E(Test__ZN3ccc10CC10x10y13E, "_ZN3ccc10CC10x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y13C1Ev();
extern void _ZN3ccc10CC10x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y13E[] = {
  NSPAIR(_ZN3ccc10CC10x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y13E[];
Class_Descriptor cd__ZN3ccc10CC10x10y13E = {  "_ZN3ccc10CC10x10y13E", // class name
  bases__ZN3ccc10CC10x10y13E, 2,
  &(vtc__ZN3ccc10CC10x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y14  : ::ccc::AA10 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC10x10y143pqrEv
  ~CC10x10y14(); // tgen
  CC10x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y14E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC10x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x10y143pqrEv");}
ccc::CC10x10y14 ::~CC10x10y14(){ note_dtor("_ZN3ccc10CC10x10y14E", this);} // tgen
ccc::CC10x10y14 ::CC10x10y14(){ note_ctor("_ZN3ccc10CC10x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y14E, buf);
    ::ccc::CC10x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y14E);
    dp->::ccc::CC10x10y14::~CC10x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y14E(Test__ZN3ccc10CC10x10y14E, "_ZN3ccc10CC10x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y14C1Ev();
extern void _ZN3ccc10CC10x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y14E[] = {
  NSPAIR(_ZN3ccc10CC10x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y14E[];
extern void _ZN3ccc10CC10x10y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x10y143pqrEv,_ZThn4_N3ccc10CC10x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x10y143pqrEv,_ZThn4_N3ccc10CC10x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y14E[];
Class_Descriptor cd__ZN3ccc10CC10x10y14E = {  "_ZN3ccc10CC10x10y14E", // class name
  bases__ZN3ccc10CC10x10y14E, 2,
  &(vtc__ZN3ccc10CC10x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x10y15  : ::ccc::AA10 , ::ccc::BB10 {
  ~CC10x10y15(); // tgen
  CC10x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x10y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x10y15 ::~CC10x10y15(){ note_dtor("_ZN3ccc10CC10x10y15E", this);} // tgen
ccc::CC10x10y15 ::CC10x10y15(){ note_ctor("_ZN3ccc10CC10x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x10y15E, buf);
    ::ccc::CC10x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x10y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC10x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x10y15E);
    dp->::ccc::CC10x10y15::~CC10x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x10y15E(Test__ZN3ccc10CC10x10y15E, "_ZN3ccc10CC10x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x10y15C1Ev();
extern void _ZN3ccc10CC10x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x10y15E[] = {
  NSPAIR(_ZN3ccc10CC10x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC10x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x10y15E[];
Class_Descriptor cd__ZN3ccc10CC10x10y15E = {  "_ZN3ccc10CC10x10y15E", // class name
  bases__ZN3ccc10CC10x10y15E, 2,
  &(vtc__ZN3ccc10CC10x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y0  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC10x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y03pqrEv
  ~CC10x11y0(); // tgen
  CC10x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y0E) C1{ BC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y03abcEv");}
void  ccc::CC10x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y03efgEv");}
void  ccc::CC10x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y03pqrEv");}
ccc::CC10x11y0 ::~CC10x11y0(){ note_dtor("_ZN3ccc9CC10x11y0E", this);} // tgen
ccc::CC10x11y0 ::CC10x11y0(){ note_ctor("_ZN3ccc9CC10x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y0E, buf);
    ::ccc::CC10x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y0E);
    dp->::ccc::CC10x11y0::~CC10x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y0E(Test__ZN3ccc9CC10x11y0E, "_ZN3ccc9CC10x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y0C1Ev();
extern void _ZN3ccc9CC10x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y0E[] = {
  NSPAIR(_ZN3ccc9CC10x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y0E[];
extern void _ZN3ccc9CC10x11y03pqrEv();
extern void _ZN3ccc9CC10x11y03abcEv();
extern void _ZN3ccc9CC10x11y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y03pqrEv,_ZThn4_N3ccc9CC10x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y03efgEv,_ZThn4_N3ccc9CC10x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y03pqrEv,_ZThn4_N3ccc9CC10x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y03efgEv,_ZThn4_N3ccc9CC10x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y0E[];
Class_Descriptor cd__ZN3ccc9CC10x11y0E = {  "_ZN3ccc9CC10x11y0E", // class name
  bases__ZN3ccc9CC10x11y0E, 2,
  &(vtc__ZN3ccc9CC10x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y1  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC10x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x11y13efgEv
  ~CC10x11y1(); // tgen
  CC10x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y1E) C1{ BC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y13abcEv");}
void  ccc::CC10x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y13pqrEv");}
void  ccc::CC10x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y13efgEv");}
ccc::CC10x11y1 ::~CC10x11y1(){ note_dtor("_ZN3ccc9CC10x11y1E", this);} // tgen
ccc::CC10x11y1 ::CC10x11y1(){ note_ctor("_ZN3ccc9CC10x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y1E, buf);
    ::ccc::CC10x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y1E);
    dp->::ccc::CC10x11y1::~CC10x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y1E(Test__ZN3ccc9CC10x11y1E, "_ZN3ccc9CC10x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y1C1Ev();
extern void _ZN3ccc9CC10x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y1E[] = {
  NSPAIR(_ZN3ccc9CC10x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y1E[];
extern void _ZN3ccc9CC10x11y13pqrEv();
extern void _ZN3ccc9CC10x11y13abcEv();
extern void _ZN3ccc9CC10x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y13pqrEv,_ZThn4_N3ccc9CC10x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y13efgEv,_ZThn4_N3ccc9CC10x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y13pqrEv,_ZThn4_N3ccc9CC10x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y13efgEv,_ZThn4_N3ccc9CC10x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y1E[];
Class_Descriptor cd__ZN3ccc9CC10x11y1E = {  "_ZN3ccc9CC10x11y1E", // class name
  bases__ZN3ccc9CC10x11y1E, 2,
  &(vtc__ZN3ccc9CC10x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y2  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC10x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y23pqrEv
  ~CC10x11y2(); // tgen
  CC10x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y2E) C1{ BC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y23efgEv");}
void  ccc::CC10x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y23abcEv");}
void  ccc::CC10x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y23pqrEv");}
ccc::CC10x11y2 ::~CC10x11y2(){ note_dtor("_ZN3ccc9CC10x11y2E", this);} // tgen
ccc::CC10x11y2 ::CC10x11y2(){ note_ctor("_ZN3ccc9CC10x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y2E, buf);
    ::ccc::CC10x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y2E);
    dp->::ccc::CC10x11y2::~CC10x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y2E(Test__ZN3ccc9CC10x11y2E, "_ZN3ccc9CC10x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y2C1Ev();
extern void _ZN3ccc9CC10x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y2E[] = {
  NSPAIR(_ZN3ccc9CC10x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y2E[];
extern void _ZN3ccc9CC10x11y23pqrEv();
extern void _ZN3ccc9CC10x11y23abcEv();
extern void _ZN3ccc9CC10x11y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y23pqrEv,_ZThn4_N3ccc9CC10x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y23efgEv,_ZThn4_N3ccc9CC10x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y23pqrEv,_ZThn4_N3ccc9CC10x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y23efgEv,_ZThn4_N3ccc9CC10x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y2E[];
Class_Descriptor cd__ZN3ccc9CC10x11y2E = {  "_ZN3ccc9CC10x11y2E", // class name
  bases__ZN3ccc9CC10x11y2E, 2,
  &(vtc__ZN3ccc9CC10x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y3  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC10x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x11y33abcEv
  ~CC10x11y3(); // tgen
  CC10x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y3E) C1{ BC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y33efgEv");}
void  ccc::CC10x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y33pqrEv");}
void  ccc::CC10x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y33abcEv");}
ccc::CC10x11y3 ::~CC10x11y3(){ note_dtor("_ZN3ccc9CC10x11y3E", this);} // tgen
ccc::CC10x11y3 ::CC10x11y3(){ note_ctor("_ZN3ccc9CC10x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y3E, buf);
    ::ccc::CC10x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y3E);
    dp->::ccc::CC10x11y3::~CC10x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y3E(Test__ZN3ccc9CC10x11y3E, "_ZN3ccc9CC10x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y3C1Ev();
extern void _ZN3ccc9CC10x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y3E[] = {
  NSPAIR(_ZN3ccc9CC10x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y3E[];
extern void _ZN3ccc9CC10x11y33pqrEv();
extern void _ZN3ccc9CC10x11y33abcEv();
extern void _ZN3ccc9CC10x11y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y33pqrEv,_ZThn4_N3ccc9CC10x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y33efgEv,_ZThn4_N3ccc9CC10x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y33pqrEv,_ZThn4_N3ccc9CC10x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y33efgEv,_ZThn4_N3ccc9CC10x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y3E[];
Class_Descriptor cd__ZN3ccc9CC10x11y3E = {  "_ZN3ccc9CC10x11y3E", // class name
  bases__ZN3ccc9CC10x11y3E, 2,
  &(vtc__ZN3ccc9CC10x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y4  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC10x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x11y43efgEv
  ~CC10x11y4(); // tgen
  CC10x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y4E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y43pqrEv");}
void  ccc::CC10x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y43abcEv");}
void  ccc::CC10x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y43efgEv");}
ccc::CC10x11y4 ::~CC10x11y4(){ note_dtor("_ZN3ccc9CC10x11y4E", this);} // tgen
ccc::CC10x11y4 ::CC10x11y4(){ note_ctor("_ZN3ccc9CC10x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y4E, buf);
    ::ccc::CC10x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y4E);
    dp->::ccc::CC10x11y4::~CC10x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y4E(Test__ZN3ccc9CC10x11y4E, "_ZN3ccc9CC10x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y4C1Ev();
extern void _ZN3ccc9CC10x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y4E[] = {
  NSPAIR(_ZN3ccc9CC10x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y4E[];
extern void _ZN3ccc9CC10x11y43pqrEv();
extern void _ZN3ccc9CC10x11y43abcEv();
extern void _ZN3ccc9CC10x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y43pqrEv,_ZThn4_N3ccc9CC10x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y43efgEv,_ZThn4_N3ccc9CC10x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y43pqrEv,_ZThn4_N3ccc9CC10x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y43efgEv,_ZThn4_N3ccc9CC10x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y4E[];
Class_Descriptor cd__ZN3ccc9CC10x11y4E = {  "_ZN3ccc9CC10x11y4E", // class name
  bases__ZN3ccc9CC10x11y4E, 2,
  &(vtc__ZN3ccc9CC10x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y5  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC10x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x11y53abcEv
  ~CC10x11y5(); // tgen
  CC10x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y5E) C1{ BC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y53pqrEv");}
void  ccc::CC10x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y53efgEv");}
void  ccc::CC10x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y53abcEv");}
ccc::CC10x11y5 ::~CC10x11y5(){ note_dtor("_ZN3ccc9CC10x11y5E", this);} // tgen
ccc::CC10x11y5 ::CC10x11y5(){ note_ctor("_ZN3ccc9CC10x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y5E, buf);
    ::ccc::CC10x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y5E);
    dp->::ccc::CC10x11y5::~CC10x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y5E(Test__ZN3ccc9CC10x11y5E, "_ZN3ccc9CC10x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y5C1Ev();
extern void _ZN3ccc9CC10x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y5E[] = {
  NSPAIR(_ZN3ccc9CC10x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y5E[];
extern void _ZN3ccc9CC10x11y53pqrEv();
extern void _ZN3ccc9CC10x11y53abcEv();
extern void _ZN3ccc9CC10x11y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y53pqrEv,_ZThn4_N3ccc9CC10x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y53efgEv,_ZThn4_N3ccc9CC10x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y53pqrEv,_ZThn4_N3ccc9CC10x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y53efgEv,_ZThn4_N3ccc9CC10x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y5E[];
Class_Descriptor cd__ZN3ccc9CC10x11y5E = {  "_ZN3ccc9CC10x11y5E", // class name
  bases__ZN3ccc9CC10x11y5E, 2,
  &(vtc__ZN3ccc9CC10x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y6  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC10x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x11y63efgEv
  ~CC10x11y6(); // tgen
  CC10x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y6E) C1{ BC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y63abcEv");}
void  ccc::CC10x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y63efgEv");}
ccc::CC10x11y6 ::~CC10x11y6(){ note_dtor("_ZN3ccc9CC10x11y6E", this);} // tgen
ccc::CC10x11y6 ::CC10x11y6(){ note_ctor("_ZN3ccc9CC10x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y6E, buf);
    ::ccc::CC10x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y6E);
    dp->::ccc::CC10x11y6::~CC10x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y6E(Test__ZN3ccc9CC10x11y6E, "_ZN3ccc9CC10x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y6C1Ev();
extern void _ZN3ccc9CC10x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y6E[] = {
  NSPAIR(_ZN3ccc9CC10x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x11y63abcEv();
extern void _ZN3ccc9CC10x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y63efgEv,_ZThn4_N3ccc9CC10x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y63efgEv,_ZThn4_N3ccc9CC10x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y6E[];
Class_Descriptor cd__ZN3ccc9CC10x11y6E = {  "_ZN3ccc9CC10x11y6E", // class name
  bases__ZN3ccc9CC10x11y6E, 2,
  &(vtc__ZN3ccc9CC10x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y7  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC10x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y73pqrEv
  ~CC10x11y7(); // tgen
  CC10x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y7E) C1{ BC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y73abcEv");}
void  ccc::CC10x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y73pqrEv");}
ccc::CC10x11y7 ::~CC10x11y7(){ note_dtor("_ZN3ccc9CC10x11y7E", this);} // tgen
ccc::CC10x11y7 ::CC10x11y7(){ note_ctor("_ZN3ccc9CC10x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y7E, buf);
    ::ccc::CC10x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y7E);
    dp->::ccc::CC10x11y7::~CC10x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y7E(Test__ZN3ccc9CC10x11y7E, "_ZN3ccc9CC10x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y7C1Ev();
extern void _ZN3ccc9CC10x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y7E[] = {
  NSPAIR(_ZN3ccc9CC10x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y7E[];
extern void _ZN3ccc9CC10x11y73pqrEv();
extern void _ZN3ccc9CC10x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y73pqrEv,_ZThn4_N3ccc9CC10x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y73pqrEv,_ZThn4_N3ccc9CC10x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y7E[];
Class_Descriptor cd__ZN3ccc9CC10x11y7E = {  "_ZN3ccc9CC10x11y7E", // class name
  bases__ZN3ccc9CC10x11y7E, 2,
  &(vtc__ZN3ccc9CC10x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y8  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC10x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x11y83abcEv
  ~CC10x11y8(); // tgen
  CC10x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y8E) C1{ BC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y83efgEv");}
void  ccc::CC10x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x11y83abcEv");}
ccc::CC10x11y8 ::~CC10x11y8(){ note_dtor("_ZN3ccc9CC10x11y8E", this);} // tgen
ccc::CC10x11y8 ::CC10x11y8(){ note_ctor("_ZN3ccc9CC10x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y8E, buf);
    ::ccc::CC10x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y8E);
    dp->::ccc::CC10x11y8::~CC10x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y8E(Test__ZN3ccc9CC10x11y8E, "_ZN3ccc9CC10x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y8C1Ev();
extern void _ZN3ccc9CC10x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y8E[] = {
  NSPAIR(_ZN3ccc9CC10x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x11y83abcEv();
extern void _ZN3ccc9CC10x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y83efgEv,_ZThn4_N3ccc9CC10x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y83efgEv,_ZThn4_N3ccc9CC10x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y8E[];
Class_Descriptor cd__ZN3ccc9CC10x11y8E = {  "_ZN3ccc9CC10x11y8E", // class name
  bases__ZN3ccc9CC10x11y8E, 2,
  &(vtc__ZN3ccc9CC10x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y9  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC10x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x11y93pqrEv
  ~CC10x11y9(); // tgen
  CC10x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x11y9E) C1{ BC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x11y93efgEv");}
void  ccc::CC10x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x11y93pqrEv");}
ccc::CC10x11y9 ::~CC10x11y9(){ note_dtor("_ZN3ccc9CC10x11y9E", this);} // tgen
ccc::CC10x11y9 ::CC10x11y9(){ note_ctor("_ZN3ccc9CC10x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x11y9E, buf);
    ::ccc::CC10x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x11y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC10x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x11y9E);
    dp->::ccc::CC10x11y9::~CC10x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x11y9E(Test__ZN3ccc9CC10x11y9E, "_ZN3ccc9CC10x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x11y9C1Ev();
extern void _ZN3ccc9CC10x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x11y9E[] = {
  NSPAIR(_ZN3ccc9CC10x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC10x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y9E[];
extern void _ZN3ccc9CC10x11y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y93pqrEv,_ZThn4_N3ccc9CC10x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x11y93efgEv,_ZThn4_N3ccc9CC10x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y93pqrEv,_ZThn4_N3ccc9CC10x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x11y93efgEv,_ZThn4_N3ccc9CC10x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x11y9E[];
Class_Descriptor cd__ZN3ccc9CC10x11y9E = {  "_ZN3ccc9CC10x11y9E", // class name
  bases__ZN3ccc9CC10x11y9E, 2,
  &(vtc__ZN3ccc9CC10x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y10  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC10x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x11y103abcEv
  ~CC10x11y10(); // tgen
  CC10x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y10E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x11y103pqrEv");}
void  ccc::CC10x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x11y103abcEv");}
ccc::CC10x11y10 ::~CC10x11y10(){ note_dtor("_ZN3ccc10CC10x11y10E", this);} // tgen
ccc::CC10x11y10 ::CC10x11y10(){ note_ctor("_ZN3ccc10CC10x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y10E, buf);
    ::ccc::CC10x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y10E);
    dp->::ccc::CC10x11y10::~CC10x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y10E(Test__ZN3ccc10CC10x11y10E, "_ZN3ccc10CC10x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y10C1Ev();
extern void _ZN3ccc10CC10x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y10E[] = {
  NSPAIR(_ZN3ccc10CC10x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y10E[];
extern void _ZN3ccc10CC10x11y103pqrEv();
extern void _ZN3ccc10CC10x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x11y103pqrEv,_ZThn4_N3ccc10CC10x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x11y103pqrEv,_ZThn4_N3ccc10CC10x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y10E[];
Class_Descriptor cd__ZN3ccc10CC10x11y10E = {  "_ZN3ccc10CC10x11y10E", // class name
  bases__ZN3ccc10CC10x11y10E, 2,
  &(vtc__ZN3ccc10CC10x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y11  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC10x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x11y113efgEv
  ~CC10x11y11(); // tgen
  CC10x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y11E) C1{ BC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x11y113pqrEv");}
void  ccc::CC10x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x11y113efgEv");}
ccc::CC10x11y11 ::~CC10x11y11(){ note_dtor("_ZN3ccc10CC10x11y11E", this);} // tgen
ccc::CC10x11y11 ::CC10x11y11(){ note_ctor("_ZN3ccc10CC10x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y11E, buf);
    ::ccc::CC10x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y11E);
    dp->::ccc::CC10x11y11::~CC10x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y11E(Test__ZN3ccc10CC10x11y11E, "_ZN3ccc10CC10x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y11C1Ev();
extern void _ZN3ccc10CC10x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y11E[] = {
  NSPAIR(_ZN3ccc10CC10x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y11E[];
extern void _ZN3ccc10CC10x11y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x11y113pqrEv,_ZThn4_N3ccc10CC10x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC10x11y113efgEv,_ZThn4_N3ccc10CC10x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x11y113pqrEv,_ZThn4_N3ccc10CC10x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x11y113efgEv,_ZThn4_N3ccc10CC10x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y11E[];
Class_Descriptor cd__ZN3ccc10CC10x11y11E = {  "_ZN3ccc10CC10x11y11E", // class name
  bases__ZN3ccc10CC10x11y11E, 2,
  &(vtc__ZN3ccc10CC10x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y12  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC10x11y123abcEv
  ~CC10x11y12(); // tgen
  CC10x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y12E) C1{ BC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x11y123abcEv");}
ccc::CC10x11y12 ::~CC10x11y12(){ note_dtor("_ZN3ccc10CC10x11y12E", this);} // tgen
ccc::CC10x11y12 ::CC10x11y12(){ note_ctor("_ZN3ccc10CC10x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y12E, buf);
    ::ccc::CC10x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y12E);
    dp->::ccc::CC10x11y12::~CC10x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y12E(Test__ZN3ccc10CC10x11y12E, "_ZN3ccc10CC10x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y12C1Ev();
extern void _ZN3ccc10CC10x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y12E[] = {
  NSPAIR(_ZN3ccc10CC10x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y12E[];
Class_Descriptor cd__ZN3ccc10CC10x11y12E = {  "_ZN3ccc10CC10x11y12E", // class name
  bases__ZN3ccc10CC10x11y12E, 2,
  &(vtc__ZN3ccc10CC10x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y13  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC10x11y133efgEv
  ~CC10x11y13(); // tgen
  CC10x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y13E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x11y133efgEv");}
ccc::CC10x11y13 ::~CC10x11y13(){ note_dtor("_ZN3ccc10CC10x11y13E", this);} // tgen
ccc::CC10x11y13 ::CC10x11y13(){ note_ctor("_ZN3ccc10CC10x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y13E, buf);
    ::ccc::CC10x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y13E);
    dp->::ccc::CC10x11y13::~CC10x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y13E(Test__ZN3ccc10CC10x11y13E, "_ZN3ccc10CC10x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y13C1Ev();
extern void _ZN3ccc10CC10x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y13E[] = {
  NSPAIR(_ZN3ccc10CC10x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x11y133efgEv,_ZThn4_N3ccc10CC10x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x11y133efgEv,_ZThn4_N3ccc10CC10x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y13E[];
Class_Descriptor cd__ZN3ccc10CC10x11y13E = {  "_ZN3ccc10CC10x11y13E", // class name
  bases__ZN3ccc10CC10x11y13E, 2,
  &(vtc__ZN3ccc10CC10x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y14  : ::ccc::AA10 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC10x11y143pqrEv
  ~CC10x11y14(); // tgen
  CC10x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y14E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC10x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x11y143pqrEv");}
ccc::CC10x11y14 ::~CC10x11y14(){ note_dtor("_ZN3ccc10CC10x11y14E", this);} // tgen
ccc::CC10x11y14 ::CC10x11y14(){ note_ctor("_ZN3ccc10CC10x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y14E, buf);
    ::ccc::CC10x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y14E);
    dp->::ccc::CC10x11y14::~CC10x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y14E(Test__ZN3ccc10CC10x11y14E, "_ZN3ccc10CC10x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y14C1Ev();
extern void _ZN3ccc10CC10x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y14E[] = {
  NSPAIR(_ZN3ccc10CC10x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y14E[];
extern void _ZN3ccc10CC10x11y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x11y143pqrEv,_ZThn4_N3ccc10CC10x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x11y143pqrEv,_ZThn4_N3ccc10CC10x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y14E[];
Class_Descriptor cd__ZN3ccc10CC10x11y14E = {  "_ZN3ccc10CC10x11y14E", // class name
  bases__ZN3ccc10CC10x11y14E, 2,
  &(vtc__ZN3ccc10CC10x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x11y15  : ::ccc::AA10 , ::ccc::BB11 {
  ~CC10x11y15(); // tgen
  CC10x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x11y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC10x11y15 ::~CC10x11y15(){ note_dtor("_ZN3ccc10CC10x11y15E", this);} // tgen
ccc::CC10x11y15 ::CC10x11y15(){ note_ctor("_ZN3ccc10CC10x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x11y15E, buf);
    ::ccc::CC10x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x11y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC10x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x11y15E);
    dp->::ccc::CC10x11y15::~CC10x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x11y15E(Test__ZN3ccc10CC10x11y15E, "_ZN3ccc10CC10x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x11y15C1Ev();
extern void _ZN3ccc10CC10x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x11y15E[] = {
  NSPAIR(_ZN3ccc10CC10x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC10x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x11y15E[];
Class_Descriptor cd__ZN3ccc10CC10x11y15E = {  "_ZN3ccc10CC10x11y15E", // class name
  bases__ZN3ccc10CC10x11y15E, 2,
  &(vtc__ZN3ccc10CC10x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y0  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC10x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y03pqrEv
  ~CC10x12y0(); // tgen
  CC10x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y0E) C1{ BC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y03abcEv");}
void  ccc::CC10x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y03efgEv");}
void  ccc::CC10x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y03pqrEv");}
ccc::CC10x12y0 ::~CC10x12y0(){ note_dtor("_ZN3ccc9CC10x12y0E", this);} // tgen
ccc::CC10x12y0 ::CC10x12y0(){ note_ctor("_ZN3ccc9CC10x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y0E, buf);
    ::ccc::CC10x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y0E);
    dp->::ccc::CC10x12y0::~CC10x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y0E(Test__ZN3ccc9CC10x12y0E, "_ZN3ccc9CC10x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y0C1Ev();
extern void _ZN3ccc9CC10x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y0E[] = {
  NSPAIR(_ZN3ccc9CC10x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y0E[];
extern void _ZN3ccc9CC10x12y03pqrEv();
extern void _ZN3ccc9CC10x12y03abcEv();
extern void _ZN3ccc9CC10x12y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y03abcEv,_ZThn4_N3ccc9CC10x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y03abcEv,_ZThn4_N3ccc9CC10x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y0E[];
Class_Descriptor cd__ZN3ccc9CC10x12y0E = {  "_ZN3ccc9CC10x12y0E", // class name
  bases__ZN3ccc9CC10x12y0E, 2,
  &(vtc__ZN3ccc9CC10x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y1  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC10x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x12y13efgEv
  ~CC10x12y1(); // tgen
  CC10x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y1E) C1{ BC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y13abcEv");}
void  ccc::CC10x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y13pqrEv");}
void  ccc::CC10x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y13efgEv");}
ccc::CC10x12y1 ::~CC10x12y1(){ note_dtor("_ZN3ccc9CC10x12y1E", this);} // tgen
ccc::CC10x12y1 ::CC10x12y1(){ note_ctor("_ZN3ccc9CC10x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y1E, buf);
    ::ccc::CC10x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y1E);
    dp->::ccc::CC10x12y1::~CC10x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y1E(Test__ZN3ccc9CC10x12y1E, "_ZN3ccc9CC10x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y1C1Ev();
extern void _ZN3ccc9CC10x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y1E[] = {
  NSPAIR(_ZN3ccc9CC10x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y1E[];
extern void _ZN3ccc9CC10x12y13pqrEv();
extern void _ZN3ccc9CC10x12y13abcEv();
extern void _ZN3ccc9CC10x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y13abcEv,_ZThn4_N3ccc9CC10x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y13abcEv,_ZThn4_N3ccc9CC10x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y1E[];
Class_Descriptor cd__ZN3ccc9CC10x12y1E = {  "_ZN3ccc9CC10x12y1E", // class name
  bases__ZN3ccc9CC10x12y1E, 2,
  &(vtc__ZN3ccc9CC10x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y2  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC10x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y23pqrEv
  ~CC10x12y2(); // tgen
  CC10x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y2E) C1{ BC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y23efgEv");}
void  ccc::CC10x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y23abcEv");}
void  ccc::CC10x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y23pqrEv");}
ccc::CC10x12y2 ::~CC10x12y2(){ note_dtor("_ZN3ccc9CC10x12y2E", this);} // tgen
ccc::CC10x12y2 ::CC10x12y2(){ note_ctor("_ZN3ccc9CC10x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y2E, buf);
    ::ccc::CC10x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y2E);
    dp->::ccc::CC10x12y2::~CC10x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y2E(Test__ZN3ccc9CC10x12y2E, "_ZN3ccc9CC10x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y2C1Ev();
extern void _ZN3ccc9CC10x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y2E[] = {
  NSPAIR(_ZN3ccc9CC10x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y2E[];
extern void _ZN3ccc9CC10x12y23pqrEv();
extern void _ZN3ccc9CC10x12y23abcEv();
extern void _ZN3ccc9CC10x12y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y23abcEv,_ZThn4_N3ccc9CC10x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y23abcEv,_ZThn4_N3ccc9CC10x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y2E[];
Class_Descriptor cd__ZN3ccc9CC10x12y2E = {  "_ZN3ccc9CC10x12y2E", // class name
  bases__ZN3ccc9CC10x12y2E, 2,
  &(vtc__ZN3ccc9CC10x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y3  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC10x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x12y33abcEv
  ~CC10x12y3(); // tgen
  CC10x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y3E) C1{ BC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y33efgEv");}
void  ccc::CC10x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y33pqrEv");}
void  ccc::CC10x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y33abcEv");}
ccc::CC10x12y3 ::~CC10x12y3(){ note_dtor("_ZN3ccc9CC10x12y3E", this);} // tgen
ccc::CC10x12y3 ::CC10x12y3(){ note_ctor("_ZN3ccc9CC10x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y3E, buf);
    ::ccc::CC10x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y3E);
    dp->::ccc::CC10x12y3::~CC10x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y3E(Test__ZN3ccc9CC10x12y3E, "_ZN3ccc9CC10x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y3C1Ev();
extern void _ZN3ccc9CC10x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y3E[] = {
  NSPAIR(_ZN3ccc9CC10x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y3E[];
extern void _ZN3ccc9CC10x12y33pqrEv();
extern void _ZN3ccc9CC10x12y33abcEv();
extern void _ZN3ccc9CC10x12y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y33abcEv,_ZThn4_N3ccc9CC10x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y33abcEv,_ZThn4_N3ccc9CC10x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y3E[];
Class_Descriptor cd__ZN3ccc9CC10x12y3E = {  "_ZN3ccc9CC10x12y3E", // class name
  bases__ZN3ccc9CC10x12y3E, 2,
  &(vtc__ZN3ccc9CC10x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y4  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC10x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x12y43efgEv
  ~CC10x12y4(); // tgen
  CC10x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y4E) C1{ BC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y43pqrEv");}
void  ccc::CC10x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y43abcEv");}
void  ccc::CC10x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y43efgEv");}
ccc::CC10x12y4 ::~CC10x12y4(){ note_dtor("_ZN3ccc9CC10x12y4E", this);} // tgen
ccc::CC10x12y4 ::CC10x12y4(){ note_ctor("_ZN3ccc9CC10x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y4E, buf);
    ::ccc::CC10x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y4E);
    dp->::ccc::CC10x12y4::~CC10x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y4E(Test__ZN3ccc9CC10x12y4E, "_ZN3ccc9CC10x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y4C1Ev();
extern void _ZN3ccc9CC10x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y4E[] = {
  NSPAIR(_ZN3ccc9CC10x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y4E[];
extern void _ZN3ccc9CC10x12y43pqrEv();
extern void _ZN3ccc9CC10x12y43abcEv();
extern void _ZN3ccc9CC10x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y43abcEv,_ZThn4_N3ccc9CC10x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y43abcEv,_ZThn4_N3ccc9CC10x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y4E[];
Class_Descriptor cd__ZN3ccc9CC10x12y4E = {  "_ZN3ccc9CC10x12y4E", // class name
  bases__ZN3ccc9CC10x12y4E, 2,
  &(vtc__ZN3ccc9CC10x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y5  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC10x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x12y53abcEv
  ~CC10x12y5(); // tgen
  CC10x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y5E) C1{ BC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y53pqrEv");}
void  ccc::CC10x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y53efgEv");}
void  ccc::CC10x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y53abcEv");}
ccc::CC10x12y5 ::~CC10x12y5(){ note_dtor("_ZN3ccc9CC10x12y5E", this);} // tgen
ccc::CC10x12y5 ::CC10x12y5(){ note_ctor("_ZN3ccc9CC10x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y5E, buf);
    ::ccc::CC10x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y5E);
    dp->::ccc::CC10x12y5::~CC10x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y5E(Test__ZN3ccc9CC10x12y5E, "_ZN3ccc9CC10x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y5C1Ev();
extern void _ZN3ccc9CC10x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y5E[] = {
  NSPAIR(_ZN3ccc9CC10x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y5E[];
extern void _ZN3ccc9CC10x12y53pqrEv();
extern void _ZN3ccc9CC10x12y53abcEv();
extern void _ZN3ccc9CC10x12y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y53abcEv,_ZThn4_N3ccc9CC10x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y53abcEv,_ZThn4_N3ccc9CC10x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y5E[];
Class_Descriptor cd__ZN3ccc9CC10x12y5E = {  "_ZN3ccc9CC10x12y5E", // class name
  bases__ZN3ccc9CC10x12y5E, 2,
  &(vtc__ZN3ccc9CC10x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y6  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC10x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x12y63efgEv
  ~CC10x12y6(); // tgen
  CC10x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y6E) C1{ BC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y63abcEv");}
void  ccc::CC10x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y63efgEv");}
ccc::CC10x12y6 ::~CC10x12y6(){ note_dtor("_ZN3ccc9CC10x12y6E", this);} // tgen
ccc::CC10x12y6 ::CC10x12y6(){ note_ctor("_ZN3ccc9CC10x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y6E, buf);
    ::ccc::CC10x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y6E);
    dp->::ccc::CC10x12y6::~CC10x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y6E(Test__ZN3ccc9CC10x12y6E, "_ZN3ccc9CC10x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y6C1Ev();
extern void _ZN3ccc9CC10x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y6E[] = {
  NSPAIR(_ZN3ccc9CC10x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x12y63abcEv();
extern void _ZN3ccc9CC10x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y63abcEv,_ZThn4_N3ccc9CC10x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y63abcEv,_ZThn4_N3ccc9CC10x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y6E[];
Class_Descriptor cd__ZN3ccc9CC10x12y6E = {  "_ZN3ccc9CC10x12y6E", // class name
  bases__ZN3ccc9CC10x12y6E, 2,
  &(vtc__ZN3ccc9CC10x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y7  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC10x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y73pqrEv
  ~CC10x12y7(); // tgen
  CC10x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y7E) C1{ BC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y73abcEv");}
void  ccc::CC10x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y73pqrEv");}
ccc::CC10x12y7 ::~CC10x12y7(){ note_dtor("_ZN3ccc9CC10x12y7E", this);} // tgen
ccc::CC10x12y7 ::CC10x12y7(){ note_ctor("_ZN3ccc9CC10x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y7E, buf);
    ::ccc::CC10x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y7E);
    dp->::ccc::CC10x12y7::~CC10x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y7E(Test__ZN3ccc9CC10x12y7E, "_ZN3ccc9CC10x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y7C1Ev();
extern void _ZN3ccc9CC10x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y7E[] = {
  NSPAIR(_ZN3ccc9CC10x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y7E[];
extern void _ZN3ccc9CC10x12y73pqrEv();
extern void _ZN3ccc9CC10x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y73abcEv,_ZThn4_N3ccc9CC10x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y73abcEv,_ZThn4_N3ccc9CC10x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y7E[];
Class_Descriptor cd__ZN3ccc9CC10x12y7E = {  "_ZN3ccc9CC10x12y7E", // class name
  bases__ZN3ccc9CC10x12y7E, 2,
  &(vtc__ZN3ccc9CC10x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y8  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC10x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x12y83abcEv
  ~CC10x12y8(); // tgen
  CC10x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y8E) C1{ BC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y83efgEv");}
void  ccc::CC10x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x12y83abcEv");}
ccc::CC10x12y8 ::~CC10x12y8(){ note_dtor("_ZN3ccc9CC10x12y8E", this);} // tgen
ccc::CC10x12y8 ::CC10x12y8(){ note_ctor("_ZN3ccc9CC10x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y8E, buf);
    ::ccc::CC10x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y8E);
    dp->::ccc::CC10x12y8::~CC10x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y8E(Test__ZN3ccc9CC10x12y8E, "_ZN3ccc9CC10x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y8C1Ev();
extern void _ZN3ccc9CC10x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y8E[] = {
  NSPAIR(_ZN3ccc9CC10x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x12y83abcEv();
extern void _ZN3ccc9CC10x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x12y83abcEv,_ZThn4_N3ccc9CC10x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x12y83abcEv,_ZThn4_N3ccc9CC10x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y8E[];
Class_Descriptor cd__ZN3ccc9CC10x12y8E = {  "_ZN3ccc9CC10x12y8E", // class name
  bases__ZN3ccc9CC10x12y8E, 2,
  &(vtc__ZN3ccc9CC10x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y9  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC10x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x12y93pqrEv
  ~CC10x12y9(); // tgen
  CC10x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x12y9E) C1{ BC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x12y93efgEv");}
void  ccc::CC10x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x12y93pqrEv");}
ccc::CC10x12y9 ::~CC10x12y9(){ note_dtor("_ZN3ccc9CC10x12y9E", this);} // tgen
ccc::CC10x12y9 ::CC10x12y9(){ note_ctor("_ZN3ccc9CC10x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x12y9E, buf);
    ::ccc::CC10x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x12y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC10x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x12y9E);
    dp->::ccc::CC10x12y9::~CC10x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x12y9E(Test__ZN3ccc9CC10x12y9E, "_ZN3ccc9CC10x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x12y9C1Ev();
extern void _ZN3ccc9CC10x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x12y9E[] = {
  NSPAIR(_ZN3ccc9CC10x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC10x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y9E[];
extern void _ZN3ccc9CC10x12y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x12y9E[];
Class_Descriptor cd__ZN3ccc9CC10x12y9E = {  "_ZN3ccc9CC10x12y9E", // class name
  bases__ZN3ccc9CC10x12y9E, 2,
  &(vtc__ZN3ccc9CC10x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y10  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC10x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x12y103abcEv
  ~CC10x12y10(); // tgen
  CC10x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y10E) C1{ BC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x12y103pqrEv");}
void  ccc::CC10x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x12y103abcEv");}
ccc::CC10x12y10 ::~CC10x12y10(){ note_dtor("_ZN3ccc10CC10x12y10E", this);} // tgen
ccc::CC10x12y10 ::CC10x12y10(){ note_ctor("_ZN3ccc10CC10x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y10E, buf);
    ::ccc::CC10x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y10E);
    dp->::ccc::CC10x12y10::~CC10x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y10E(Test__ZN3ccc10CC10x12y10E, "_ZN3ccc10CC10x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y10C1Ev();
extern void _ZN3ccc10CC10x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y10E[] = {
  NSPAIR(_ZN3ccc10CC10x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y10E[];
extern void _ZN3ccc10CC10x12y103pqrEv();
extern void _ZN3ccc10CC10x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x12y103abcEv,_ZThn4_N3ccc10CC10x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x12y103abcEv,_ZThn4_N3ccc10CC10x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y10E[];
Class_Descriptor cd__ZN3ccc10CC10x12y10E = {  "_ZN3ccc10CC10x12y10E", // class name
  bases__ZN3ccc10CC10x12y10E, 2,
  &(vtc__ZN3ccc10CC10x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y11  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC10x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x12y113efgEv
  ~CC10x12y11(); // tgen
  CC10x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y11E) C1{ BC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x12y113pqrEv");}
void  ccc::CC10x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x12y113efgEv");}
ccc::CC10x12y11 ::~CC10x12y11(){ note_dtor("_ZN3ccc10CC10x12y11E", this);} // tgen
ccc::CC10x12y11 ::CC10x12y11(){ note_ctor("_ZN3ccc10CC10x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y11E, buf);
    ::ccc::CC10x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y11E);
    dp->::ccc::CC10x12y11::~CC10x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y11E(Test__ZN3ccc10CC10x12y11E, "_ZN3ccc10CC10x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y11C1Ev();
extern void _ZN3ccc10CC10x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y11E[] = {
  NSPAIR(_ZN3ccc10CC10x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y11E[];
extern void _ZN3ccc10CC10x12y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y11E[];
Class_Descriptor cd__ZN3ccc10CC10x12y11E = {  "_ZN3ccc10CC10x12y11E", // class name
  bases__ZN3ccc10CC10x12y11E, 2,
  &(vtc__ZN3ccc10CC10x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y12  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC10x12y123abcEv
  ~CC10x12y12(); // tgen
  CC10x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y12E) C1{ BC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC10x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x12y123abcEv");}
ccc::CC10x12y12 ::~CC10x12y12(){ note_dtor("_ZN3ccc10CC10x12y12E", this);} // tgen
ccc::CC10x12y12 ::CC10x12y12(){ note_ctor("_ZN3ccc10CC10x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y12E, buf);
    ::ccc::CC10x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y12E);
    dp->::ccc::CC10x12y12::~CC10x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y12E(Test__ZN3ccc10CC10x12y12E, "_ZN3ccc10CC10x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y12C1Ev();
extern void _ZN3ccc10CC10x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y12E[] = {
  NSPAIR(_ZN3ccc10CC10x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x12y123abcEv,_ZThn4_N3ccc10CC10x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x12y123abcEv,_ZThn4_N3ccc10CC10x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y12E[];
Class_Descriptor cd__ZN3ccc10CC10x12y12E = {  "_ZN3ccc10CC10x12y12E", // class name
  bases__ZN3ccc10CC10x12y12E, 2,
  &(vtc__ZN3ccc10CC10x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y13  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC10x12y133efgEv
  ~CC10x12y13(); // tgen
  CC10x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y13E) C1{ BC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC10x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x12y133efgEv");}
ccc::CC10x12y13 ::~CC10x12y13(){ note_dtor("_ZN3ccc10CC10x12y13E", this);} // tgen
ccc::CC10x12y13 ::CC10x12y13(){ note_ctor("_ZN3ccc10CC10x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y13E, buf);
    ::ccc::CC10x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y13E);
    dp->::ccc::CC10x12y13::~CC10x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y13E(Test__ZN3ccc10CC10x12y13E, "_ZN3ccc10CC10x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y13C1Ev();
extern void _ZN3ccc10CC10x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y13E[] = {
  NSPAIR(_ZN3ccc10CC10x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y13E[];
Class_Descriptor cd__ZN3ccc10CC10x12y13E = {  "_ZN3ccc10CC10x12y13E", // class name
  bases__ZN3ccc10CC10x12y13E, 2,
  &(vtc__ZN3ccc10CC10x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y14  : ::ccc::AA10 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC10x12y143pqrEv
  ~CC10x12y14(); // tgen
  CC10x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y14E) C1{ BC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC10x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x12y143pqrEv");}
ccc::CC10x12y14 ::~CC10x12y14(){ note_dtor("_ZN3ccc10CC10x12y14E", this);} // tgen
ccc::CC10x12y14 ::CC10x12y14(){ note_ctor("_ZN3ccc10CC10x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y14E, buf);
    ::ccc::CC10x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y14E);
    dp->::ccc::CC10x12y14::~CC10x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y14E(Test__ZN3ccc10CC10x12y14E, "_ZN3ccc10CC10x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y14C1Ev();
extern void _ZN3ccc10CC10x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y14E[] = {
  NSPAIR(_ZN3ccc10CC10x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y14E[];
extern void _ZN3ccc10CC10x12y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y14E[];
Class_Descriptor cd__ZN3ccc10CC10x12y14E = {  "_ZN3ccc10CC10x12y14E", // class name
  bases__ZN3ccc10CC10x12y14E, 2,
  &(vtc__ZN3ccc10CC10x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x12y15  : ::ccc::AA10 , ::ccc::BB12 {
  ~CC10x12y15(); // tgen
  CC10x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x12y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC10x12y15 ::~CC10x12y15(){ note_dtor("_ZN3ccc10CC10x12y15E", this);} // tgen
ccc::CC10x12y15 ::CC10x12y15(){ note_ctor("_ZN3ccc10CC10x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x12y15E, buf);
    ::ccc::CC10x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x12y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC10x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x12y15E);
    dp->::ccc::CC10x12y15::~CC10x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x12y15E(Test__ZN3ccc10CC10x12y15E, "_ZN3ccc10CC10x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x12y15C1Ev();
extern void _ZN3ccc10CC10x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x12y15E[] = {
  NSPAIR(_ZN3ccc10CC10x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC10x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x12y15E[];
Class_Descriptor cd__ZN3ccc10CC10x12y15E = {  "_ZN3ccc10CC10x12y15E", // class name
  bases__ZN3ccc10CC10x12y15E, 2,
  &(vtc__ZN3ccc10CC10x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y0  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC10x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y03pqrEv
  ~CC10x13y0(); // tgen
  CC10x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y0E) C1{ BC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y03abcEv");}
void  ccc::CC10x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y03efgEv");}
void  ccc::CC10x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y03pqrEv");}
ccc::CC10x13y0 ::~CC10x13y0(){ note_dtor("_ZN3ccc9CC10x13y0E", this);} // tgen
ccc::CC10x13y0 ::CC10x13y0(){ note_ctor("_ZN3ccc9CC10x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y0E, buf);
    ::ccc::CC10x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y0E);
    dp->::ccc::CC10x13y0::~CC10x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y0E(Test__ZN3ccc9CC10x13y0E, "_ZN3ccc9CC10x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y0C1Ev();
extern void _ZN3ccc9CC10x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y0E[] = {
  NSPAIR(_ZN3ccc9CC10x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y0E[];
extern void _ZN3ccc9CC10x13y03pqrEv();
extern void _ZN3ccc9CC10x13y03abcEv();
extern void _ZN3ccc9CC10x13y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y03efgEv,_ZThn4_N3ccc9CC10x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y03efgEv,_ZThn4_N3ccc9CC10x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y0E[];
Class_Descriptor cd__ZN3ccc9CC10x13y0E = {  "_ZN3ccc9CC10x13y0E", // class name
  bases__ZN3ccc9CC10x13y0E, 2,
  &(vtc__ZN3ccc9CC10x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y1  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC10x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x13y13efgEv
  ~CC10x13y1(); // tgen
  CC10x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y1E) C1{ BC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y13abcEv");}
void  ccc::CC10x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y13pqrEv");}
void  ccc::CC10x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y13efgEv");}
ccc::CC10x13y1 ::~CC10x13y1(){ note_dtor("_ZN3ccc9CC10x13y1E", this);} // tgen
ccc::CC10x13y1 ::CC10x13y1(){ note_ctor("_ZN3ccc9CC10x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y1E, buf);
    ::ccc::CC10x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y1E);
    dp->::ccc::CC10x13y1::~CC10x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y1E(Test__ZN3ccc9CC10x13y1E, "_ZN3ccc9CC10x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y1C1Ev();
extern void _ZN3ccc9CC10x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y1E[] = {
  NSPAIR(_ZN3ccc9CC10x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y1E[];
extern void _ZN3ccc9CC10x13y13pqrEv();
extern void _ZN3ccc9CC10x13y13abcEv();
extern void _ZN3ccc9CC10x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y13efgEv,_ZThn4_N3ccc9CC10x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y13efgEv,_ZThn4_N3ccc9CC10x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y1E[];
Class_Descriptor cd__ZN3ccc9CC10x13y1E = {  "_ZN3ccc9CC10x13y1E", // class name
  bases__ZN3ccc9CC10x13y1E, 2,
  &(vtc__ZN3ccc9CC10x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y2  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC10x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y23pqrEv
  ~CC10x13y2(); // tgen
  CC10x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y2E) C1{ BC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y23efgEv");}
void  ccc::CC10x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y23abcEv");}
void  ccc::CC10x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y23pqrEv");}
ccc::CC10x13y2 ::~CC10x13y2(){ note_dtor("_ZN3ccc9CC10x13y2E", this);} // tgen
ccc::CC10x13y2 ::CC10x13y2(){ note_ctor("_ZN3ccc9CC10x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y2E, buf);
    ::ccc::CC10x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y2E);
    dp->::ccc::CC10x13y2::~CC10x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y2E(Test__ZN3ccc9CC10x13y2E, "_ZN3ccc9CC10x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y2C1Ev();
extern void _ZN3ccc9CC10x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y2E[] = {
  NSPAIR(_ZN3ccc9CC10x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y2E[];
extern void _ZN3ccc9CC10x13y23pqrEv();
extern void _ZN3ccc9CC10x13y23abcEv();
extern void _ZN3ccc9CC10x13y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y23efgEv,_ZThn4_N3ccc9CC10x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y23efgEv,_ZThn4_N3ccc9CC10x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y2E[];
Class_Descriptor cd__ZN3ccc9CC10x13y2E = {  "_ZN3ccc9CC10x13y2E", // class name
  bases__ZN3ccc9CC10x13y2E, 2,
  &(vtc__ZN3ccc9CC10x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y3  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC10x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x13y33abcEv
  ~CC10x13y3(); // tgen
  CC10x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y3E) C1{ BC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y33efgEv");}
void  ccc::CC10x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y33pqrEv");}
void  ccc::CC10x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y33abcEv");}
ccc::CC10x13y3 ::~CC10x13y3(){ note_dtor("_ZN3ccc9CC10x13y3E", this);} // tgen
ccc::CC10x13y3 ::CC10x13y3(){ note_ctor("_ZN3ccc9CC10x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y3E, buf);
    ::ccc::CC10x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y3E);
    dp->::ccc::CC10x13y3::~CC10x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y3E(Test__ZN3ccc9CC10x13y3E, "_ZN3ccc9CC10x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y3C1Ev();
extern void _ZN3ccc9CC10x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y3E[] = {
  NSPAIR(_ZN3ccc9CC10x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y3E[];
extern void _ZN3ccc9CC10x13y33pqrEv();
extern void _ZN3ccc9CC10x13y33abcEv();
extern void _ZN3ccc9CC10x13y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y33efgEv,_ZThn4_N3ccc9CC10x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y33efgEv,_ZThn4_N3ccc9CC10x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y3E[];
Class_Descriptor cd__ZN3ccc9CC10x13y3E = {  "_ZN3ccc9CC10x13y3E", // class name
  bases__ZN3ccc9CC10x13y3E, 2,
  &(vtc__ZN3ccc9CC10x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y4  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC10x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x13y43efgEv
  ~CC10x13y4(); // tgen
  CC10x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y4E) C1{ BC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y43pqrEv");}
void  ccc::CC10x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y43abcEv");}
void  ccc::CC10x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y43efgEv");}
ccc::CC10x13y4 ::~CC10x13y4(){ note_dtor("_ZN3ccc9CC10x13y4E", this);} // tgen
ccc::CC10x13y4 ::CC10x13y4(){ note_ctor("_ZN3ccc9CC10x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y4E, buf);
    ::ccc::CC10x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y4E);
    dp->::ccc::CC10x13y4::~CC10x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y4E(Test__ZN3ccc9CC10x13y4E, "_ZN3ccc9CC10x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y4C1Ev();
extern void _ZN3ccc9CC10x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y4E[] = {
  NSPAIR(_ZN3ccc9CC10x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y4E[];
extern void _ZN3ccc9CC10x13y43pqrEv();
extern void _ZN3ccc9CC10x13y43abcEv();
extern void _ZN3ccc9CC10x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y43efgEv,_ZThn4_N3ccc9CC10x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y43efgEv,_ZThn4_N3ccc9CC10x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y4E[];
Class_Descriptor cd__ZN3ccc9CC10x13y4E = {  "_ZN3ccc9CC10x13y4E", // class name
  bases__ZN3ccc9CC10x13y4E, 2,
  &(vtc__ZN3ccc9CC10x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y5  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC10x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x13y53abcEv
  ~CC10x13y5(); // tgen
  CC10x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y5E) C1{ BC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y53pqrEv");}
void  ccc::CC10x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y53efgEv");}
void  ccc::CC10x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y53abcEv");}
ccc::CC10x13y5 ::~CC10x13y5(){ note_dtor("_ZN3ccc9CC10x13y5E", this);} // tgen
ccc::CC10x13y5 ::CC10x13y5(){ note_ctor("_ZN3ccc9CC10x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y5E, buf);
    ::ccc::CC10x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y5E);
    dp->::ccc::CC10x13y5::~CC10x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y5E(Test__ZN3ccc9CC10x13y5E, "_ZN3ccc9CC10x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y5C1Ev();
extern void _ZN3ccc9CC10x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y5E[] = {
  NSPAIR(_ZN3ccc9CC10x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y5E[];
extern void _ZN3ccc9CC10x13y53pqrEv();
extern void _ZN3ccc9CC10x13y53abcEv();
extern void _ZN3ccc9CC10x13y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y53efgEv,_ZThn4_N3ccc9CC10x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y53efgEv,_ZThn4_N3ccc9CC10x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y5E[];
Class_Descriptor cd__ZN3ccc9CC10x13y5E = {  "_ZN3ccc9CC10x13y5E", // class name
  bases__ZN3ccc9CC10x13y5E, 2,
  &(vtc__ZN3ccc9CC10x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y6  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC10x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x13y63efgEv
  ~CC10x13y6(); // tgen
  CC10x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y6E) C1{ BC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y63abcEv");}
void  ccc::CC10x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y63efgEv");}
ccc::CC10x13y6 ::~CC10x13y6(){ note_dtor("_ZN3ccc9CC10x13y6E", this);} // tgen
ccc::CC10x13y6 ::CC10x13y6(){ note_ctor("_ZN3ccc9CC10x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y6E, buf);
    ::ccc::CC10x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y6E);
    dp->::ccc::CC10x13y6::~CC10x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y6E(Test__ZN3ccc9CC10x13y6E, "_ZN3ccc9CC10x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y6C1Ev();
extern void _ZN3ccc9CC10x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y6E[] = {
  NSPAIR(_ZN3ccc9CC10x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x13y63abcEv();
extern void _ZN3ccc9CC10x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y63efgEv,_ZThn4_N3ccc9CC10x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y63efgEv,_ZThn4_N3ccc9CC10x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y6E[];
Class_Descriptor cd__ZN3ccc9CC10x13y6E = {  "_ZN3ccc9CC10x13y6E", // class name
  bases__ZN3ccc9CC10x13y6E, 2,
  &(vtc__ZN3ccc9CC10x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y7  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC10x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y73pqrEv
  ~CC10x13y7(); // tgen
  CC10x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y7E) C1{ BC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y73abcEv");}
void  ccc::CC10x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y73pqrEv");}
ccc::CC10x13y7 ::~CC10x13y7(){ note_dtor("_ZN3ccc9CC10x13y7E", this);} // tgen
ccc::CC10x13y7 ::CC10x13y7(){ note_ctor("_ZN3ccc9CC10x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y7E, buf);
    ::ccc::CC10x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y7E);
    dp->::ccc::CC10x13y7::~CC10x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y7E(Test__ZN3ccc9CC10x13y7E, "_ZN3ccc9CC10x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y7C1Ev();
extern void _ZN3ccc9CC10x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y7E[] = {
  NSPAIR(_ZN3ccc9CC10x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y7E[];
extern void _ZN3ccc9CC10x13y73pqrEv();
extern void _ZN3ccc9CC10x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y7E[];
Class_Descriptor cd__ZN3ccc9CC10x13y7E = {  "_ZN3ccc9CC10x13y7E", // class name
  bases__ZN3ccc9CC10x13y7E, 2,
  &(vtc__ZN3ccc9CC10x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y8  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC10x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x13y83abcEv
  ~CC10x13y8(); // tgen
  CC10x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y8E) C1{ BC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y83efgEv");}
void  ccc::CC10x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x13y83abcEv");}
ccc::CC10x13y8 ::~CC10x13y8(){ note_dtor("_ZN3ccc9CC10x13y8E", this);} // tgen
ccc::CC10x13y8 ::CC10x13y8(){ note_ctor("_ZN3ccc9CC10x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y8E, buf);
    ::ccc::CC10x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y8E);
    dp->::ccc::CC10x13y8::~CC10x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y8E(Test__ZN3ccc9CC10x13y8E, "_ZN3ccc9CC10x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y8C1Ev();
extern void _ZN3ccc9CC10x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y8E[] = {
  NSPAIR(_ZN3ccc9CC10x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x13y83abcEv();
extern void _ZN3ccc9CC10x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y83efgEv,_ZThn4_N3ccc9CC10x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y83efgEv,_ZThn4_N3ccc9CC10x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y8E[];
Class_Descriptor cd__ZN3ccc9CC10x13y8E = {  "_ZN3ccc9CC10x13y8E", // class name
  bases__ZN3ccc9CC10x13y8E, 2,
  &(vtc__ZN3ccc9CC10x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y9  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC10x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x13y93pqrEv
  ~CC10x13y9(); // tgen
  CC10x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x13y9E) C1{ BC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x13y93efgEv");}
void  ccc::CC10x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x13y93pqrEv");}
ccc::CC10x13y9 ::~CC10x13y9(){ note_dtor("_ZN3ccc9CC10x13y9E", this);} // tgen
ccc::CC10x13y9 ::CC10x13y9(){ note_ctor("_ZN3ccc9CC10x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x13y9E, buf);
    ::ccc::CC10x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x13y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC10x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x13y9E);
    dp->::ccc::CC10x13y9::~CC10x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x13y9E(Test__ZN3ccc9CC10x13y9E, "_ZN3ccc9CC10x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x13y9C1Ev();
extern void _ZN3ccc9CC10x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x13y9E[] = {
  NSPAIR(_ZN3ccc9CC10x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC10x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y9E[];
extern void _ZN3ccc9CC10x13y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x13y93efgEv,_ZThn4_N3ccc9CC10x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x13y93efgEv,_ZThn4_N3ccc9CC10x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x13y9E[];
Class_Descriptor cd__ZN3ccc9CC10x13y9E = {  "_ZN3ccc9CC10x13y9E", // class name
  bases__ZN3ccc9CC10x13y9E, 2,
  &(vtc__ZN3ccc9CC10x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y10  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC10x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x13y103abcEv
  ~CC10x13y10(); // tgen
  CC10x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y10E) C1{ BC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x13y103pqrEv");}
void  ccc::CC10x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x13y103abcEv");}
ccc::CC10x13y10 ::~CC10x13y10(){ note_dtor("_ZN3ccc10CC10x13y10E", this);} // tgen
ccc::CC10x13y10 ::CC10x13y10(){ note_ctor("_ZN3ccc10CC10x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y10E, buf);
    ::ccc::CC10x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y10E);
    dp->::ccc::CC10x13y10::~CC10x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y10E(Test__ZN3ccc10CC10x13y10E, "_ZN3ccc10CC10x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y10C1Ev();
extern void _ZN3ccc10CC10x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y10E[] = {
  NSPAIR(_ZN3ccc10CC10x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y10E[];
extern void _ZN3ccc10CC10x13y103pqrEv();
extern void _ZN3ccc10CC10x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y10E[];
Class_Descriptor cd__ZN3ccc10CC10x13y10E = {  "_ZN3ccc10CC10x13y10E", // class name
  bases__ZN3ccc10CC10x13y10E, 2,
  &(vtc__ZN3ccc10CC10x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y11  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC10x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x13y113efgEv
  ~CC10x13y11(); // tgen
  CC10x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y11E) C1{ BC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x13y113pqrEv");}
void  ccc::CC10x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x13y113efgEv");}
ccc::CC10x13y11 ::~CC10x13y11(){ note_dtor("_ZN3ccc10CC10x13y11E", this);} // tgen
ccc::CC10x13y11 ::CC10x13y11(){ note_ctor("_ZN3ccc10CC10x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y11E, buf);
    ::ccc::CC10x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y11E);
    dp->::ccc::CC10x13y11::~CC10x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y11E(Test__ZN3ccc10CC10x13y11E, "_ZN3ccc10CC10x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y11C1Ev();
extern void _ZN3ccc10CC10x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y11E[] = {
  NSPAIR(_ZN3ccc10CC10x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y11E[];
extern void _ZN3ccc10CC10x13y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x13y113efgEv,_ZThn4_N3ccc10CC10x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x13y113efgEv,_ZThn4_N3ccc10CC10x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y11E[];
Class_Descriptor cd__ZN3ccc10CC10x13y11E = {  "_ZN3ccc10CC10x13y11E", // class name
  bases__ZN3ccc10CC10x13y11E, 2,
  &(vtc__ZN3ccc10CC10x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y12  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC10x13y123abcEv
  ~CC10x13y12(); // tgen
  CC10x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y12E) C1{ BC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC10x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x13y123abcEv");}
ccc::CC10x13y12 ::~CC10x13y12(){ note_dtor("_ZN3ccc10CC10x13y12E", this);} // tgen
ccc::CC10x13y12 ::CC10x13y12(){ note_ctor("_ZN3ccc10CC10x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y12E, buf);
    ::ccc::CC10x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y12E);
    dp->::ccc::CC10x13y12::~CC10x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y12E(Test__ZN3ccc10CC10x13y12E, "_ZN3ccc10CC10x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y12C1Ev();
extern void _ZN3ccc10CC10x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y12E[] = {
  NSPAIR(_ZN3ccc10CC10x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y12E[];
Class_Descriptor cd__ZN3ccc10CC10x13y12E = {  "_ZN3ccc10CC10x13y12E", // class name
  bases__ZN3ccc10CC10x13y12E, 2,
  &(vtc__ZN3ccc10CC10x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y13  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC10x13y133efgEv
  ~CC10x13y13(); // tgen
  CC10x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y13E) C1{ BC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC10x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x13y133efgEv");}
ccc::CC10x13y13 ::~CC10x13y13(){ note_dtor("_ZN3ccc10CC10x13y13E", this);} // tgen
ccc::CC10x13y13 ::CC10x13y13(){ note_ctor("_ZN3ccc10CC10x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y13E, buf);
    ::ccc::CC10x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y13E);
    dp->::ccc::CC10x13y13::~CC10x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y13E(Test__ZN3ccc10CC10x13y13E, "_ZN3ccc10CC10x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y13C1Ev();
extern void _ZN3ccc10CC10x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y13E[] = {
  NSPAIR(_ZN3ccc10CC10x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x13y133efgEv,_ZThn4_N3ccc10CC10x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x13y133efgEv,_ZThn4_N3ccc10CC10x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y13E[];
Class_Descriptor cd__ZN3ccc10CC10x13y13E = {  "_ZN3ccc10CC10x13y13E", // class name
  bases__ZN3ccc10CC10x13y13E, 2,
  &(vtc__ZN3ccc10CC10x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y14  : ::ccc::AA10 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC10x13y143pqrEv
  ~CC10x13y14(); // tgen
  CC10x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y14E) C1{ BC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC10x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x13y143pqrEv");}
ccc::CC10x13y14 ::~CC10x13y14(){ note_dtor("_ZN3ccc10CC10x13y14E", this);} // tgen
ccc::CC10x13y14 ::CC10x13y14(){ note_ctor("_ZN3ccc10CC10x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y14E, buf);
    ::ccc::CC10x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y14E);
    dp->::ccc::CC10x13y14::~CC10x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y14E(Test__ZN3ccc10CC10x13y14E, "_ZN3ccc10CC10x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y14C1Ev();
extern void _ZN3ccc10CC10x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y14E[] = {
  NSPAIR(_ZN3ccc10CC10x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y14E[];
extern void _ZN3ccc10CC10x13y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y14E[];
Class_Descriptor cd__ZN3ccc10CC10x13y14E = {  "_ZN3ccc10CC10x13y14E", // class name
  bases__ZN3ccc10CC10x13y14E, 2,
  &(vtc__ZN3ccc10CC10x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x13y15  : ::ccc::AA10 , ::ccc::BB13 {
  ~CC10x13y15(); // tgen
  CC10x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x13y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC10x13y15 ::~CC10x13y15(){ note_dtor("_ZN3ccc10CC10x13y15E", this);} // tgen
ccc::CC10x13y15 ::CC10x13y15(){ note_ctor("_ZN3ccc10CC10x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x13y15E, buf);
    ::ccc::CC10x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x13y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC10x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x13y15E);
    dp->::ccc::CC10x13y15::~CC10x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x13y15E(Test__ZN3ccc10CC10x13y15E, "_ZN3ccc10CC10x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x13y15C1Ev();
extern void _ZN3ccc10CC10x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x13y15E[] = {
  NSPAIR(_ZN3ccc10CC10x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC10x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x13y15E[];
Class_Descriptor cd__ZN3ccc10CC10x13y15E = {  "_ZN3ccc10CC10x13y15E", // class name
  bases__ZN3ccc10CC10x13y15E, 2,
  &(vtc__ZN3ccc10CC10x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y0  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC10x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y03pqrEv
  ~CC10x14y0(); // tgen
  CC10x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y0E) C1{ BC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y03abcEv");}
void  ccc::CC10x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y03efgEv");}
void  ccc::CC10x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y03pqrEv");}
ccc::CC10x14y0 ::~CC10x14y0(){ note_dtor("_ZN3ccc9CC10x14y0E", this);} // tgen
ccc::CC10x14y0 ::CC10x14y0(){ note_ctor("_ZN3ccc9CC10x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y0E, buf);
    ::ccc::CC10x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y0E);
    dp->::ccc::CC10x14y0::~CC10x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y0E(Test__ZN3ccc9CC10x14y0E, "_ZN3ccc9CC10x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y0C1Ev();
extern void _ZN3ccc9CC10x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y0E[] = {
  NSPAIR(_ZN3ccc9CC10x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y0E[];
extern void _ZN3ccc9CC10x14y03pqrEv();
extern void _ZN3ccc9CC10x14y03abcEv();
extern void _ZN3ccc9CC10x14y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y03pqrEv,_ZThn4_N3ccc9CC10x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y03pqrEv,_ZThn4_N3ccc9CC10x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y0E[];
Class_Descriptor cd__ZN3ccc9CC10x14y0E = {  "_ZN3ccc9CC10x14y0E", // class name
  bases__ZN3ccc9CC10x14y0E, 2,
  &(vtc__ZN3ccc9CC10x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y1  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC10x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x14y13efgEv
  ~CC10x14y1(); // tgen
  CC10x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y1E) C1{ BC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y13abcEv");}
void  ccc::CC10x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y13pqrEv");}
void  ccc::CC10x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y13efgEv");}
ccc::CC10x14y1 ::~CC10x14y1(){ note_dtor("_ZN3ccc9CC10x14y1E", this);} // tgen
ccc::CC10x14y1 ::CC10x14y1(){ note_ctor("_ZN3ccc9CC10x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y1E, buf);
    ::ccc::CC10x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y1E);
    dp->::ccc::CC10x14y1::~CC10x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y1E(Test__ZN3ccc9CC10x14y1E, "_ZN3ccc9CC10x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y1C1Ev();
extern void _ZN3ccc9CC10x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y1E[] = {
  NSPAIR(_ZN3ccc9CC10x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y1E[];
extern void _ZN3ccc9CC10x14y13pqrEv();
extern void _ZN3ccc9CC10x14y13abcEv();
extern void _ZN3ccc9CC10x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y13pqrEv,_ZThn4_N3ccc9CC10x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y13pqrEv,_ZThn4_N3ccc9CC10x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y1E[];
Class_Descriptor cd__ZN3ccc9CC10x14y1E = {  "_ZN3ccc9CC10x14y1E", // class name
  bases__ZN3ccc9CC10x14y1E, 2,
  &(vtc__ZN3ccc9CC10x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y2  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC10x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y23pqrEv
  ~CC10x14y2(); // tgen
  CC10x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y2E) C1{ BC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y23efgEv");}
void  ccc::CC10x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y23abcEv");}
void  ccc::CC10x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y23pqrEv");}
ccc::CC10x14y2 ::~CC10x14y2(){ note_dtor("_ZN3ccc9CC10x14y2E", this);} // tgen
ccc::CC10x14y2 ::CC10x14y2(){ note_ctor("_ZN3ccc9CC10x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y2E, buf);
    ::ccc::CC10x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y2E);
    dp->::ccc::CC10x14y2::~CC10x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y2E(Test__ZN3ccc9CC10x14y2E, "_ZN3ccc9CC10x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y2C1Ev();
extern void _ZN3ccc9CC10x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y2E[] = {
  NSPAIR(_ZN3ccc9CC10x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y2E[];
extern void _ZN3ccc9CC10x14y23pqrEv();
extern void _ZN3ccc9CC10x14y23abcEv();
extern void _ZN3ccc9CC10x14y23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y23pqrEv,_ZThn4_N3ccc9CC10x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y23efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y23pqrEv,_ZThn4_N3ccc9CC10x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y2E[];
Class_Descriptor cd__ZN3ccc9CC10x14y2E = {  "_ZN3ccc9CC10x14y2E", // class name
  bases__ZN3ccc9CC10x14y2E, 2,
  &(vtc__ZN3ccc9CC10x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y3  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC10x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x14y33abcEv
  ~CC10x14y3(); // tgen
  CC10x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y3E) C1{ BC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y33efgEv");}
void  ccc::CC10x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y33pqrEv");}
void  ccc::CC10x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y33abcEv");}
ccc::CC10x14y3 ::~CC10x14y3(){ note_dtor("_ZN3ccc9CC10x14y3E", this);} // tgen
ccc::CC10x14y3 ::CC10x14y3(){ note_ctor("_ZN3ccc9CC10x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y3E, buf);
    ::ccc::CC10x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y3E);
    dp->::ccc::CC10x14y3::~CC10x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y3E(Test__ZN3ccc9CC10x14y3E, "_ZN3ccc9CC10x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y3C1Ev();
extern void _ZN3ccc9CC10x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y3E[] = {
  NSPAIR(_ZN3ccc9CC10x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y3E[];
extern void _ZN3ccc9CC10x14y33pqrEv();
extern void _ZN3ccc9CC10x14y33abcEv();
extern void _ZN3ccc9CC10x14y33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y33pqrEv,_ZThn4_N3ccc9CC10x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y33efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y33pqrEv,_ZThn4_N3ccc9CC10x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y3E[];
Class_Descriptor cd__ZN3ccc9CC10x14y3E = {  "_ZN3ccc9CC10x14y3E", // class name
  bases__ZN3ccc9CC10x14y3E, 2,
  &(vtc__ZN3ccc9CC10x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y4  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC10x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x14y43efgEv
  ~CC10x14y4(); // tgen
  CC10x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y4E) C1{ BC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y43pqrEv");}
void  ccc::CC10x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y43abcEv");}
void  ccc::CC10x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y43efgEv");}
ccc::CC10x14y4 ::~CC10x14y4(){ note_dtor("_ZN3ccc9CC10x14y4E", this);} // tgen
ccc::CC10x14y4 ::CC10x14y4(){ note_ctor("_ZN3ccc9CC10x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y4E, buf);
    ::ccc::CC10x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y4E);
    dp->::ccc::CC10x14y4::~CC10x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y4E(Test__ZN3ccc9CC10x14y4E, "_ZN3ccc9CC10x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y4C1Ev();
extern void _ZN3ccc9CC10x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y4E[] = {
  NSPAIR(_ZN3ccc9CC10x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y4E[];
extern void _ZN3ccc9CC10x14y43pqrEv();
extern void _ZN3ccc9CC10x14y43abcEv();
extern void _ZN3ccc9CC10x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y43pqrEv,_ZThn4_N3ccc9CC10x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y43pqrEv,_ZThn4_N3ccc9CC10x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y4E[];
Class_Descriptor cd__ZN3ccc9CC10x14y4E = {  "_ZN3ccc9CC10x14y4E", // class name
  bases__ZN3ccc9CC10x14y4E, 2,
  &(vtc__ZN3ccc9CC10x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y5  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC10x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x14y53abcEv
  ~CC10x14y5(); // tgen
  CC10x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y5E) C1{ BC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y53pqrEv");}
void  ccc::CC10x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y53efgEv");}
void  ccc::CC10x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y53abcEv");}
ccc::CC10x14y5 ::~CC10x14y5(){ note_dtor("_ZN3ccc9CC10x14y5E", this);} // tgen
ccc::CC10x14y5 ::CC10x14y5(){ note_ctor("_ZN3ccc9CC10x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y5E, buf);
    ::ccc::CC10x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y5E);
    dp->::ccc::CC10x14y5::~CC10x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y5E(Test__ZN3ccc9CC10x14y5E, "_ZN3ccc9CC10x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y5C1Ev();
extern void _ZN3ccc9CC10x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y5E[] = {
  NSPAIR(_ZN3ccc9CC10x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y5E[];
extern void _ZN3ccc9CC10x14y53pqrEv();
extern void _ZN3ccc9CC10x14y53abcEv();
extern void _ZN3ccc9CC10x14y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y53pqrEv,_ZThn4_N3ccc9CC10x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y53pqrEv,_ZThn4_N3ccc9CC10x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y5E[];
Class_Descriptor cd__ZN3ccc9CC10x14y5E = {  "_ZN3ccc9CC10x14y5E", // class name
  bases__ZN3ccc9CC10x14y5E, 2,
  &(vtc__ZN3ccc9CC10x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y6  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC10x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x14y63efgEv
  ~CC10x14y6(); // tgen
  CC10x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y6E) C1{ BC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y63abcEv");}
void  ccc::CC10x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y63efgEv");}
ccc::CC10x14y6 ::~CC10x14y6(){ note_dtor("_ZN3ccc9CC10x14y6E", this);} // tgen
ccc::CC10x14y6 ::CC10x14y6(){ note_ctor("_ZN3ccc9CC10x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y6E, buf);
    ::ccc::CC10x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y6E);
    dp->::ccc::CC10x14y6::~CC10x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y6E(Test__ZN3ccc9CC10x14y6E, "_ZN3ccc9CC10x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y6C1Ev();
extern void _ZN3ccc9CC10x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y6E[] = {
  NSPAIR(_ZN3ccc9CC10x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x14y63abcEv();
extern void _ZN3ccc9CC10x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y6E[];
Class_Descriptor cd__ZN3ccc9CC10x14y6E = {  "_ZN3ccc9CC10x14y6E", // class name
  bases__ZN3ccc9CC10x14y6E, 2,
  &(vtc__ZN3ccc9CC10x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y7  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC10x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y73pqrEv
  ~CC10x14y7(); // tgen
  CC10x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y7E) C1{ BC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y73abcEv");}
void  ccc::CC10x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y73pqrEv");}
ccc::CC10x14y7 ::~CC10x14y7(){ note_dtor("_ZN3ccc9CC10x14y7E", this);} // tgen
ccc::CC10x14y7 ::CC10x14y7(){ note_ctor("_ZN3ccc9CC10x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y7E, buf);
    ::ccc::CC10x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y7E);
    dp->::ccc::CC10x14y7::~CC10x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y7E(Test__ZN3ccc9CC10x14y7E, "_ZN3ccc9CC10x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y7C1Ev();
extern void _ZN3ccc9CC10x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y7E[] = {
  NSPAIR(_ZN3ccc9CC10x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y7E[];
extern void _ZN3ccc9CC10x14y73pqrEv();
extern void _ZN3ccc9CC10x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y73pqrEv,_ZThn4_N3ccc9CC10x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y73pqrEv,_ZThn4_N3ccc9CC10x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y7E[];
Class_Descriptor cd__ZN3ccc9CC10x14y7E = {  "_ZN3ccc9CC10x14y7E", // class name
  bases__ZN3ccc9CC10x14y7E, 2,
  &(vtc__ZN3ccc9CC10x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y8  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC10x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x14y83abcEv
  ~CC10x14y8(); // tgen
  CC10x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y8E) C1{ BC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y83efgEv");}
void  ccc::CC10x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x14y83abcEv");}
ccc::CC10x14y8 ::~CC10x14y8(){ note_dtor("_ZN3ccc9CC10x14y8E", this);} // tgen
ccc::CC10x14y8 ::CC10x14y8(){ note_ctor("_ZN3ccc9CC10x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y8E, buf);
    ::ccc::CC10x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y8E);
    dp->::ccc::CC10x14y8::~CC10x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y8E(Test__ZN3ccc9CC10x14y8E, "_ZN3ccc9CC10x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y8C1Ev();
extern void _ZN3ccc9CC10x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y8E[] = {
  NSPAIR(_ZN3ccc9CC10x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x14y83abcEv();
extern void _ZN3ccc9CC10x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y8E[];
Class_Descriptor cd__ZN3ccc9CC10x14y8E = {  "_ZN3ccc9CC10x14y8E", // class name
  bases__ZN3ccc9CC10x14y8E, 2,
  &(vtc__ZN3ccc9CC10x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y9  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC10x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x14y93pqrEv
  ~CC10x14y9(); // tgen
  CC10x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x14y9E) C1{ BC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x14y93efgEv");}
void  ccc::CC10x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x14y93pqrEv");}
ccc::CC10x14y9 ::~CC10x14y9(){ note_dtor("_ZN3ccc9CC10x14y9E", this);} // tgen
ccc::CC10x14y9 ::CC10x14y9(){ note_ctor("_ZN3ccc9CC10x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x14y9E, buf);
    ::ccc::CC10x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x14y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC10x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x14y9E);
    dp->::ccc::CC10x14y9::~CC10x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x14y9E(Test__ZN3ccc9CC10x14y9E, "_ZN3ccc9CC10x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x14y9C1Ev();
extern void _ZN3ccc9CC10x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x14y9E[] = {
  NSPAIR(_ZN3ccc9CC10x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC10x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y9E[];
extern void _ZN3ccc9CC10x14y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC10x14y93pqrEv,_ZThn4_N3ccc9CC10x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC10x14y93pqrEv,_ZThn4_N3ccc9CC10x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x14y9E[];
Class_Descriptor cd__ZN3ccc9CC10x14y9E = {  "_ZN3ccc9CC10x14y9E", // class name
  bases__ZN3ccc9CC10x14y9E, 2,
  &(vtc__ZN3ccc9CC10x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y10  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC10x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x14y103abcEv
  ~CC10x14y10(); // tgen
  CC10x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y10E) C1{ BC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x14y103pqrEv");}
void  ccc::CC10x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x14y103abcEv");}
ccc::CC10x14y10 ::~CC10x14y10(){ note_dtor("_ZN3ccc10CC10x14y10E", this);} // tgen
ccc::CC10x14y10 ::CC10x14y10(){ note_ctor("_ZN3ccc10CC10x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y10E, buf);
    ::ccc::CC10x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y10E);
    dp->::ccc::CC10x14y10::~CC10x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y10E(Test__ZN3ccc10CC10x14y10E, "_ZN3ccc10CC10x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y10C1Ev();
extern void _ZN3ccc10CC10x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y10E[] = {
  NSPAIR(_ZN3ccc10CC10x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y10E[];
extern void _ZN3ccc10CC10x14y103pqrEv();
extern void _ZN3ccc10CC10x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x14y103pqrEv,_ZThn4_N3ccc10CC10x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x14y103pqrEv,_ZThn4_N3ccc10CC10x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y10E[];
Class_Descriptor cd__ZN3ccc10CC10x14y10E = {  "_ZN3ccc10CC10x14y10E", // class name
  bases__ZN3ccc10CC10x14y10E, 2,
  &(vtc__ZN3ccc10CC10x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y11  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC10x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x14y113efgEv
  ~CC10x14y11(); // tgen
  CC10x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y11E) C1{ BC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x14y113pqrEv");}
void  ccc::CC10x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x14y113efgEv");}
ccc::CC10x14y11 ::~CC10x14y11(){ note_dtor("_ZN3ccc10CC10x14y11E", this);} // tgen
ccc::CC10x14y11 ::CC10x14y11(){ note_ctor("_ZN3ccc10CC10x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y11E, buf);
    ::ccc::CC10x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y11E);
    dp->::ccc::CC10x14y11::~CC10x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y11E(Test__ZN3ccc10CC10x14y11E, "_ZN3ccc10CC10x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y11C1Ev();
extern void _ZN3ccc10CC10x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y11E[] = {
  NSPAIR(_ZN3ccc10CC10x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y11E[];
extern void _ZN3ccc10CC10x14y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x14y113pqrEv,_ZThn4_N3ccc10CC10x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x14y113pqrEv,_ZThn4_N3ccc10CC10x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y11E[];
Class_Descriptor cd__ZN3ccc10CC10x14y11E = {  "_ZN3ccc10CC10x14y11E", // class name
  bases__ZN3ccc10CC10x14y11E, 2,
  &(vtc__ZN3ccc10CC10x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y12  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC10x14y123abcEv
  ~CC10x14y12(); // tgen
  CC10x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y12E) C1{ BC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC10x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x14y123abcEv");}
ccc::CC10x14y12 ::~CC10x14y12(){ note_dtor("_ZN3ccc10CC10x14y12E", this);} // tgen
ccc::CC10x14y12 ::CC10x14y12(){ note_ctor("_ZN3ccc10CC10x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y12E, buf);
    ::ccc::CC10x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y12E);
    dp->::ccc::CC10x14y12::~CC10x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y12E(Test__ZN3ccc10CC10x14y12E, "_ZN3ccc10CC10x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y12C1Ev();
extern void _ZN3ccc10CC10x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y12E[] = {
  NSPAIR(_ZN3ccc10CC10x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y12E[];
Class_Descriptor cd__ZN3ccc10CC10x14y12E = {  "_ZN3ccc10CC10x14y12E", // class name
  bases__ZN3ccc10CC10x14y12E, 2,
  &(vtc__ZN3ccc10CC10x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y13  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC10x14y133efgEv
  ~CC10x14y13(); // tgen
  CC10x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y13E) C1{ BC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC10x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x14y133efgEv");}
ccc::CC10x14y13 ::~CC10x14y13(){ note_dtor("_ZN3ccc10CC10x14y13E", this);} // tgen
ccc::CC10x14y13 ::CC10x14y13(){ note_ctor("_ZN3ccc10CC10x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y13E, buf);
    ::ccc::CC10x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y13E);
    dp->::ccc::CC10x14y13::~CC10x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y13E(Test__ZN3ccc10CC10x14y13E, "_ZN3ccc10CC10x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y13C1Ev();
extern void _ZN3ccc10CC10x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y13E[] = {
  NSPAIR(_ZN3ccc10CC10x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y13E[];
Class_Descriptor cd__ZN3ccc10CC10x14y13E = {  "_ZN3ccc10CC10x14y13E", // class name
  bases__ZN3ccc10CC10x14y13E, 2,
  &(vtc__ZN3ccc10CC10x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y14  : ::ccc::AA10 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC10x14y143pqrEv
  ~CC10x14y14(); // tgen
  CC10x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y14E) C1{ BC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC10x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x14y143pqrEv");}
ccc::CC10x14y14 ::~CC10x14y14(){ note_dtor("_ZN3ccc10CC10x14y14E", this);} // tgen
ccc::CC10x14y14 ::CC10x14y14(){ note_ctor("_ZN3ccc10CC10x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y14E, buf);
    ::ccc::CC10x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y14E);
    dp->::ccc::CC10x14y14::~CC10x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y14E(Test__ZN3ccc10CC10x14y14E, "_ZN3ccc10CC10x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y14C1Ev();
extern void _ZN3ccc10CC10x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y14E[] = {
  NSPAIR(_ZN3ccc10CC10x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y14E[];
extern void _ZN3ccc10CC10x14y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC10x14y143pqrEv,_ZThn4_N3ccc10CC10x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC10x14y143pqrEv,_ZThn4_N3ccc10CC10x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y14E[];
Class_Descriptor cd__ZN3ccc10CC10x14y14E = {  "_ZN3ccc10CC10x14y14E", // class name
  bases__ZN3ccc10CC10x14y14E, 2,
  &(vtc__ZN3ccc10CC10x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x14y15  : ::ccc::AA10 , ::ccc::BB14 {
  ~CC10x14y15(); // tgen
  CC10x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x14y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC10x14y15 ::~CC10x14y15(){ note_dtor("_ZN3ccc10CC10x14y15E", this);} // tgen
ccc::CC10x14y15 ::CC10x14y15(){ note_ctor("_ZN3ccc10CC10x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC10x14y15E, buf);
    ::ccc::CC10x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC10x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x14y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC10x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x14y15E);
    dp->::ccc::CC10x14y15::~CC10x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x14y15E(Test__ZN3ccc10CC10x14y15E, "_ZN3ccc10CC10x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC10x14y15C1Ev();
extern void _ZN3ccc10CC10x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x14y15E[] = {
  NSPAIR(_ZN3ccc10CC10x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC10x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x14y15E[];
Class_Descriptor cd__ZN3ccc10CC10x14y15E = {  "_ZN3ccc10CC10x14y15E", // class name
  bases__ZN3ccc10CC10x14y15E, 2,
  &(vtc__ZN3ccc10CC10x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC10x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y0  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC10x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC10x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y03pqrEv
  ~CC10x15y0(); // tgen
  CC10x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y0E) C1{ BC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y03abcEv");}
void  ccc::CC10x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y03efgEv");}
void  ccc::CC10x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y03pqrEv");}
ccc::CC10x15y0 ::~CC10x15y0(){ note_dtor("_ZN3ccc9CC10x15y0E", this);} // tgen
ccc::CC10x15y0 ::CC10x15y0(){ note_ctor("_ZN3ccc9CC10x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y0E, buf);
    ::ccc::CC10x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y0E);
    dp->::ccc::CC10x15y0::~CC10x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y0E(Test__ZN3ccc9CC10x15y0E, "_ZN3ccc9CC10x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y0C1Ev();
extern void _ZN3ccc9CC10x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y0E[] = {
  NSPAIR(_ZN3ccc9CC10x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y0E[];
extern void _ZN3ccc9CC10x15y03pqrEv();
extern void _ZN3ccc9CC10x15y03abcEv();
extern void _ZN3ccc9CC10x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y0E[];
Class_Descriptor cd__ZN3ccc9CC10x15y0E = {  "_ZN3ccc9CC10x15y0E", // class name
  bases__ZN3ccc9CC10x15y0E, 2,
  &(vtc__ZN3ccc9CC10x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y1  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC10x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x15y13efgEv
  ~CC10x15y1(); // tgen
  CC10x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y1E) C1{ BC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y13abcEv");}
void  ccc::CC10x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y13pqrEv");}
void  ccc::CC10x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y13efgEv");}
ccc::CC10x15y1 ::~CC10x15y1(){ note_dtor("_ZN3ccc9CC10x15y1E", this);} // tgen
ccc::CC10x15y1 ::CC10x15y1(){ note_ctor("_ZN3ccc9CC10x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y1E, buf);
    ::ccc::CC10x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y1E);
    dp->::ccc::CC10x15y1::~CC10x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y1E(Test__ZN3ccc9CC10x15y1E, "_ZN3ccc9CC10x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y1C1Ev();
extern void _ZN3ccc9CC10x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y1E[] = {
  NSPAIR(_ZN3ccc9CC10x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y1E[];
extern void _ZN3ccc9CC10x15y13pqrEv();
extern void _ZN3ccc9CC10x15y13abcEv();
extern void _ZN3ccc9CC10x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y1E[];
Class_Descriptor cd__ZN3ccc9CC10x15y1E = {  "_ZN3ccc9CC10x15y1E", // class name
  bases__ZN3ccc9CC10x15y1E, 2,
  &(vtc__ZN3ccc9CC10x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y2  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC10x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC10x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y23pqrEv
  ~CC10x15y2(); // tgen
  CC10x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y2E) C1{ BC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y23efgEv");}
void  ccc::CC10x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y23abcEv");}
void  ccc::CC10x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y23pqrEv");}
ccc::CC10x15y2 ::~CC10x15y2(){ note_dtor("_ZN3ccc9CC10x15y2E", this);} // tgen
ccc::CC10x15y2 ::CC10x15y2(){ note_ctor("_ZN3ccc9CC10x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y2E, buf);
    ::ccc::CC10x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y2E);
    dp->::ccc::CC10x15y2::~CC10x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y2E(Test__ZN3ccc9CC10x15y2E, "_ZN3ccc9CC10x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y2C1Ev();
extern void _ZN3ccc9CC10x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y2E[] = {
  NSPAIR(_ZN3ccc9CC10x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y2E[];
extern void _ZN3ccc9CC10x15y23pqrEv();
extern void _ZN3ccc9CC10x15y23abcEv();
extern void _ZN3ccc9CC10x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y2E[];
Class_Descriptor cd__ZN3ccc9CC10x15y2E = {  "_ZN3ccc9CC10x15y2E", // class name
  bases__ZN3ccc9CC10x15y2E, 2,
  &(vtc__ZN3ccc9CC10x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y3  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC10x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x15y33abcEv
  ~CC10x15y3(); // tgen
  CC10x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y3E) C1{ BC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y33efgEv");}
void  ccc::CC10x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y33pqrEv");}
void  ccc::CC10x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y33abcEv");}
ccc::CC10x15y3 ::~CC10x15y3(){ note_dtor("_ZN3ccc9CC10x15y3E", this);} // tgen
ccc::CC10x15y3 ::CC10x15y3(){ note_ctor("_ZN3ccc9CC10x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y3E, buf);
    ::ccc::CC10x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y3E);
    dp->::ccc::CC10x15y3::~CC10x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y3E(Test__ZN3ccc9CC10x15y3E, "_ZN3ccc9CC10x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y3C1Ev();
extern void _ZN3ccc9CC10x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y3E[] = {
  NSPAIR(_ZN3ccc9CC10x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y3E[];
extern void _ZN3ccc9CC10x15y33pqrEv();
extern void _ZN3ccc9CC10x15y33abcEv();
extern void _ZN3ccc9CC10x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y3E[];
Class_Descriptor cd__ZN3ccc9CC10x15y3E = {  "_ZN3ccc9CC10x15y3E", // class name
  bases__ZN3ccc9CC10x15y3E, 2,
  &(vtc__ZN3ccc9CC10x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y4  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC10x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC10x15y43efgEv
  ~CC10x15y4(); // tgen
  CC10x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y4E) C1{ BC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y43pqrEv");}
void  ccc::CC10x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y43abcEv");}
void  ccc::CC10x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y43efgEv");}
ccc::CC10x15y4 ::~CC10x15y4(){ note_dtor("_ZN3ccc9CC10x15y4E", this);} // tgen
ccc::CC10x15y4 ::CC10x15y4(){ note_ctor("_ZN3ccc9CC10x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y4E, buf);
    ::ccc::CC10x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y4E);
    dp->::ccc::CC10x15y4::~CC10x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y4E(Test__ZN3ccc9CC10x15y4E, "_ZN3ccc9CC10x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y4C1Ev();
extern void _ZN3ccc9CC10x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y4E[] = {
  NSPAIR(_ZN3ccc9CC10x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y4E[];
extern void _ZN3ccc9CC10x15y43pqrEv();
extern void _ZN3ccc9CC10x15y43abcEv();
extern void _ZN3ccc9CC10x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y4E[];
Class_Descriptor cd__ZN3ccc9CC10x15y4E = {  "_ZN3ccc9CC10x15y4E", // class name
  bases__ZN3ccc9CC10x15y4E, 2,
  &(vtc__ZN3ccc9CC10x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y5  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC10x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC10x15y53abcEv
  ~CC10x15y5(); // tgen
  CC10x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y5E) C1{ BC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y53pqrEv");}
void  ccc::CC10x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y53efgEv");}
void  ccc::CC10x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y53abcEv");}
ccc::CC10x15y5 ::~CC10x15y5(){ note_dtor("_ZN3ccc9CC10x15y5E", this);} // tgen
ccc::CC10x15y5 ::CC10x15y5(){ note_ctor("_ZN3ccc9CC10x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y5E, buf);
    ::ccc::CC10x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y5E);
    dp->::ccc::CC10x15y5::~CC10x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y5E(Test__ZN3ccc9CC10x15y5E, "_ZN3ccc9CC10x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y5C1Ev();
extern void _ZN3ccc9CC10x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y5E[] = {
  NSPAIR(_ZN3ccc9CC10x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y5E[];
extern void _ZN3ccc9CC10x15y53pqrEv();
extern void _ZN3ccc9CC10x15y53abcEv();
extern void _ZN3ccc9CC10x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y5E[];
Class_Descriptor cd__ZN3ccc9CC10x15y5E = {  "_ZN3ccc9CC10x15y5E", // class name
  bases__ZN3ccc9CC10x15y5E, 2,
  &(vtc__ZN3ccc9CC10x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y6  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC10x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC10x15y63efgEv
  ~CC10x15y6(); // tgen
  CC10x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y6E) C1{ BC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y63abcEv");}
void  ccc::CC10x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y63efgEv");}
ccc::CC10x15y6 ::~CC10x15y6(){ note_dtor("_ZN3ccc9CC10x15y6E", this);} // tgen
ccc::CC10x15y6 ::CC10x15y6(){ note_ctor("_ZN3ccc9CC10x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y6E, buf);
    ::ccc::CC10x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y6E);
    dp->::ccc::CC10x15y6::~CC10x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y6E(Test__ZN3ccc9CC10x15y6E, "_ZN3ccc9CC10x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y6C1Ev();
extern void _ZN3ccc9CC10x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y6E[] = {
  NSPAIR(_ZN3ccc9CC10x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x15y63abcEv();
extern void _ZN3ccc9CC10x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y6E[];
Class_Descriptor cd__ZN3ccc9CC10x15y6E = {  "_ZN3ccc9CC10x15y6E", // class name
  bases__ZN3ccc9CC10x15y6E, 2,
  &(vtc__ZN3ccc9CC10x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y7  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC10x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y73pqrEv
  ~CC10x15y7(); // tgen
  CC10x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y7E) C1{ BC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y73abcEv");}
void  ccc::CC10x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y73pqrEv");}
ccc::CC10x15y7 ::~CC10x15y7(){ note_dtor("_ZN3ccc9CC10x15y7E", this);} // tgen
ccc::CC10x15y7 ::CC10x15y7(){ note_ctor("_ZN3ccc9CC10x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y7E, buf);
    ::ccc::CC10x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y7E);
    dp->::ccc::CC10x15y7::~CC10x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y7E(Test__ZN3ccc9CC10x15y7E, "_ZN3ccc9CC10x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y7C1Ev();
extern void _ZN3ccc9CC10x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y7E[] = {
  NSPAIR(_ZN3ccc9CC10x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y7E[];
extern void _ZN3ccc9CC10x15y73pqrEv();
extern void _ZN3ccc9CC10x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y7E[];
Class_Descriptor cd__ZN3ccc9CC10x15y7E = {  "_ZN3ccc9CC10x15y7E", // class name
  bases__ZN3ccc9CC10x15y7E, 2,
  &(vtc__ZN3ccc9CC10x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y8  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC10x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC10x15y83abcEv
  ~CC10x15y8(); // tgen
  CC10x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y8E) C1{ BC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y83efgEv");}
void  ccc::CC10x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x15y83abcEv");}
ccc::CC10x15y8 ::~CC10x15y8(){ note_dtor("_ZN3ccc9CC10x15y8E", this);} // tgen
ccc::CC10x15y8 ::CC10x15y8(){ note_ctor("_ZN3ccc9CC10x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y8E, buf);
    ::ccc::CC10x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y8E);
    dp->::ccc::CC10x15y8::~CC10x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y8E(Test__ZN3ccc9CC10x15y8E, "_ZN3ccc9CC10x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y8C1Ev();
extern void _ZN3ccc9CC10x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y8E[] = {
  NSPAIR(_ZN3ccc9CC10x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9CC10x15y83abcEv();
extern void _ZN3ccc9CC10x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y8E[];
Class_Descriptor cd__ZN3ccc9CC10x15y8E = {  "_ZN3ccc9CC10x15y8E", // class name
  bases__ZN3ccc9CC10x15y8E, 2,
  &(vtc__ZN3ccc9CC10x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y9  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC10x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC10x15y93pqrEv
  ~CC10x15y9(); // tgen
  CC10x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC10x15y9E) C1{ BC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x15y93efgEv");}
void  ccc::CC10x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x15y93pqrEv");}
ccc::CC10x15y9 ::~CC10x15y9(){ note_dtor("_ZN3ccc9CC10x15y9E", this);} // tgen
ccc::CC10x15y9 ::CC10x15y9(){ note_ctor("_ZN3ccc9CC10x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC10x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC10x15y9E, buf);
    ::ccc::CC10x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC10x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x15y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9CC10x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC10x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x15y9E);
    dp->::ccc::CC10x15y9::~CC10x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x15y9E(Test__ZN3ccc9CC10x15y9E, "_ZN3ccc9CC10x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC10x15y9C1Ev();
extern void _ZN3ccc9CC10x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC10x15y9E[] = {
  NSPAIR(_ZN3ccc9CC10x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC10x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC10x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y9E[];
extern void _ZN3ccc9CC10x15y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9CC10x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x15y9E[];
Class_Descriptor cd__ZN3ccc9CC10x15y9E = {  "_ZN3ccc9CC10x15y9E", // class name
  bases__ZN3ccc9CC10x15y9E, 2,
  &(vtc__ZN3ccc9CC10x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC10x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y10  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC10x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC10x15y103abcEv
  ~CC10x15y10(); // tgen
  CC10x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y10E) C1{ BC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x15y103pqrEv");}
void  ccc::CC10x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x15y103abcEv");}
ccc::CC10x15y10 ::~CC10x15y10(){ note_dtor("_ZN3ccc10CC10x15y10E", this);} // tgen
ccc::CC10x15y10 ::CC10x15y10(){ note_ctor("_ZN3ccc10CC10x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y10E, buf);
    ::ccc::CC10x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y10E);
    dp->::ccc::CC10x15y10::~CC10x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y10E(Test__ZN3ccc10CC10x15y10E, "_ZN3ccc10CC10x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y10C1Ev();
extern void _ZN3ccc10CC10x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y10E[] = {
  NSPAIR(_ZN3ccc10CC10x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y10E[];
extern void _ZN3ccc10CC10x15y103pqrEv();
extern void _ZN3ccc10CC10x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y10E[];
Class_Descriptor cd__ZN3ccc10CC10x15y10E = {  "_ZN3ccc10CC10x15y10E", // class name
  bases__ZN3ccc10CC10x15y10E, 2,
  &(vtc__ZN3ccc10CC10x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y11  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC10x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC10x15y113efgEv
  ~CC10x15y11(); // tgen
  CC10x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y11E) C1{ BC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC10x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x15y113pqrEv");}
void  ccc::CC10x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x15y113efgEv");}
ccc::CC10x15y11 ::~CC10x15y11(){ note_dtor("_ZN3ccc10CC10x15y11E", this);} // tgen
ccc::CC10x15y11 ::CC10x15y11(){ note_ctor("_ZN3ccc10CC10x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y11E, buf);
    ::ccc::CC10x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y11E);
    dp->::ccc::CC10x15y11::~CC10x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y11E(Test__ZN3ccc10CC10x15y11E, "_ZN3ccc10CC10x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y11C1Ev();
extern void _ZN3ccc10CC10x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y11E[] = {
  NSPAIR(_ZN3ccc10CC10x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y11E[];
extern void _ZN3ccc10CC10x15y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y11E[];
Class_Descriptor cd__ZN3ccc10CC10x15y11E = {  "_ZN3ccc10CC10x15y11E", // class name
  bases__ZN3ccc10CC10x15y11E, 2,
  &(vtc__ZN3ccc10CC10x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y12  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC10x15y123abcEv
  ~CC10x15y12(); // tgen
  CC10x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y12E) C1{ BC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC10x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC10x15y123abcEv");}
ccc::CC10x15y12 ::~CC10x15y12(){ note_dtor("_ZN3ccc10CC10x15y12E", this);} // tgen
ccc::CC10x15y12 ::CC10x15y12(){ note_ctor("_ZN3ccc10CC10x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y12E, buf);
    ::ccc::CC10x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y12E);
    dp->::ccc::CC10x15y12::~CC10x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y12E(Test__ZN3ccc10CC10x15y12E, "_ZN3ccc10CC10x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y12C1Ev();
extern void _ZN3ccc10CC10x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y12E[] = {
  NSPAIR(_ZN3ccc10CC10x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc10CC10x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y12E[];
Class_Descriptor cd__ZN3ccc10CC10x15y12E = {  "_ZN3ccc10CC10x15y12E", // class name
  bases__ZN3ccc10CC10x15y12E, 2,
  &(vtc__ZN3ccc10CC10x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y13  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC10x15y133efgEv
  ~CC10x15y13(); // tgen
  CC10x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y13E) C1{ BC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC10x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC10x15y133efgEv");}
ccc::CC10x15y13 ::~CC10x15y13(){ note_dtor("_ZN3ccc10CC10x15y13E", this);} // tgen
ccc::CC10x15y13 ::CC10x15y13(){ note_ctor("_ZN3ccc10CC10x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y13E, buf);
    ::ccc::CC10x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y13E);
    dp->::ccc::CC10x15y13::~CC10x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y13E(Test__ZN3ccc10CC10x15y13E, "_ZN3ccc10CC10x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y13C1Ev();
extern void _ZN3ccc10CC10x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y13E[] = {
  NSPAIR(_ZN3ccc10CC10x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc10CC10x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y13E[];
Class_Descriptor cd__ZN3ccc10CC10x15y13E = {  "_ZN3ccc10CC10x15y13E", // class name
  bases__ZN3ccc10CC10x15y13E, 2,
  &(vtc__ZN3ccc10CC10x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y14  : ::ccc::AA10 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC10x15y143pqrEv
  ~CC10x15y14(); // tgen
  CC10x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y14E) C1{ BC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC10x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC10x15y143pqrEv");}
ccc::CC10x15y14 ::~CC10x15y14(){ note_dtor("_ZN3ccc10CC10x15y14E", this);} // tgen
ccc::CC10x15y14 ::CC10x15y14(){ note_ctor("_ZN3ccc10CC10x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y14E, buf);
    ::ccc::CC10x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y14E);
    dp->::ccc::CC10x15y14::~CC10x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y14E(Test__ZN3ccc10CC10x15y14E, "_ZN3ccc10CC10x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y14C1Ev();
extern void _ZN3ccc10CC10x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y14E[] = {
  NSPAIR(_ZN3ccc10CC10x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y14E[];
extern void _ZN3ccc10CC10x15y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC10x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y14E[];
Class_Descriptor cd__ZN3ccc10CC10x15y14E = {  "_ZN3ccc10CC10x15y14E", // class name
  bases__ZN3ccc10CC10x15y14E, 2,
  &(vtc__ZN3ccc10CC10x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC10x15y15  : ::ccc::AA10 , ::ccc::BB15 {
  ~CC10x15y15(); // tgen
  CC10x15y15(); // tgen
};
//SIG(1 _ZN3ccc10CC10x15y15E) C1{ BC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC10x15y15 ::~CC10x15y15(){ note_dtor("_ZN3ccc10CC10x15y15E", this);} // tgen
ccc::CC10x15y15 ::CC10x15y15(){ note_ctor("_ZN3ccc10CC10x15y15E", this);} // tgen
}
static void Test__ZN3ccc10CC10x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC10x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC10x15y15E, buf);
    ::ccc::CC10x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC10x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC10x15y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc10CC10x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC10x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC10x15y15E);
    dp->::ccc::CC10x15y15::~CC10x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC10x15y15E(Test__ZN3ccc10CC10x15y15E, "_ZN3ccc10CC10x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC10x15y15C1Ev();
extern void _ZN3ccc10CC10x15y15D1Ev();
Name_Map name_map__ZN3ccc10CC10x15y15E[] = {
  NSPAIR(_ZN3ccc10CC10x15y15C1Ev),
  NSPAIR(_ZN3ccc10CC10x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC10x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC10x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC10x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC10x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC10x15y15E[];
Class_Descriptor cd__ZN3ccc10CC10x15y15E = {  "_ZN3ccc10CC10x15y15E", // class name
  bases__ZN3ccc10CC10x15y15E, 2,
  &(vtc__ZN3ccc10CC10x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC10x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC10x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y0  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC11x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y03pqrEv
  ~CC11x0y0(); // tgen
  CC11x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y0E) C1{ BC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y03abcEv");}
void  ccc::CC11x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y03efgEv");}
void  ccc::CC11x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y03pqrEv");}
ccc::CC11x0y0 ::~CC11x0y0(){ note_dtor("_ZN3ccc8CC11x0y0E", this);} // tgen
ccc::CC11x0y0 ::CC11x0y0(){ note_ctor("_ZN3ccc8CC11x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y0E, buf);
    ::ccc::CC11x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y0E);
    dp->::ccc::CC11x0y0::~CC11x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y0E(Test__ZN3ccc8CC11x0y0E, "_ZN3ccc8CC11x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y0C1Ev();
extern void _ZN3ccc8CC11x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y0E[] = {
  NSPAIR(_ZN3ccc8CC11x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y0E[];
extern void _ZN3ccc8CC11x0y03pqrEv();
extern void _ZN3ccc8CC11x0y03efgEv();
extern void _ZN3ccc8CC11x0y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y03abcEv,_ZThn4_N3ccc8CC11x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y03efgEv,_ZThn4_N3ccc8CC11x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y03pqrEv,_ZThn4_N3ccc8CC11x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y03abcEv,_ZThn4_N3ccc8CC11x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y03efgEv,_ZThn4_N3ccc8CC11x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y03pqrEv,_ZThn4_N3ccc8CC11x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y0E[];
Class_Descriptor cd__ZN3ccc8CC11x0y0E = {  "_ZN3ccc8CC11x0y0E", // class name
  bases__ZN3ccc8CC11x0y0E, 2,
  &(vtc__ZN3ccc8CC11x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y1  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC11x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x0y13efgEv
  ~CC11x0y1(); // tgen
  CC11x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y1E) C1{ BC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y13abcEv");}
void  ccc::CC11x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y13pqrEv");}
void  ccc::CC11x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y13efgEv");}
ccc::CC11x0y1 ::~CC11x0y1(){ note_dtor("_ZN3ccc8CC11x0y1E", this);} // tgen
ccc::CC11x0y1 ::CC11x0y1(){ note_ctor("_ZN3ccc8CC11x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y1E, buf);
    ::ccc::CC11x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y1E);
    dp->::ccc::CC11x0y1::~CC11x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y1E(Test__ZN3ccc8CC11x0y1E, "_ZN3ccc8CC11x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y1C1Ev();
extern void _ZN3ccc8CC11x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y1E[] = {
  NSPAIR(_ZN3ccc8CC11x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y1E[];
extern void _ZN3ccc8CC11x0y13pqrEv();
extern void _ZN3ccc8CC11x0y13efgEv();
extern void _ZN3ccc8CC11x0y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y13abcEv,_ZThn4_N3ccc8CC11x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y13efgEv,_ZThn4_N3ccc8CC11x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y13pqrEv,_ZThn4_N3ccc8CC11x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y13abcEv,_ZThn4_N3ccc8CC11x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y13efgEv,_ZThn4_N3ccc8CC11x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y13pqrEv,_ZThn4_N3ccc8CC11x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y1E[];
Class_Descriptor cd__ZN3ccc8CC11x0y1E = {  "_ZN3ccc8CC11x0y1E", // class name
  bases__ZN3ccc8CC11x0y1E, 2,
  &(vtc__ZN3ccc8CC11x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y2  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC11x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y23pqrEv
  ~CC11x0y2(); // tgen
  CC11x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y2E) C1{ BC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y23efgEv");}
void  ccc::CC11x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y23abcEv");}
void  ccc::CC11x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y23pqrEv");}
ccc::CC11x0y2 ::~CC11x0y2(){ note_dtor("_ZN3ccc8CC11x0y2E", this);} // tgen
ccc::CC11x0y2 ::CC11x0y2(){ note_ctor("_ZN3ccc8CC11x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y2E, buf);
    ::ccc::CC11x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y2E);
    dp->::ccc::CC11x0y2::~CC11x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y2E(Test__ZN3ccc8CC11x0y2E, "_ZN3ccc8CC11x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y2C1Ev();
extern void _ZN3ccc8CC11x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y2E[] = {
  NSPAIR(_ZN3ccc8CC11x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y2E[];
extern void _ZN3ccc8CC11x0y23pqrEv();
extern void _ZN3ccc8CC11x0y23efgEv();
extern void _ZN3ccc8CC11x0y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y23abcEv,_ZThn4_N3ccc8CC11x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y23efgEv,_ZThn4_N3ccc8CC11x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y23pqrEv,_ZThn4_N3ccc8CC11x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y23abcEv,_ZThn4_N3ccc8CC11x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y23efgEv,_ZThn4_N3ccc8CC11x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y23pqrEv,_ZThn4_N3ccc8CC11x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y2E[];
Class_Descriptor cd__ZN3ccc8CC11x0y2E = {  "_ZN3ccc8CC11x0y2E", // class name
  bases__ZN3ccc8CC11x0y2E, 2,
  &(vtc__ZN3ccc8CC11x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y3  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC11x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x0y33abcEv
  ~CC11x0y3(); // tgen
  CC11x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y3E) C1{ BC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y33efgEv");}
void  ccc::CC11x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y33pqrEv");}
void  ccc::CC11x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y33abcEv");}
ccc::CC11x0y3 ::~CC11x0y3(){ note_dtor("_ZN3ccc8CC11x0y3E", this);} // tgen
ccc::CC11x0y3 ::CC11x0y3(){ note_ctor("_ZN3ccc8CC11x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y3E, buf);
    ::ccc::CC11x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y3E);
    dp->::ccc::CC11x0y3::~CC11x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y3E(Test__ZN3ccc8CC11x0y3E, "_ZN3ccc8CC11x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y3C1Ev();
extern void _ZN3ccc8CC11x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y3E[] = {
  NSPAIR(_ZN3ccc8CC11x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y3E[];
extern void _ZN3ccc8CC11x0y33pqrEv();
extern void _ZN3ccc8CC11x0y33efgEv();
extern void _ZN3ccc8CC11x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y33abcEv,_ZThn4_N3ccc8CC11x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y33efgEv,_ZThn4_N3ccc8CC11x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y33pqrEv,_ZThn4_N3ccc8CC11x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y33abcEv,_ZThn4_N3ccc8CC11x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y33efgEv,_ZThn4_N3ccc8CC11x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y33pqrEv,_ZThn4_N3ccc8CC11x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y3E[];
Class_Descriptor cd__ZN3ccc8CC11x0y3E = {  "_ZN3ccc8CC11x0y3E", // class name
  bases__ZN3ccc8CC11x0y3E, 2,
  &(vtc__ZN3ccc8CC11x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y4  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC11x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x0y43efgEv
  ~CC11x0y4(); // tgen
  CC11x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y4E) C1{ BC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y43pqrEv");}
void  ccc::CC11x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y43abcEv");}
void  ccc::CC11x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y43efgEv");}
ccc::CC11x0y4 ::~CC11x0y4(){ note_dtor("_ZN3ccc8CC11x0y4E", this);} // tgen
ccc::CC11x0y4 ::CC11x0y4(){ note_ctor("_ZN3ccc8CC11x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y4E, buf);
    ::ccc::CC11x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y4E);
    dp->::ccc::CC11x0y4::~CC11x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y4E(Test__ZN3ccc8CC11x0y4E, "_ZN3ccc8CC11x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y4C1Ev();
extern void _ZN3ccc8CC11x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y4E[] = {
  NSPAIR(_ZN3ccc8CC11x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y4E[];
extern void _ZN3ccc8CC11x0y43pqrEv();
extern void _ZN3ccc8CC11x0y43efgEv();
extern void _ZN3ccc8CC11x0y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y43abcEv,_ZThn4_N3ccc8CC11x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y43efgEv,_ZThn4_N3ccc8CC11x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y43pqrEv,_ZThn4_N3ccc8CC11x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y43abcEv,_ZThn4_N3ccc8CC11x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y43efgEv,_ZThn4_N3ccc8CC11x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y43pqrEv,_ZThn4_N3ccc8CC11x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y4E[];
Class_Descriptor cd__ZN3ccc8CC11x0y4E = {  "_ZN3ccc8CC11x0y4E", // class name
  bases__ZN3ccc8CC11x0y4E, 2,
  &(vtc__ZN3ccc8CC11x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y5  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC11x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x0y53abcEv
  ~CC11x0y5(); // tgen
  CC11x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y5E) C1{ BC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y53pqrEv");}
void  ccc::CC11x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y53efgEv");}
void  ccc::CC11x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y53abcEv");}
ccc::CC11x0y5 ::~CC11x0y5(){ note_dtor("_ZN3ccc8CC11x0y5E", this);} // tgen
ccc::CC11x0y5 ::CC11x0y5(){ note_ctor("_ZN3ccc8CC11x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y5E, buf);
    ::ccc::CC11x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y5E);
    dp->::ccc::CC11x0y5::~CC11x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y5E(Test__ZN3ccc8CC11x0y5E, "_ZN3ccc8CC11x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y5C1Ev();
extern void _ZN3ccc8CC11x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y5E[] = {
  NSPAIR(_ZN3ccc8CC11x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y5E[];
extern void _ZN3ccc8CC11x0y53pqrEv();
extern void _ZN3ccc8CC11x0y53efgEv();
extern void _ZN3ccc8CC11x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y53abcEv,_ZThn4_N3ccc8CC11x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y53efgEv,_ZThn4_N3ccc8CC11x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y53pqrEv,_ZThn4_N3ccc8CC11x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y53abcEv,_ZThn4_N3ccc8CC11x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y53efgEv,_ZThn4_N3ccc8CC11x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y53pqrEv,_ZThn4_N3ccc8CC11x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y5E[];
Class_Descriptor cd__ZN3ccc8CC11x0y5E = {  "_ZN3ccc8CC11x0y5E", // class name
  bases__ZN3ccc8CC11x0y5E, 2,
  &(vtc__ZN3ccc8CC11x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y6  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC11x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x0y63efgEv
  ~CC11x0y6(); // tgen
  CC11x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y6E) C1{ BC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y63abcEv");}
void  ccc::CC11x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y63efgEv");}
ccc::CC11x0y6 ::~CC11x0y6(){ note_dtor("_ZN3ccc8CC11x0y6E", this);} // tgen
ccc::CC11x0y6 ::CC11x0y6(){ note_ctor("_ZN3ccc8CC11x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y6E, buf);
    ::ccc::CC11x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y6E);
    dp->::ccc::CC11x0y6::~CC11x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y6E(Test__ZN3ccc8CC11x0y6E, "_ZN3ccc8CC11x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y6C1Ev();
extern void _ZN3ccc8CC11x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y6E[] = {
  NSPAIR(_ZN3ccc8CC11x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x0y63efgEv();
extern void _ZN3ccc8CC11x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y63abcEv,_ZThn4_N3ccc8CC11x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y63efgEv,_ZThn4_N3ccc8CC11x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y63abcEv,_ZThn4_N3ccc8CC11x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y63efgEv,_ZThn4_N3ccc8CC11x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y6E[];
Class_Descriptor cd__ZN3ccc8CC11x0y6E = {  "_ZN3ccc8CC11x0y6E", // class name
  bases__ZN3ccc8CC11x0y6E, 2,
  &(vtc__ZN3ccc8CC11x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y7  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC11x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y73pqrEv
  ~CC11x0y7(); // tgen
  CC11x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y7E) C1{ BC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y73abcEv");}
void  ccc::CC11x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y73pqrEv");}
ccc::CC11x0y7 ::~CC11x0y7(){ note_dtor("_ZN3ccc8CC11x0y7E", this);} // tgen
ccc::CC11x0y7 ::CC11x0y7(){ note_ctor("_ZN3ccc8CC11x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y7E, buf);
    ::ccc::CC11x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y7E);
    dp->::ccc::CC11x0y7::~CC11x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y7E(Test__ZN3ccc8CC11x0y7E, "_ZN3ccc8CC11x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y7C1Ev();
extern void _ZN3ccc8CC11x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y7E[] = {
  NSPAIR(_ZN3ccc8CC11x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y7E[];
extern void _ZN3ccc8CC11x0y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y73abcEv,_ZThn4_N3ccc8CC11x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y73pqrEv,_ZThn4_N3ccc8CC11x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y73abcEv,_ZThn4_N3ccc8CC11x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y73pqrEv,_ZThn4_N3ccc8CC11x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y7E[];
Class_Descriptor cd__ZN3ccc8CC11x0y7E = {  "_ZN3ccc8CC11x0y7E", // class name
  bases__ZN3ccc8CC11x0y7E, 2,
  &(vtc__ZN3ccc8CC11x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y8  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC11x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x0y83abcEv
  ~CC11x0y8(); // tgen
  CC11x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y8E) C1{ BC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y83efgEv");}
void  ccc::CC11x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x0y83abcEv");}
ccc::CC11x0y8 ::~CC11x0y8(){ note_dtor("_ZN3ccc8CC11x0y8E", this);} // tgen
ccc::CC11x0y8 ::CC11x0y8(){ note_ctor("_ZN3ccc8CC11x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y8E, buf);
    ::ccc::CC11x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y8E);
    dp->::ccc::CC11x0y8::~CC11x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y8E(Test__ZN3ccc8CC11x0y8E, "_ZN3ccc8CC11x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y8C1Ev();
extern void _ZN3ccc8CC11x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y8E[] = {
  NSPAIR(_ZN3ccc8CC11x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x0y83efgEv();
extern void _ZN3ccc8CC11x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y83abcEv,_ZThn4_N3ccc8CC11x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y83efgEv,_ZThn4_N3ccc8CC11x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y83abcEv,_ZThn4_N3ccc8CC11x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y83efgEv,_ZThn4_N3ccc8CC11x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y8E[];
Class_Descriptor cd__ZN3ccc8CC11x0y8E = {  "_ZN3ccc8CC11x0y8E", // class name
  bases__ZN3ccc8CC11x0y8E, 2,
  &(vtc__ZN3ccc8CC11x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y9  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC11x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x0y93pqrEv
  ~CC11x0y9(); // tgen
  CC11x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x0y9E) C1{ BC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x0y93efgEv");}
void  ccc::CC11x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x0y93pqrEv");}
ccc::CC11x0y9 ::~CC11x0y9(){ note_dtor("_ZN3ccc8CC11x0y9E", this);} // tgen
ccc::CC11x0y9 ::CC11x0y9(){ note_ctor("_ZN3ccc8CC11x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x0y9E, buf);
    ::ccc::CC11x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x0y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC11x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x0y9E);
    dp->::ccc::CC11x0y9::~CC11x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x0y9E(Test__ZN3ccc8CC11x0y9E, "_ZN3ccc8CC11x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x0y9C1Ev();
extern void _ZN3ccc8CC11x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x0y9E[] = {
  NSPAIR(_ZN3ccc8CC11x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC11x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y9E[];
extern void _ZN3ccc8CC11x0y93pqrEv();
extern void _ZN3ccc8CC11x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y93efgEv,_ZThn4_N3ccc8CC11x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x0y93pqrEv,_ZThn4_N3ccc8CC11x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y93efgEv,_ZThn4_N3ccc8CC11x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x0y93pqrEv,_ZThn4_N3ccc8CC11x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x0y9E[];
Class_Descriptor cd__ZN3ccc8CC11x0y9E = {  "_ZN3ccc8CC11x0y9E", // class name
  bases__ZN3ccc8CC11x0y9E, 2,
  &(vtc__ZN3ccc8CC11x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x0y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y10  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC11x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x0y103abcEv
  ~CC11x0y10(); // tgen
  CC11x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y10E) C1{ BC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x0y103pqrEv");}
void  ccc::CC11x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x0y103abcEv");}
ccc::CC11x0y10 ::~CC11x0y10(){ note_dtor("_ZN3ccc9CC11x0y10E", this);} // tgen
ccc::CC11x0y10 ::CC11x0y10(){ note_ctor("_ZN3ccc9CC11x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y10E, buf);
    ::ccc::CC11x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y10E);
    dp->::ccc::CC11x0y10::~CC11x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y10E(Test__ZN3ccc9CC11x0y10E, "_ZN3ccc9CC11x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y10C1Ev();
extern void _ZN3ccc9CC11x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y10E[] = {
  NSPAIR(_ZN3ccc9CC11x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y10E[];
extern void _ZN3ccc9CC11x0y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y103abcEv,_ZThn4_N3ccc9CC11x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y103pqrEv,_ZThn4_N3ccc9CC11x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y103abcEv,_ZThn4_N3ccc9CC11x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y103pqrEv,_ZThn4_N3ccc9CC11x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y10E[];
Class_Descriptor cd__ZN3ccc9CC11x0y10E = {  "_ZN3ccc9CC11x0y10E", // class name
  bases__ZN3ccc9CC11x0y10E, 2,
  &(vtc__ZN3ccc9CC11x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y11  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC11x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x0y113efgEv
  ~CC11x0y11(); // tgen
  CC11x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y11E) C1{ BC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x0y113pqrEv");}
void  ccc::CC11x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x0y113efgEv");}
ccc::CC11x0y11 ::~CC11x0y11(){ note_dtor("_ZN3ccc9CC11x0y11E", this);} // tgen
ccc::CC11x0y11 ::CC11x0y11(){ note_ctor("_ZN3ccc9CC11x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y11E, buf);
    ::ccc::CC11x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y11E);
    dp->::ccc::CC11x0y11::~CC11x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y11E(Test__ZN3ccc9CC11x0y11E, "_ZN3ccc9CC11x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y11C1Ev();
extern void _ZN3ccc9CC11x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y11E[] = {
  NSPAIR(_ZN3ccc9CC11x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y11E[];
extern void _ZN3ccc9CC11x0y113pqrEv();
extern void _ZN3ccc9CC11x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y113efgEv,_ZThn4_N3ccc9CC11x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y113pqrEv,_ZThn4_N3ccc9CC11x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y113efgEv,_ZThn4_N3ccc9CC11x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y113pqrEv,_ZThn4_N3ccc9CC11x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y11E[];
Class_Descriptor cd__ZN3ccc9CC11x0y11E = {  "_ZN3ccc9CC11x0y11E", // class name
  bases__ZN3ccc9CC11x0y11E, 2,
  &(vtc__ZN3ccc9CC11x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y12  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC11x0y123abcEv
  ~CC11x0y12(); // tgen
  CC11x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y12E) C1{ BC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC11x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x0y123abcEv");}
ccc::CC11x0y12 ::~CC11x0y12(){ note_dtor("_ZN3ccc9CC11x0y12E", this);} // tgen
ccc::CC11x0y12 ::CC11x0y12(){ note_ctor("_ZN3ccc9CC11x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y12E, buf);
    ::ccc::CC11x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y12E);
    dp->::ccc::CC11x0y12::~CC11x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y12E(Test__ZN3ccc9CC11x0y12E, "_ZN3ccc9CC11x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y12C1Ev();
extern void _ZN3ccc9CC11x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y12E[] = {
  NSPAIR(_ZN3ccc9CC11x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y123abcEv,_ZThn4_N3ccc9CC11x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y123abcEv,_ZThn4_N3ccc9CC11x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y12E[];
Class_Descriptor cd__ZN3ccc9CC11x0y12E = {  "_ZN3ccc9CC11x0y12E", // class name
  bases__ZN3ccc9CC11x0y12E, 2,
  &(vtc__ZN3ccc9CC11x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y13  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC11x0y133efgEv
  ~CC11x0y13(); // tgen
  CC11x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y13E) C1{ BC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x0y133efgEv");}
ccc::CC11x0y13 ::~CC11x0y13(){ note_dtor("_ZN3ccc9CC11x0y13E", this);} // tgen
ccc::CC11x0y13 ::CC11x0y13(){ note_ctor("_ZN3ccc9CC11x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y13E, buf);
    ::ccc::CC11x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y13E);
    dp->::ccc::CC11x0y13::~CC11x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y13E(Test__ZN3ccc9CC11x0y13E, "_ZN3ccc9CC11x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y13C1Ev();
extern void _ZN3ccc9CC11x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y13E[] = {
  NSPAIR(_ZN3ccc9CC11x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y133efgEv,_ZThn4_N3ccc9CC11x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y133efgEv,_ZThn4_N3ccc9CC11x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y13E[];
Class_Descriptor cd__ZN3ccc9CC11x0y13E = {  "_ZN3ccc9CC11x0y13E", // class name
  bases__ZN3ccc9CC11x0y13E, 2,
  &(vtc__ZN3ccc9CC11x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y14  : ::ccc::AA11 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC11x0y143pqrEv
  ~CC11x0y14(); // tgen
  CC11x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y14E) C1{ BC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x0y143pqrEv");}
ccc::CC11x0y14 ::~CC11x0y14(){ note_dtor("_ZN3ccc9CC11x0y14E", this);} // tgen
ccc::CC11x0y14 ::CC11x0y14(){ note_ctor("_ZN3ccc9CC11x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y14E, buf);
    ::ccc::CC11x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y14E);
    dp->::ccc::CC11x0y14::~CC11x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y14E(Test__ZN3ccc9CC11x0y14E, "_ZN3ccc9CC11x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y14C1Ev();
extern void _ZN3ccc9CC11x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y14E[] = {
  NSPAIR(_ZN3ccc9CC11x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y14E[];
extern void _ZN3ccc9CC11x0y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x0y143pqrEv,_ZThn4_N3ccc9CC11x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x0y143pqrEv,_ZThn4_N3ccc9CC11x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y14E[];
Class_Descriptor cd__ZN3ccc9CC11x0y14E = {  "_ZN3ccc9CC11x0y14E", // class name
  bases__ZN3ccc9CC11x0y14E, 2,
  &(vtc__ZN3ccc9CC11x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x0y15  : ::ccc::AA11 , ::ccc::BB0 {
  ~CC11x0y15(); // tgen
  CC11x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x0y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x0y15 ::~CC11x0y15(){ note_dtor("_ZN3ccc9CC11x0y15E", this);} // tgen
ccc::CC11x0y15 ::CC11x0y15(){ note_ctor("_ZN3ccc9CC11x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x0y15E, buf);
    ::ccc::CC11x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x0y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC11x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x0y15E);
    dp->::ccc::CC11x0y15::~CC11x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x0y15E(Test__ZN3ccc9CC11x0y15E, "_ZN3ccc9CC11x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x0y15C1Ev();
extern void _ZN3ccc9CC11x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x0y15E[] = {
  NSPAIR(_ZN3ccc9CC11x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC11x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x0y15E[];
Class_Descriptor cd__ZN3ccc9CC11x0y15E = {  "_ZN3ccc9CC11x0y15E", // class name
  bases__ZN3ccc9CC11x0y15E, 2,
  &(vtc__ZN3ccc9CC11x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x0y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y0  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC11x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y03pqrEv
  ~CC11x1y0(); // tgen
  CC11x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y0E) C1{ BC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y03abcEv");}
void  ccc::CC11x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y03efgEv");}
void  ccc::CC11x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y03pqrEv");}
ccc::CC11x1y0 ::~CC11x1y0(){ note_dtor("_ZN3ccc8CC11x1y0E", this);} // tgen
ccc::CC11x1y0 ::CC11x1y0(){ note_ctor("_ZN3ccc8CC11x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y0E, buf);
    ::ccc::CC11x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y0E);
    dp->::ccc::CC11x1y0::~CC11x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y0E(Test__ZN3ccc8CC11x1y0E, "_ZN3ccc8CC11x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y0C1Ev();
extern void _ZN3ccc8CC11x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y0E[] = {
  NSPAIR(_ZN3ccc8CC11x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y0E[];
extern void _ZN3ccc8CC11x1y03pqrEv();
extern void _ZN3ccc8CC11x1y03efgEv();
extern void _ZN3ccc8CC11x1y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y03abcEv,_ZThn4_N3ccc8CC11x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y03pqrEv,_ZThn4_N3ccc8CC11x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y03efgEv,_ZThn4_N3ccc8CC11x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y03abcEv,_ZThn4_N3ccc8CC11x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y03pqrEv,_ZThn4_N3ccc8CC11x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y03efgEv,_ZThn4_N3ccc8CC11x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y0E[];
Class_Descriptor cd__ZN3ccc8CC11x1y0E = {  "_ZN3ccc8CC11x1y0E", // class name
  bases__ZN3ccc8CC11x1y0E, 2,
  &(vtc__ZN3ccc8CC11x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y1  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC11x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x1y13efgEv
  ~CC11x1y1(); // tgen
  CC11x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y1E) C1{ BC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y13abcEv");}
void  ccc::CC11x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y13pqrEv");}
void  ccc::CC11x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y13efgEv");}
ccc::CC11x1y1 ::~CC11x1y1(){ note_dtor("_ZN3ccc8CC11x1y1E", this);} // tgen
ccc::CC11x1y1 ::CC11x1y1(){ note_ctor("_ZN3ccc8CC11x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y1E, buf);
    ::ccc::CC11x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y1E);
    dp->::ccc::CC11x1y1::~CC11x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y1E(Test__ZN3ccc8CC11x1y1E, "_ZN3ccc8CC11x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y1C1Ev();
extern void _ZN3ccc8CC11x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y1E[] = {
  NSPAIR(_ZN3ccc8CC11x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y1E[];
extern void _ZN3ccc8CC11x1y13pqrEv();
extern void _ZN3ccc8CC11x1y13efgEv();
extern void _ZN3ccc8CC11x1y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y13abcEv,_ZThn4_N3ccc8CC11x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y13pqrEv,_ZThn4_N3ccc8CC11x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y13efgEv,_ZThn4_N3ccc8CC11x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y13abcEv,_ZThn4_N3ccc8CC11x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y13pqrEv,_ZThn4_N3ccc8CC11x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y13efgEv,_ZThn4_N3ccc8CC11x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y1E[];
Class_Descriptor cd__ZN3ccc8CC11x1y1E = {  "_ZN3ccc8CC11x1y1E", // class name
  bases__ZN3ccc8CC11x1y1E, 2,
  &(vtc__ZN3ccc8CC11x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y2  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC11x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y23pqrEv
  ~CC11x1y2(); // tgen
  CC11x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y2E) C1{ BC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y23efgEv");}
void  ccc::CC11x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y23abcEv");}
void  ccc::CC11x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y23pqrEv");}
ccc::CC11x1y2 ::~CC11x1y2(){ note_dtor("_ZN3ccc8CC11x1y2E", this);} // tgen
ccc::CC11x1y2 ::CC11x1y2(){ note_ctor("_ZN3ccc8CC11x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y2E, buf);
    ::ccc::CC11x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y2E);
    dp->::ccc::CC11x1y2::~CC11x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y2E(Test__ZN3ccc8CC11x1y2E, "_ZN3ccc8CC11x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y2C1Ev();
extern void _ZN3ccc8CC11x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y2E[] = {
  NSPAIR(_ZN3ccc8CC11x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y2E[];
extern void _ZN3ccc8CC11x1y23pqrEv();
extern void _ZN3ccc8CC11x1y23efgEv();
extern void _ZN3ccc8CC11x1y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y23abcEv,_ZThn4_N3ccc8CC11x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y23pqrEv,_ZThn4_N3ccc8CC11x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y23efgEv,_ZThn4_N3ccc8CC11x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y23abcEv,_ZThn4_N3ccc8CC11x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y23pqrEv,_ZThn4_N3ccc8CC11x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y23efgEv,_ZThn4_N3ccc8CC11x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y2E[];
Class_Descriptor cd__ZN3ccc8CC11x1y2E = {  "_ZN3ccc8CC11x1y2E", // class name
  bases__ZN3ccc8CC11x1y2E, 2,
  &(vtc__ZN3ccc8CC11x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y3  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC11x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x1y33abcEv
  ~CC11x1y3(); // tgen
  CC11x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y3E) C1{ BC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y33efgEv");}
void  ccc::CC11x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y33pqrEv");}
void  ccc::CC11x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y33abcEv");}
ccc::CC11x1y3 ::~CC11x1y3(){ note_dtor("_ZN3ccc8CC11x1y3E", this);} // tgen
ccc::CC11x1y3 ::CC11x1y3(){ note_ctor("_ZN3ccc8CC11x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y3E, buf);
    ::ccc::CC11x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y3E);
    dp->::ccc::CC11x1y3::~CC11x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y3E(Test__ZN3ccc8CC11x1y3E, "_ZN3ccc8CC11x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y3C1Ev();
extern void _ZN3ccc8CC11x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y3E[] = {
  NSPAIR(_ZN3ccc8CC11x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y3E[];
extern void _ZN3ccc8CC11x1y33pqrEv();
extern void _ZN3ccc8CC11x1y33efgEv();
extern void _ZN3ccc8CC11x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y33abcEv,_ZThn4_N3ccc8CC11x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y33pqrEv,_ZThn4_N3ccc8CC11x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y33efgEv,_ZThn4_N3ccc8CC11x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y33abcEv,_ZThn4_N3ccc8CC11x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y33pqrEv,_ZThn4_N3ccc8CC11x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y33efgEv,_ZThn4_N3ccc8CC11x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y3E[];
Class_Descriptor cd__ZN3ccc8CC11x1y3E = {  "_ZN3ccc8CC11x1y3E", // class name
  bases__ZN3ccc8CC11x1y3E, 2,
  &(vtc__ZN3ccc8CC11x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y4  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC11x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x1y43efgEv
  ~CC11x1y4(); // tgen
  CC11x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y4E) C1{ BC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y43pqrEv");}
void  ccc::CC11x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y43abcEv");}
void  ccc::CC11x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y43efgEv");}
ccc::CC11x1y4 ::~CC11x1y4(){ note_dtor("_ZN3ccc8CC11x1y4E", this);} // tgen
ccc::CC11x1y4 ::CC11x1y4(){ note_ctor("_ZN3ccc8CC11x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y4E, buf);
    ::ccc::CC11x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y4E);
    dp->::ccc::CC11x1y4::~CC11x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y4E(Test__ZN3ccc8CC11x1y4E, "_ZN3ccc8CC11x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y4C1Ev();
extern void _ZN3ccc8CC11x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y4E[] = {
  NSPAIR(_ZN3ccc8CC11x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y4E[];
extern void _ZN3ccc8CC11x1y43pqrEv();
extern void _ZN3ccc8CC11x1y43efgEv();
extern void _ZN3ccc8CC11x1y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y43abcEv,_ZThn4_N3ccc8CC11x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y43pqrEv,_ZThn4_N3ccc8CC11x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y43efgEv,_ZThn4_N3ccc8CC11x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y43abcEv,_ZThn4_N3ccc8CC11x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y43pqrEv,_ZThn4_N3ccc8CC11x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y43efgEv,_ZThn4_N3ccc8CC11x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y4E[];
Class_Descriptor cd__ZN3ccc8CC11x1y4E = {  "_ZN3ccc8CC11x1y4E", // class name
  bases__ZN3ccc8CC11x1y4E, 2,
  &(vtc__ZN3ccc8CC11x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y5  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC11x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x1y53abcEv
  ~CC11x1y5(); // tgen
  CC11x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y5E) C1{ BC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y53pqrEv");}
void  ccc::CC11x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y53efgEv");}
void  ccc::CC11x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y53abcEv");}
ccc::CC11x1y5 ::~CC11x1y5(){ note_dtor("_ZN3ccc8CC11x1y5E", this);} // tgen
ccc::CC11x1y5 ::CC11x1y5(){ note_ctor("_ZN3ccc8CC11x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y5E, buf);
    ::ccc::CC11x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y5E);
    dp->::ccc::CC11x1y5::~CC11x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y5E(Test__ZN3ccc8CC11x1y5E, "_ZN3ccc8CC11x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y5C1Ev();
extern void _ZN3ccc8CC11x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y5E[] = {
  NSPAIR(_ZN3ccc8CC11x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y5E[];
extern void _ZN3ccc8CC11x1y53pqrEv();
extern void _ZN3ccc8CC11x1y53efgEv();
extern void _ZN3ccc8CC11x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y53abcEv,_ZThn4_N3ccc8CC11x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y53pqrEv,_ZThn4_N3ccc8CC11x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y53efgEv,_ZThn4_N3ccc8CC11x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y53abcEv,_ZThn4_N3ccc8CC11x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y53pqrEv,_ZThn4_N3ccc8CC11x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y53efgEv,_ZThn4_N3ccc8CC11x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y5E[];
Class_Descriptor cd__ZN3ccc8CC11x1y5E = {  "_ZN3ccc8CC11x1y5E", // class name
  bases__ZN3ccc8CC11x1y5E, 2,
  &(vtc__ZN3ccc8CC11x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y6  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC11x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x1y63efgEv
  ~CC11x1y6(); // tgen
  CC11x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y6E) C1{ BC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y63abcEv");}
void  ccc::CC11x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y63efgEv");}
ccc::CC11x1y6 ::~CC11x1y6(){ note_dtor("_ZN3ccc8CC11x1y6E", this);} // tgen
ccc::CC11x1y6 ::CC11x1y6(){ note_ctor("_ZN3ccc8CC11x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y6E, buf);
    ::ccc::CC11x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y6E);
    dp->::ccc::CC11x1y6::~CC11x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y6E(Test__ZN3ccc8CC11x1y6E, "_ZN3ccc8CC11x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y6C1Ev();
extern void _ZN3ccc8CC11x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y6E[] = {
  NSPAIR(_ZN3ccc8CC11x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x1y63efgEv();
extern void _ZN3ccc8CC11x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y63abcEv,_ZThn4_N3ccc8CC11x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y63efgEv,_ZThn4_N3ccc8CC11x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y63abcEv,_ZThn4_N3ccc8CC11x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y63efgEv,_ZThn4_N3ccc8CC11x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y6E[];
Class_Descriptor cd__ZN3ccc8CC11x1y6E = {  "_ZN3ccc8CC11x1y6E", // class name
  bases__ZN3ccc8CC11x1y6E, 2,
  &(vtc__ZN3ccc8CC11x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y7  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC11x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y73pqrEv
  ~CC11x1y7(); // tgen
  CC11x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y7E) C1{ BC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y73abcEv");}
void  ccc::CC11x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y73pqrEv");}
ccc::CC11x1y7 ::~CC11x1y7(){ note_dtor("_ZN3ccc8CC11x1y7E", this);} // tgen
ccc::CC11x1y7 ::CC11x1y7(){ note_ctor("_ZN3ccc8CC11x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y7E, buf);
    ::ccc::CC11x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y7E);
    dp->::ccc::CC11x1y7::~CC11x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y7E(Test__ZN3ccc8CC11x1y7E, "_ZN3ccc8CC11x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y7C1Ev();
extern void _ZN3ccc8CC11x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y7E[] = {
  NSPAIR(_ZN3ccc8CC11x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y7E[];
extern void _ZN3ccc8CC11x1y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y73abcEv,_ZThn4_N3ccc8CC11x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y73pqrEv,_ZThn4_N3ccc8CC11x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y73abcEv,_ZThn4_N3ccc8CC11x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y73pqrEv,_ZThn4_N3ccc8CC11x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y7E[];
Class_Descriptor cd__ZN3ccc8CC11x1y7E = {  "_ZN3ccc8CC11x1y7E", // class name
  bases__ZN3ccc8CC11x1y7E, 2,
  &(vtc__ZN3ccc8CC11x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y8  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC11x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x1y83abcEv
  ~CC11x1y8(); // tgen
  CC11x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y8E) C1{ BC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y83efgEv");}
void  ccc::CC11x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x1y83abcEv");}
ccc::CC11x1y8 ::~CC11x1y8(){ note_dtor("_ZN3ccc8CC11x1y8E", this);} // tgen
ccc::CC11x1y8 ::CC11x1y8(){ note_ctor("_ZN3ccc8CC11x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y8E, buf);
    ::ccc::CC11x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y8E);
    dp->::ccc::CC11x1y8::~CC11x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y8E(Test__ZN3ccc8CC11x1y8E, "_ZN3ccc8CC11x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y8C1Ev();
extern void _ZN3ccc8CC11x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y8E[] = {
  NSPAIR(_ZN3ccc8CC11x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x1y83efgEv();
extern void _ZN3ccc8CC11x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y83abcEv,_ZThn4_N3ccc8CC11x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y83efgEv,_ZThn4_N3ccc8CC11x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y83abcEv,_ZThn4_N3ccc8CC11x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y83efgEv,_ZThn4_N3ccc8CC11x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y8E[];
Class_Descriptor cd__ZN3ccc8CC11x1y8E = {  "_ZN3ccc8CC11x1y8E", // class name
  bases__ZN3ccc8CC11x1y8E, 2,
  &(vtc__ZN3ccc8CC11x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y9  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC11x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x1y93pqrEv
  ~CC11x1y9(); // tgen
  CC11x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x1y9E) C1{ BC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x1y93efgEv");}
void  ccc::CC11x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x1y93pqrEv");}
ccc::CC11x1y9 ::~CC11x1y9(){ note_dtor("_ZN3ccc8CC11x1y9E", this);} // tgen
ccc::CC11x1y9 ::CC11x1y9(){ note_ctor("_ZN3ccc8CC11x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x1y9E, buf);
    ::ccc::CC11x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x1y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC11x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x1y9E);
    dp->::ccc::CC11x1y9::~CC11x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x1y9E(Test__ZN3ccc8CC11x1y9E, "_ZN3ccc8CC11x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x1y9C1Ev();
extern void _ZN3ccc8CC11x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x1y9E[] = {
  NSPAIR(_ZN3ccc8CC11x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC11x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y9E[];
extern void _ZN3ccc8CC11x1y93pqrEv();
extern void _ZN3ccc8CC11x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y93pqrEv,_ZThn4_N3ccc8CC11x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x1y93efgEv,_ZThn4_N3ccc8CC11x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y93pqrEv,_ZThn4_N3ccc8CC11x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x1y93efgEv,_ZThn4_N3ccc8CC11x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x1y9E[];
Class_Descriptor cd__ZN3ccc8CC11x1y9E = {  "_ZN3ccc8CC11x1y9E", // class name
  bases__ZN3ccc8CC11x1y9E, 2,
  &(vtc__ZN3ccc8CC11x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x1y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y10  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC11x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x1y103abcEv
  ~CC11x1y10(); // tgen
  CC11x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y10E) C1{ BC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x1y103pqrEv");}
void  ccc::CC11x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x1y103abcEv");}
ccc::CC11x1y10 ::~CC11x1y10(){ note_dtor("_ZN3ccc9CC11x1y10E", this);} // tgen
ccc::CC11x1y10 ::CC11x1y10(){ note_ctor("_ZN3ccc9CC11x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y10E, buf);
    ::ccc::CC11x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y10E);
    dp->::ccc::CC11x1y10::~CC11x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y10E(Test__ZN3ccc9CC11x1y10E, "_ZN3ccc9CC11x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y10C1Ev();
extern void _ZN3ccc9CC11x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y10E[] = {
  NSPAIR(_ZN3ccc9CC11x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y10E[];
extern void _ZN3ccc9CC11x1y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y103abcEv,_ZThn4_N3ccc9CC11x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y103pqrEv,_ZThn4_N3ccc9CC11x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y103abcEv,_ZThn4_N3ccc9CC11x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y103pqrEv,_ZThn4_N3ccc9CC11x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y10E[];
Class_Descriptor cd__ZN3ccc9CC11x1y10E = {  "_ZN3ccc9CC11x1y10E", // class name
  bases__ZN3ccc9CC11x1y10E, 2,
  &(vtc__ZN3ccc9CC11x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y11  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC11x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x1y113efgEv
  ~CC11x1y11(); // tgen
  CC11x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y11E) C1{ BC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x1y113pqrEv");}
void  ccc::CC11x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x1y113efgEv");}
ccc::CC11x1y11 ::~CC11x1y11(){ note_dtor("_ZN3ccc9CC11x1y11E", this);} // tgen
ccc::CC11x1y11 ::CC11x1y11(){ note_ctor("_ZN3ccc9CC11x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y11E, buf);
    ::ccc::CC11x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y11E);
    dp->::ccc::CC11x1y11::~CC11x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y11E(Test__ZN3ccc9CC11x1y11E, "_ZN3ccc9CC11x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y11C1Ev();
extern void _ZN3ccc9CC11x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y11E[] = {
  NSPAIR(_ZN3ccc9CC11x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y11E[];
extern void _ZN3ccc9CC11x1y113pqrEv();
extern void _ZN3ccc9CC11x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y113pqrEv,_ZThn4_N3ccc9CC11x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y113efgEv,_ZThn4_N3ccc9CC11x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y113pqrEv,_ZThn4_N3ccc9CC11x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y113efgEv,_ZThn4_N3ccc9CC11x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y11E[];
Class_Descriptor cd__ZN3ccc9CC11x1y11E = {  "_ZN3ccc9CC11x1y11E", // class name
  bases__ZN3ccc9CC11x1y11E, 2,
  &(vtc__ZN3ccc9CC11x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y12  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC11x1y123abcEv
  ~CC11x1y12(); // tgen
  CC11x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y12E) C1{ BC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC11x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x1y123abcEv");}
ccc::CC11x1y12 ::~CC11x1y12(){ note_dtor("_ZN3ccc9CC11x1y12E", this);} // tgen
ccc::CC11x1y12 ::CC11x1y12(){ note_ctor("_ZN3ccc9CC11x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y12E, buf);
    ::ccc::CC11x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y12E);
    dp->::ccc::CC11x1y12::~CC11x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y12E(Test__ZN3ccc9CC11x1y12E, "_ZN3ccc9CC11x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y12C1Ev();
extern void _ZN3ccc9CC11x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y12E[] = {
  NSPAIR(_ZN3ccc9CC11x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y123abcEv,_ZThn4_N3ccc9CC11x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y123abcEv,_ZThn4_N3ccc9CC11x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y12E[];
Class_Descriptor cd__ZN3ccc9CC11x1y12E = {  "_ZN3ccc9CC11x1y12E", // class name
  bases__ZN3ccc9CC11x1y12E, 2,
  &(vtc__ZN3ccc9CC11x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y13  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC11x1y133efgEv
  ~CC11x1y13(); // tgen
  CC11x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y13E) C1{ BC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x1y133efgEv");}
ccc::CC11x1y13 ::~CC11x1y13(){ note_dtor("_ZN3ccc9CC11x1y13E", this);} // tgen
ccc::CC11x1y13 ::CC11x1y13(){ note_ctor("_ZN3ccc9CC11x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y13E, buf);
    ::ccc::CC11x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y13E);
    dp->::ccc::CC11x1y13::~CC11x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y13E(Test__ZN3ccc9CC11x1y13E, "_ZN3ccc9CC11x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y13C1Ev();
extern void _ZN3ccc9CC11x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y13E[] = {
  NSPAIR(_ZN3ccc9CC11x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y133efgEv,_ZThn4_N3ccc9CC11x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y133efgEv,_ZThn4_N3ccc9CC11x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y13E[];
Class_Descriptor cd__ZN3ccc9CC11x1y13E = {  "_ZN3ccc9CC11x1y13E", // class name
  bases__ZN3ccc9CC11x1y13E, 2,
  &(vtc__ZN3ccc9CC11x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y14  : ::ccc::AA11 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC11x1y143pqrEv
  ~CC11x1y14(); // tgen
  CC11x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y14E) C1{ BC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x1y143pqrEv");}
ccc::CC11x1y14 ::~CC11x1y14(){ note_dtor("_ZN3ccc9CC11x1y14E", this);} // tgen
ccc::CC11x1y14 ::CC11x1y14(){ note_ctor("_ZN3ccc9CC11x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y14E, buf);
    ::ccc::CC11x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y14E);
    dp->::ccc::CC11x1y14::~CC11x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y14E(Test__ZN3ccc9CC11x1y14E, "_ZN3ccc9CC11x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y14C1Ev();
extern void _ZN3ccc9CC11x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y14E[] = {
  NSPAIR(_ZN3ccc9CC11x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y14E[];
extern void _ZN3ccc9CC11x1y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x1y143pqrEv,_ZThn4_N3ccc9CC11x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x1y143pqrEv,_ZThn4_N3ccc9CC11x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y14E[];
Class_Descriptor cd__ZN3ccc9CC11x1y14E = {  "_ZN3ccc9CC11x1y14E", // class name
  bases__ZN3ccc9CC11x1y14E, 2,
  &(vtc__ZN3ccc9CC11x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x1y15  : ::ccc::AA11 , ::ccc::BB1 {
  ~CC11x1y15(); // tgen
  CC11x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x1y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x1y15 ::~CC11x1y15(){ note_dtor("_ZN3ccc9CC11x1y15E", this);} // tgen
ccc::CC11x1y15 ::CC11x1y15(){ note_ctor("_ZN3ccc9CC11x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x1y15E, buf);
    ::ccc::CC11x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x1y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC11x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x1y15E);
    dp->::ccc::CC11x1y15::~CC11x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x1y15E(Test__ZN3ccc9CC11x1y15E, "_ZN3ccc9CC11x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x1y15C1Ev();
extern void _ZN3ccc9CC11x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x1y15E[] = {
  NSPAIR(_ZN3ccc9CC11x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC11x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x1y15E[];
Class_Descriptor cd__ZN3ccc9CC11x1y15E = {  "_ZN3ccc9CC11x1y15E", // class name
  bases__ZN3ccc9CC11x1y15E, 2,
  &(vtc__ZN3ccc9CC11x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x1y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y0  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC11x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y03pqrEv
  ~CC11x2y0(); // tgen
  CC11x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y0E) C1{ BC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y03abcEv");}
void  ccc::CC11x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y03efgEv");}
void  ccc::CC11x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y03pqrEv");}
ccc::CC11x2y0 ::~CC11x2y0(){ note_dtor("_ZN3ccc8CC11x2y0E", this);} // tgen
ccc::CC11x2y0 ::CC11x2y0(){ note_ctor("_ZN3ccc8CC11x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y0E, buf);
    ::ccc::CC11x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y0E);
    dp->::ccc::CC11x2y0::~CC11x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y0E(Test__ZN3ccc8CC11x2y0E, "_ZN3ccc8CC11x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y0C1Ev();
extern void _ZN3ccc8CC11x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y0E[] = {
  NSPAIR(_ZN3ccc8CC11x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y0E[];
extern void _ZN3ccc8CC11x2y03pqrEv();
extern void _ZN3ccc8CC11x2y03efgEv();
extern void _ZN3ccc8CC11x2y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y03efgEv,_ZThn4_N3ccc8CC11x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y03abcEv,_ZThn4_N3ccc8CC11x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y03pqrEv,_ZThn4_N3ccc8CC11x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y03efgEv,_ZThn4_N3ccc8CC11x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y03abcEv,_ZThn4_N3ccc8CC11x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y03pqrEv,_ZThn4_N3ccc8CC11x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y0E[];
Class_Descriptor cd__ZN3ccc8CC11x2y0E = {  "_ZN3ccc8CC11x2y0E", // class name
  bases__ZN3ccc8CC11x2y0E, 2,
  &(vtc__ZN3ccc8CC11x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y1  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC11x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x2y13efgEv
  ~CC11x2y1(); // tgen
  CC11x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y1E) C1{ BC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y13abcEv");}
void  ccc::CC11x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y13pqrEv");}
void  ccc::CC11x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y13efgEv");}
ccc::CC11x2y1 ::~CC11x2y1(){ note_dtor("_ZN3ccc8CC11x2y1E", this);} // tgen
ccc::CC11x2y1 ::CC11x2y1(){ note_ctor("_ZN3ccc8CC11x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y1E, buf);
    ::ccc::CC11x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y1E);
    dp->::ccc::CC11x2y1::~CC11x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y1E(Test__ZN3ccc8CC11x2y1E, "_ZN3ccc8CC11x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y1C1Ev();
extern void _ZN3ccc8CC11x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y1E[] = {
  NSPAIR(_ZN3ccc8CC11x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y1E[];
extern void _ZN3ccc8CC11x2y13pqrEv();
extern void _ZN3ccc8CC11x2y13efgEv();
extern void _ZN3ccc8CC11x2y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y13efgEv,_ZThn4_N3ccc8CC11x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y13abcEv,_ZThn4_N3ccc8CC11x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y13pqrEv,_ZThn4_N3ccc8CC11x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y13efgEv,_ZThn4_N3ccc8CC11x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y13abcEv,_ZThn4_N3ccc8CC11x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y13pqrEv,_ZThn4_N3ccc8CC11x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y1E[];
Class_Descriptor cd__ZN3ccc8CC11x2y1E = {  "_ZN3ccc8CC11x2y1E", // class name
  bases__ZN3ccc8CC11x2y1E, 2,
  &(vtc__ZN3ccc8CC11x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y2  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC11x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y23pqrEv
  ~CC11x2y2(); // tgen
  CC11x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y2E) C1{ BC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y23efgEv");}
void  ccc::CC11x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y23abcEv");}
void  ccc::CC11x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y23pqrEv");}
ccc::CC11x2y2 ::~CC11x2y2(){ note_dtor("_ZN3ccc8CC11x2y2E", this);} // tgen
ccc::CC11x2y2 ::CC11x2y2(){ note_ctor("_ZN3ccc8CC11x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y2E, buf);
    ::ccc::CC11x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y2E);
    dp->::ccc::CC11x2y2::~CC11x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y2E(Test__ZN3ccc8CC11x2y2E, "_ZN3ccc8CC11x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y2C1Ev();
extern void _ZN3ccc8CC11x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y2E[] = {
  NSPAIR(_ZN3ccc8CC11x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y2E[];
extern void _ZN3ccc8CC11x2y23pqrEv();
extern void _ZN3ccc8CC11x2y23efgEv();
extern void _ZN3ccc8CC11x2y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y23efgEv,_ZThn4_N3ccc8CC11x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y23abcEv,_ZThn4_N3ccc8CC11x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y23pqrEv,_ZThn4_N3ccc8CC11x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y23efgEv,_ZThn4_N3ccc8CC11x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y23abcEv,_ZThn4_N3ccc8CC11x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y23pqrEv,_ZThn4_N3ccc8CC11x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y2E[];
Class_Descriptor cd__ZN3ccc8CC11x2y2E = {  "_ZN3ccc8CC11x2y2E", // class name
  bases__ZN3ccc8CC11x2y2E, 2,
  &(vtc__ZN3ccc8CC11x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y3  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC11x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x2y33abcEv
  ~CC11x2y3(); // tgen
  CC11x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y3E) C1{ BC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y33efgEv");}
void  ccc::CC11x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y33pqrEv");}
void  ccc::CC11x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y33abcEv");}
ccc::CC11x2y3 ::~CC11x2y3(){ note_dtor("_ZN3ccc8CC11x2y3E", this);} // tgen
ccc::CC11x2y3 ::CC11x2y3(){ note_ctor("_ZN3ccc8CC11x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y3E, buf);
    ::ccc::CC11x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y3E);
    dp->::ccc::CC11x2y3::~CC11x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y3E(Test__ZN3ccc8CC11x2y3E, "_ZN3ccc8CC11x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y3C1Ev();
extern void _ZN3ccc8CC11x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y3E[] = {
  NSPAIR(_ZN3ccc8CC11x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y3E[];
extern void _ZN3ccc8CC11x2y33pqrEv();
extern void _ZN3ccc8CC11x2y33efgEv();
extern void _ZN3ccc8CC11x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y33efgEv,_ZThn4_N3ccc8CC11x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y33abcEv,_ZThn4_N3ccc8CC11x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y33pqrEv,_ZThn4_N3ccc8CC11x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y33efgEv,_ZThn4_N3ccc8CC11x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y33abcEv,_ZThn4_N3ccc8CC11x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y33pqrEv,_ZThn4_N3ccc8CC11x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y3E[];
Class_Descriptor cd__ZN3ccc8CC11x2y3E = {  "_ZN3ccc8CC11x2y3E", // class name
  bases__ZN3ccc8CC11x2y3E, 2,
  &(vtc__ZN3ccc8CC11x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y4  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC11x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x2y43efgEv
  ~CC11x2y4(); // tgen
  CC11x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y4E) C1{ BC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y43pqrEv");}
void  ccc::CC11x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y43abcEv");}
void  ccc::CC11x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y43efgEv");}
ccc::CC11x2y4 ::~CC11x2y4(){ note_dtor("_ZN3ccc8CC11x2y4E", this);} // tgen
ccc::CC11x2y4 ::CC11x2y4(){ note_ctor("_ZN3ccc8CC11x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y4E, buf);
    ::ccc::CC11x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y4E);
    dp->::ccc::CC11x2y4::~CC11x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y4E(Test__ZN3ccc8CC11x2y4E, "_ZN3ccc8CC11x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y4C1Ev();
extern void _ZN3ccc8CC11x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y4E[] = {
  NSPAIR(_ZN3ccc8CC11x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y4E[];
extern void _ZN3ccc8CC11x2y43pqrEv();
extern void _ZN3ccc8CC11x2y43efgEv();
extern void _ZN3ccc8CC11x2y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y43efgEv,_ZThn4_N3ccc8CC11x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y43abcEv,_ZThn4_N3ccc8CC11x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y43pqrEv,_ZThn4_N3ccc8CC11x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y43efgEv,_ZThn4_N3ccc8CC11x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y43abcEv,_ZThn4_N3ccc8CC11x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y43pqrEv,_ZThn4_N3ccc8CC11x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y4E[];
Class_Descriptor cd__ZN3ccc8CC11x2y4E = {  "_ZN3ccc8CC11x2y4E", // class name
  bases__ZN3ccc8CC11x2y4E, 2,
  &(vtc__ZN3ccc8CC11x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y5  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC11x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x2y53abcEv
  ~CC11x2y5(); // tgen
  CC11x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y5E) C1{ BC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y53pqrEv");}
void  ccc::CC11x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y53efgEv");}
void  ccc::CC11x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y53abcEv");}
ccc::CC11x2y5 ::~CC11x2y5(){ note_dtor("_ZN3ccc8CC11x2y5E", this);} // tgen
ccc::CC11x2y5 ::CC11x2y5(){ note_ctor("_ZN3ccc8CC11x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y5E, buf);
    ::ccc::CC11x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y5E);
    dp->::ccc::CC11x2y5::~CC11x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y5E(Test__ZN3ccc8CC11x2y5E, "_ZN3ccc8CC11x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y5C1Ev();
extern void _ZN3ccc8CC11x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y5E[] = {
  NSPAIR(_ZN3ccc8CC11x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y5E[];
extern void _ZN3ccc8CC11x2y53pqrEv();
extern void _ZN3ccc8CC11x2y53efgEv();
extern void _ZN3ccc8CC11x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y53efgEv,_ZThn4_N3ccc8CC11x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y53abcEv,_ZThn4_N3ccc8CC11x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y53pqrEv,_ZThn4_N3ccc8CC11x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y53efgEv,_ZThn4_N3ccc8CC11x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y53abcEv,_ZThn4_N3ccc8CC11x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y53pqrEv,_ZThn4_N3ccc8CC11x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y5E[];
Class_Descriptor cd__ZN3ccc8CC11x2y5E = {  "_ZN3ccc8CC11x2y5E", // class name
  bases__ZN3ccc8CC11x2y5E, 2,
  &(vtc__ZN3ccc8CC11x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y6  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC11x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x2y63efgEv
  ~CC11x2y6(); // tgen
  CC11x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y6E) C1{ BC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y63abcEv");}
void  ccc::CC11x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y63efgEv");}
ccc::CC11x2y6 ::~CC11x2y6(){ note_dtor("_ZN3ccc8CC11x2y6E", this);} // tgen
ccc::CC11x2y6 ::CC11x2y6(){ note_ctor("_ZN3ccc8CC11x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y6E, buf);
    ::ccc::CC11x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y6E);
    dp->::ccc::CC11x2y6::~CC11x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y6E(Test__ZN3ccc8CC11x2y6E, "_ZN3ccc8CC11x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y6C1Ev();
extern void _ZN3ccc8CC11x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y6E[] = {
  NSPAIR(_ZN3ccc8CC11x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x2y63efgEv();
extern void _ZN3ccc8CC11x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y63efgEv,_ZThn4_N3ccc8CC11x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y63abcEv,_ZThn4_N3ccc8CC11x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y63efgEv,_ZThn4_N3ccc8CC11x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y63abcEv,_ZThn4_N3ccc8CC11x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y6E[];
Class_Descriptor cd__ZN3ccc8CC11x2y6E = {  "_ZN3ccc8CC11x2y6E", // class name
  bases__ZN3ccc8CC11x2y6E, 2,
  &(vtc__ZN3ccc8CC11x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y7  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC11x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y73pqrEv
  ~CC11x2y7(); // tgen
  CC11x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y7E) C1{ BC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y73abcEv");}
void  ccc::CC11x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y73pqrEv");}
ccc::CC11x2y7 ::~CC11x2y7(){ note_dtor("_ZN3ccc8CC11x2y7E", this);} // tgen
ccc::CC11x2y7 ::CC11x2y7(){ note_ctor("_ZN3ccc8CC11x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y7E, buf);
    ::ccc::CC11x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y7E);
    dp->::ccc::CC11x2y7::~CC11x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y7E(Test__ZN3ccc8CC11x2y7E, "_ZN3ccc8CC11x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y7C1Ev();
extern void _ZN3ccc8CC11x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y7E[] = {
  NSPAIR(_ZN3ccc8CC11x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y7E[];
extern void _ZN3ccc8CC11x2y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y73abcEv,_ZThn4_N3ccc8CC11x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y73pqrEv,_ZThn4_N3ccc8CC11x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y73abcEv,_ZThn4_N3ccc8CC11x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y73pqrEv,_ZThn4_N3ccc8CC11x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y7E[];
Class_Descriptor cd__ZN3ccc8CC11x2y7E = {  "_ZN3ccc8CC11x2y7E", // class name
  bases__ZN3ccc8CC11x2y7E, 2,
  &(vtc__ZN3ccc8CC11x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y8  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC11x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x2y83abcEv
  ~CC11x2y8(); // tgen
  CC11x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y8E) C1{ BC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y83efgEv");}
void  ccc::CC11x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x2y83abcEv");}
ccc::CC11x2y8 ::~CC11x2y8(){ note_dtor("_ZN3ccc8CC11x2y8E", this);} // tgen
ccc::CC11x2y8 ::CC11x2y8(){ note_ctor("_ZN3ccc8CC11x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y8E, buf);
    ::ccc::CC11x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y8E);
    dp->::ccc::CC11x2y8::~CC11x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y8E(Test__ZN3ccc8CC11x2y8E, "_ZN3ccc8CC11x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y8C1Ev();
extern void _ZN3ccc8CC11x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y8E[] = {
  NSPAIR(_ZN3ccc8CC11x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x2y83efgEv();
extern void _ZN3ccc8CC11x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y83efgEv,_ZThn4_N3ccc8CC11x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y83abcEv,_ZThn4_N3ccc8CC11x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y83efgEv,_ZThn4_N3ccc8CC11x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y83abcEv,_ZThn4_N3ccc8CC11x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y8E[];
Class_Descriptor cd__ZN3ccc8CC11x2y8E = {  "_ZN3ccc8CC11x2y8E", // class name
  bases__ZN3ccc8CC11x2y8E, 2,
  &(vtc__ZN3ccc8CC11x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y9  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC11x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x2y93pqrEv
  ~CC11x2y9(); // tgen
  CC11x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x2y9E) C1{ BC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x2y93efgEv");}
void  ccc::CC11x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x2y93pqrEv");}
ccc::CC11x2y9 ::~CC11x2y9(){ note_dtor("_ZN3ccc8CC11x2y9E", this);} // tgen
ccc::CC11x2y9 ::CC11x2y9(){ note_ctor("_ZN3ccc8CC11x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x2y9E, buf);
    ::ccc::CC11x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x2y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC11x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x2y9E);
    dp->::ccc::CC11x2y9::~CC11x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x2y9E(Test__ZN3ccc8CC11x2y9E, "_ZN3ccc8CC11x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x2y9C1Ev();
extern void _ZN3ccc8CC11x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x2y9E[] = {
  NSPAIR(_ZN3ccc8CC11x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC11x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y9E[];
extern void _ZN3ccc8CC11x2y93pqrEv();
extern void _ZN3ccc8CC11x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y93efgEv,_ZThn4_N3ccc8CC11x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x2y93pqrEv,_ZThn4_N3ccc8CC11x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y93efgEv,_ZThn4_N3ccc8CC11x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x2y93pqrEv,_ZThn4_N3ccc8CC11x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x2y9E[];
Class_Descriptor cd__ZN3ccc8CC11x2y9E = {  "_ZN3ccc8CC11x2y9E", // class name
  bases__ZN3ccc8CC11x2y9E, 2,
  &(vtc__ZN3ccc8CC11x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x2y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y10  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC11x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x2y103abcEv
  ~CC11x2y10(); // tgen
  CC11x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y10E) C1{ BC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x2y103pqrEv");}
void  ccc::CC11x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x2y103abcEv");}
ccc::CC11x2y10 ::~CC11x2y10(){ note_dtor("_ZN3ccc9CC11x2y10E", this);} // tgen
ccc::CC11x2y10 ::CC11x2y10(){ note_ctor("_ZN3ccc9CC11x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y10E, buf);
    ::ccc::CC11x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y10E);
    dp->::ccc::CC11x2y10::~CC11x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y10E(Test__ZN3ccc9CC11x2y10E, "_ZN3ccc9CC11x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y10C1Ev();
extern void _ZN3ccc9CC11x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y10E[] = {
  NSPAIR(_ZN3ccc9CC11x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y10E[];
extern void _ZN3ccc9CC11x2y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y103abcEv,_ZThn4_N3ccc9CC11x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y103pqrEv,_ZThn4_N3ccc9CC11x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y103abcEv,_ZThn4_N3ccc9CC11x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y103pqrEv,_ZThn4_N3ccc9CC11x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y10E[];
Class_Descriptor cd__ZN3ccc9CC11x2y10E = {  "_ZN3ccc9CC11x2y10E", // class name
  bases__ZN3ccc9CC11x2y10E, 2,
  &(vtc__ZN3ccc9CC11x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y11  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC11x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x2y113efgEv
  ~CC11x2y11(); // tgen
  CC11x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y11E) C1{ BC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x2y113pqrEv");}
void  ccc::CC11x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x2y113efgEv");}
ccc::CC11x2y11 ::~CC11x2y11(){ note_dtor("_ZN3ccc9CC11x2y11E", this);} // tgen
ccc::CC11x2y11 ::CC11x2y11(){ note_ctor("_ZN3ccc9CC11x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y11E, buf);
    ::ccc::CC11x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y11E);
    dp->::ccc::CC11x2y11::~CC11x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y11E(Test__ZN3ccc9CC11x2y11E, "_ZN3ccc9CC11x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y11C1Ev();
extern void _ZN3ccc9CC11x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y11E[] = {
  NSPAIR(_ZN3ccc9CC11x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y11E[];
extern void _ZN3ccc9CC11x2y113pqrEv();
extern void _ZN3ccc9CC11x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y113efgEv,_ZThn4_N3ccc9CC11x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y113pqrEv,_ZThn4_N3ccc9CC11x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y113efgEv,_ZThn4_N3ccc9CC11x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y113pqrEv,_ZThn4_N3ccc9CC11x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y11E[];
Class_Descriptor cd__ZN3ccc9CC11x2y11E = {  "_ZN3ccc9CC11x2y11E", // class name
  bases__ZN3ccc9CC11x2y11E, 2,
  &(vtc__ZN3ccc9CC11x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y12  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC11x2y123abcEv
  ~CC11x2y12(); // tgen
  CC11x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y12E) C1{ BC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC11x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x2y123abcEv");}
ccc::CC11x2y12 ::~CC11x2y12(){ note_dtor("_ZN3ccc9CC11x2y12E", this);} // tgen
ccc::CC11x2y12 ::CC11x2y12(){ note_ctor("_ZN3ccc9CC11x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y12E, buf);
    ::ccc::CC11x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y12E);
    dp->::ccc::CC11x2y12::~CC11x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y12E(Test__ZN3ccc9CC11x2y12E, "_ZN3ccc9CC11x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y12C1Ev();
extern void _ZN3ccc9CC11x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y12E[] = {
  NSPAIR(_ZN3ccc9CC11x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y123abcEv,_ZThn4_N3ccc9CC11x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y123abcEv,_ZThn4_N3ccc9CC11x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y12E[];
Class_Descriptor cd__ZN3ccc9CC11x2y12E = {  "_ZN3ccc9CC11x2y12E", // class name
  bases__ZN3ccc9CC11x2y12E, 2,
  &(vtc__ZN3ccc9CC11x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y13  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC11x2y133efgEv
  ~CC11x2y13(); // tgen
  CC11x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y13E) C1{ BC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x2y133efgEv");}
ccc::CC11x2y13 ::~CC11x2y13(){ note_dtor("_ZN3ccc9CC11x2y13E", this);} // tgen
ccc::CC11x2y13 ::CC11x2y13(){ note_ctor("_ZN3ccc9CC11x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y13E, buf);
    ::ccc::CC11x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y13E);
    dp->::ccc::CC11x2y13::~CC11x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y13E(Test__ZN3ccc9CC11x2y13E, "_ZN3ccc9CC11x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y13C1Ev();
extern void _ZN3ccc9CC11x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y13E[] = {
  NSPAIR(_ZN3ccc9CC11x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y133efgEv,_ZThn4_N3ccc9CC11x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y133efgEv,_ZThn4_N3ccc9CC11x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y13E[];
Class_Descriptor cd__ZN3ccc9CC11x2y13E = {  "_ZN3ccc9CC11x2y13E", // class name
  bases__ZN3ccc9CC11x2y13E, 2,
  &(vtc__ZN3ccc9CC11x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y14  : ::ccc::AA11 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC11x2y143pqrEv
  ~CC11x2y14(); // tgen
  CC11x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y14E) C1{ BC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x2y143pqrEv");}
ccc::CC11x2y14 ::~CC11x2y14(){ note_dtor("_ZN3ccc9CC11x2y14E", this);} // tgen
ccc::CC11x2y14 ::CC11x2y14(){ note_ctor("_ZN3ccc9CC11x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y14E, buf);
    ::ccc::CC11x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y14E);
    dp->::ccc::CC11x2y14::~CC11x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y14E(Test__ZN3ccc9CC11x2y14E, "_ZN3ccc9CC11x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y14C1Ev();
extern void _ZN3ccc9CC11x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y14E[] = {
  NSPAIR(_ZN3ccc9CC11x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y14E[];
extern void _ZN3ccc9CC11x2y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x2y143pqrEv,_ZThn4_N3ccc9CC11x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x2y143pqrEv,_ZThn4_N3ccc9CC11x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y14E[];
Class_Descriptor cd__ZN3ccc9CC11x2y14E = {  "_ZN3ccc9CC11x2y14E", // class name
  bases__ZN3ccc9CC11x2y14E, 2,
  &(vtc__ZN3ccc9CC11x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x2y15  : ::ccc::AA11 , ::ccc::BB2 {
  ~CC11x2y15(); // tgen
  CC11x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x2y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x2y15 ::~CC11x2y15(){ note_dtor("_ZN3ccc9CC11x2y15E", this);} // tgen
ccc::CC11x2y15 ::CC11x2y15(){ note_ctor("_ZN3ccc9CC11x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x2y15E, buf);
    ::ccc::CC11x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x2y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC11x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x2y15E);
    dp->::ccc::CC11x2y15::~CC11x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x2y15E(Test__ZN3ccc9CC11x2y15E, "_ZN3ccc9CC11x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x2y15C1Ev();
extern void _ZN3ccc9CC11x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x2y15E[] = {
  NSPAIR(_ZN3ccc9CC11x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC11x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x2y15E[];
Class_Descriptor cd__ZN3ccc9CC11x2y15E = {  "_ZN3ccc9CC11x2y15E", // class name
  bases__ZN3ccc9CC11x2y15E, 2,
  &(vtc__ZN3ccc9CC11x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x2y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y0  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC11x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y03pqrEv
  ~CC11x3y0(); // tgen
  CC11x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y0E) C1{ BC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y03abcEv");}
void  ccc::CC11x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y03efgEv");}
void  ccc::CC11x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y03pqrEv");}
ccc::CC11x3y0 ::~CC11x3y0(){ note_dtor("_ZN3ccc8CC11x3y0E", this);} // tgen
ccc::CC11x3y0 ::CC11x3y0(){ note_ctor("_ZN3ccc8CC11x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y0E, buf);
    ::ccc::CC11x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y0E);
    dp->::ccc::CC11x3y0::~CC11x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y0E(Test__ZN3ccc8CC11x3y0E, "_ZN3ccc8CC11x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y0C1Ev();
extern void _ZN3ccc8CC11x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y0E[] = {
  NSPAIR(_ZN3ccc8CC11x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y0E[];
extern void _ZN3ccc8CC11x3y03pqrEv();
extern void _ZN3ccc8CC11x3y03efgEv();
extern void _ZN3ccc8CC11x3y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y03efgEv,_ZThn4_N3ccc8CC11x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y03pqrEv,_ZThn4_N3ccc8CC11x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y03abcEv,_ZThn4_N3ccc8CC11x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y03efgEv,_ZThn4_N3ccc8CC11x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y03pqrEv,_ZThn4_N3ccc8CC11x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y03abcEv,_ZThn4_N3ccc8CC11x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y0E[];
Class_Descriptor cd__ZN3ccc8CC11x3y0E = {  "_ZN3ccc8CC11x3y0E", // class name
  bases__ZN3ccc8CC11x3y0E, 2,
  &(vtc__ZN3ccc8CC11x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y1  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC11x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x3y13efgEv
  ~CC11x3y1(); // tgen
  CC11x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y1E) C1{ BC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y13abcEv");}
void  ccc::CC11x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y13pqrEv");}
void  ccc::CC11x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y13efgEv");}
ccc::CC11x3y1 ::~CC11x3y1(){ note_dtor("_ZN3ccc8CC11x3y1E", this);} // tgen
ccc::CC11x3y1 ::CC11x3y1(){ note_ctor("_ZN3ccc8CC11x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y1E, buf);
    ::ccc::CC11x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y1E);
    dp->::ccc::CC11x3y1::~CC11x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y1E(Test__ZN3ccc8CC11x3y1E, "_ZN3ccc8CC11x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y1C1Ev();
extern void _ZN3ccc8CC11x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y1E[] = {
  NSPAIR(_ZN3ccc8CC11x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y1E[];
extern void _ZN3ccc8CC11x3y13pqrEv();
extern void _ZN3ccc8CC11x3y13efgEv();
extern void _ZN3ccc8CC11x3y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y13efgEv,_ZThn4_N3ccc8CC11x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y13pqrEv,_ZThn4_N3ccc8CC11x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y13abcEv,_ZThn4_N3ccc8CC11x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y13efgEv,_ZThn4_N3ccc8CC11x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y13pqrEv,_ZThn4_N3ccc8CC11x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y13abcEv,_ZThn4_N3ccc8CC11x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y1E[];
Class_Descriptor cd__ZN3ccc8CC11x3y1E = {  "_ZN3ccc8CC11x3y1E", // class name
  bases__ZN3ccc8CC11x3y1E, 2,
  &(vtc__ZN3ccc8CC11x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y2  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC11x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y23pqrEv
  ~CC11x3y2(); // tgen
  CC11x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y2E) C1{ BC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y23efgEv");}
void  ccc::CC11x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y23abcEv");}
void  ccc::CC11x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y23pqrEv");}
ccc::CC11x3y2 ::~CC11x3y2(){ note_dtor("_ZN3ccc8CC11x3y2E", this);} // tgen
ccc::CC11x3y2 ::CC11x3y2(){ note_ctor("_ZN3ccc8CC11x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y2E, buf);
    ::ccc::CC11x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y2E);
    dp->::ccc::CC11x3y2::~CC11x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y2E(Test__ZN3ccc8CC11x3y2E, "_ZN3ccc8CC11x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y2C1Ev();
extern void _ZN3ccc8CC11x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y2E[] = {
  NSPAIR(_ZN3ccc8CC11x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y2E[];
extern void _ZN3ccc8CC11x3y23pqrEv();
extern void _ZN3ccc8CC11x3y23efgEv();
extern void _ZN3ccc8CC11x3y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y23efgEv,_ZThn4_N3ccc8CC11x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y23pqrEv,_ZThn4_N3ccc8CC11x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y23abcEv,_ZThn4_N3ccc8CC11x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y23efgEv,_ZThn4_N3ccc8CC11x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y23pqrEv,_ZThn4_N3ccc8CC11x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y23abcEv,_ZThn4_N3ccc8CC11x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y2E[];
Class_Descriptor cd__ZN3ccc8CC11x3y2E = {  "_ZN3ccc8CC11x3y2E", // class name
  bases__ZN3ccc8CC11x3y2E, 2,
  &(vtc__ZN3ccc8CC11x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y3  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC11x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x3y33abcEv
  ~CC11x3y3(); // tgen
  CC11x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y3E) C1{ BC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y33efgEv");}
void  ccc::CC11x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y33pqrEv");}
void  ccc::CC11x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y33abcEv");}
ccc::CC11x3y3 ::~CC11x3y3(){ note_dtor("_ZN3ccc8CC11x3y3E", this);} // tgen
ccc::CC11x3y3 ::CC11x3y3(){ note_ctor("_ZN3ccc8CC11x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y3E, buf);
    ::ccc::CC11x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y3E);
    dp->::ccc::CC11x3y3::~CC11x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y3E(Test__ZN3ccc8CC11x3y3E, "_ZN3ccc8CC11x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y3C1Ev();
extern void _ZN3ccc8CC11x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y3E[] = {
  NSPAIR(_ZN3ccc8CC11x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y3E[];
extern void _ZN3ccc8CC11x3y33pqrEv();
extern void _ZN3ccc8CC11x3y33efgEv();
extern void _ZN3ccc8CC11x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y33efgEv,_ZThn4_N3ccc8CC11x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y33pqrEv,_ZThn4_N3ccc8CC11x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y33abcEv,_ZThn4_N3ccc8CC11x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y33efgEv,_ZThn4_N3ccc8CC11x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y33pqrEv,_ZThn4_N3ccc8CC11x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y33abcEv,_ZThn4_N3ccc8CC11x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y3E[];
Class_Descriptor cd__ZN3ccc8CC11x3y3E = {  "_ZN3ccc8CC11x3y3E", // class name
  bases__ZN3ccc8CC11x3y3E, 2,
  &(vtc__ZN3ccc8CC11x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y4  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC11x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x3y43efgEv
  ~CC11x3y4(); // tgen
  CC11x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y4E) C1{ BC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y43pqrEv");}
void  ccc::CC11x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y43abcEv");}
void  ccc::CC11x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y43efgEv");}
ccc::CC11x3y4 ::~CC11x3y4(){ note_dtor("_ZN3ccc8CC11x3y4E", this);} // tgen
ccc::CC11x3y4 ::CC11x3y4(){ note_ctor("_ZN3ccc8CC11x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y4E, buf);
    ::ccc::CC11x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y4E);
    dp->::ccc::CC11x3y4::~CC11x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y4E(Test__ZN3ccc8CC11x3y4E, "_ZN3ccc8CC11x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y4C1Ev();
extern void _ZN3ccc8CC11x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y4E[] = {
  NSPAIR(_ZN3ccc8CC11x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y4E[];
extern void _ZN3ccc8CC11x3y43pqrEv();
extern void _ZN3ccc8CC11x3y43efgEv();
extern void _ZN3ccc8CC11x3y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y43efgEv,_ZThn4_N3ccc8CC11x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y43pqrEv,_ZThn4_N3ccc8CC11x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y43abcEv,_ZThn4_N3ccc8CC11x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y43efgEv,_ZThn4_N3ccc8CC11x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y43pqrEv,_ZThn4_N3ccc8CC11x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y43abcEv,_ZThn4_N3ccc8CC11x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y4E[];
Class_Descriptor cd__ZN3ccc8CC11x3y4E = {  "_ZN3ccc8CC11x3y4E", // class name
  bases__ZN3ccc8CC11x3y4E, 2,
  &(vtc__ZN3ccc8CC11x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y5  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC11x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x3y53abcEv
  ~CC11x3y5(); // tgen
  CC11x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y5E) C1{ BC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y53pqrEv");}
void  ccc::CC11x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y53efgEv");}
void  ccc::CC11x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y53abcEv");}
ccc::CC11x3y5 ::~CC11x3y5(){ note_dtor("_ZN3ccc8CC11x3y5E", this);} // tgen
ccc::CC11x3y5 ::CC11x3y5(){ note_ctor("_ZN3ccc8CC11x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y5E, buf);
    ::ccc::CC11x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y5E);
    dp->::ccc::CC11x3y5::~CC11x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y5E(Test__ZN3ccc8CC11x3y5E, "_ZN3ccc8CC11x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y5C1Ev();
extern void _ZN3ccc8CC11x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y5E[] = {
  NSPAIR(_ZN3ccc8CC11x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y5E[];
extern void _ZN3ccc8CC11x3y53pqrEv();
extern void _ZN3ccc8CC11x3y53efgEv();
extern void _ZN3ccc8CC11x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y53efgEv,_ZThn4_N3ccc8CC11x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y53pqrEv,_ZThn4_N3ccc8CC11x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y53abcEv,_ZThn4_N3ccc8CC11x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y53efgEv,_ZThn4_N3ccc8CC11x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y53pqrEv,_ZThn4_N3ccc8CC11x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y53abcEv,_ZThn4_N3ccc8CC11x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y5E[];
Class_Descriptor cd__ZN3ccc8CC11x3y5E = {  "_ZN3ccc8CC11x3y5E", // class name
  bases__ZN3ccc8CC11x3y5E, 2,
  &(vtc__ZN3ccc8CC11x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y6  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC11x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x3y63efgEv
  ~CC11x3y6(); // tgen
  CC11x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y6E) C1{ BC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y63abcEv");}
void  ccc::CC11x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y63efgEv");}
ccc::CC11x3y6 ::~CC11x3y6(){ note_dtor("_ZN3ccc8CC11x3y6E", this);} // tgen
ccc::CC11x3y6 ::CC11x3y6(){ note_ctor("_ZN3ccc8CC11x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y6E, buf);
    ::ccc::CC11x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y6E);
    dp->::ccc::CC11x3y6::~CC11x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y6E(Test__ZN3ccc8CC11x3y6E, "_ZN3ccc8CC11x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y6C1Ev();
extern void _ZN3ccc8CC11x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y6E[] = {
  NSPAIR(_ZN3ccc8CC11x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x3y63efgEv();
extern void _ZN3ccc8CC11x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y63efgEv,_ZThn4_N3ccc8CC11x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y63abcEv,_ZThn4_N3ccc8CC11x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y63efgEv,_ZThn4_N3ccc8CC11x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y63abcEv,_ZThn4_N3ccc8CC11x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y6E[];
Class_Descriptor cd__ZN3ccc8CC11x3y6E = {  "_ZN3ccc8CC11x3y6E", // class name
  bases__ZN3ccc8CC11x3y6E, 2,
  &(vtc__ZN3ccc8CC11x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y7  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC11x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y73pqrEv
  ~CC11x3y7(); // tgen
  CC11x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y7E) C1{ BC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y73abcEv");}
void  ccc::CC11x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y73pqrEv");}
ccc::CC11x3y7 ::~CC11x3y7(){ note_dtor("_ZN3ccc8CC11x3y7E", this);} // tgen
ccc::CC11x3y7 ::CC11x3y7(){ note_ctor("_ZN3ccc8CC11x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y7E, buf);
    ::ccc::CC11x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y7E);
    dp->::ccc::CC11x3y7::~CC11x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y7E(Test__ZN3ccc8CC11x3y7E, "_ZN3ccc8CC11x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y7C1Ev();
extern void _ZN3ccc8CC11x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y7E[] = {
  NSPAIR(_ZN3ccc8CC11x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y7E[];
extern void _ZN3ccc8CC11x3y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y73pqrEv,_ZThn4_N3ccc8CC11x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y73abcEv,_ZThn4_N3ccc8CC11x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y73pqrEv,_ZThn4_N3ccc8CC11x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y73abcEv,_ZThn4_N3ccc8CC11x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y7E[];
Class_Descriptor cd__ZN3ccc8CC11x3y7E = {  "_ZN3ccc8CC11x3y7E", // class name
  bases__ZN3ccc8CC11x3y7E, 2,
  &(vtc__ZN3ccc8CC11x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y8  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC11x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x3y83abcEv
  ~CC11x3y8(); // tgen
  CC11x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y8E) C1{ BC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y83efgEv");}
void  ccc::CC11x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x3y83abcEv");}
ccc::CC11x3y8 ::~CC11x3y8(){ note_dtor("_ZN3ccc8CC11x3y8E", this);} // tgen
ccc::CC11x3y8 ::CC11x3y8(){ note_ctor("_ZN3ccc8CC11x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y8E, buf);
    ::ccc::CC11x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y8E);
    dp->::ccc::CC11x3y8::~CC11x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y8E(Test__ZN3ccc8CC11x3y8E, "_ZN3ccc8CC11x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y8C1Ev();
extern void _ZN3ccc8CC11x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y8E[] = {
  NSPAIR(_ZN3ccc8CC11x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x3y83efgEv();
extern void _ZN3ccc8CC11x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y83efgEv,_ZThn4_N3ccc8CC11x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y83abcEv,_ZThn4_N3ccc8CC11x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y83efgEv,_ZThn4_N3ccc8CC11x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y83abcEv,_ZThn4_N3ccc8CC11x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y8E[];
Class_Descriptor cd__ZN3ccc8CC11x3y8E = {  "_ZN3ccc8CC11x3y8E", // class name
  bases__ZN3ccc8CC11x3y8E, 2,
  &(vtc__ZN3ccc8CC11x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y9  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC11x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x3y93pqrEv
  ~CC11x3y9(); // tgen
  CC11x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x3y9E) C1{ BC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x3y93efgEv");}
void  ccc::CC11x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x3y93pqrEv");}
ccc::CC11x3y9 ::~CC11x3y9(){ note_dtor("_ZN3ccc8CC11x3y9E", this);} // tgen
ccc::CC11x3y9 ::CC11x3y9(){ note_ctor("_ZN3ccc8CC11x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x3y9E, buf);
    ::ccc::CC11x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x3y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC11x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x3y9E);
    dp->::ccc::CC11x3y9::~CC11x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x3y9E(Test__ZN3ccc8CC11x3y9E, "_ZN3ccc8CC11x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x3y9C1Ev();
extern void _ZN3ccc8CC11x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x3y9E[] = {
  NSPAIR(_ZN3ccc8CC11x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC11x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y9E[];
extern void _ZN3ccc8CC11x3y93pqrEv();
extern void _ZN3ccc8CC11x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y93efgEv,_ZThn4_N3ccc8CC11x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x3y93pqrEv,_ZThn4_N3ccc8CC11x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y93efgEv,_ZThn4_N3ccc8CC11x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x3y93pqrEv,_ZThn4_N3ccc8CC11x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x3y9E[];
Class_Descriptor cd__ZN3ccc8CC11x3y9E = {  "_ZN3ccc8CC11x3y9E", // class name
  bases__ZN3ccc8CC11x3y9E, 2,
  &(vtc__ZN3ccc8CC11x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x3y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y10  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC11x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x3y103abcEv
  ~CC11x3y10(); // tgen
  CC11x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y10E) C1{ BC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x3y103pqrEv");}
void  ccc::CC11x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x3y103abcEv");}
ccc::CC11x3y10 ::~CC11x3y10(){ note_dtor("_ZN3ccc9CC11x3y10E", this);} // tgen
ccc::CC11x3y10 ::CC11x3y10(){ note_ctor("_ZN3ccc9CC11x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y10E, buf);
    ::ccc::CC11x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y10E);
    dp->::ccc::CC11x3y10::~CC11x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y10E(Test__ZN3ccc9CC11x3y10E, "_ZN3ccc9CC11x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y10C1Ev();
extern void _ZN3ccc9CC11x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y10E[] = {
  NSPAIR(_ZN3ccc9CC11x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y10E[];
extern void _ZN3ccc9CC11x3y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y103pqrEv,_ZThn4_N3ccc9CC11x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y103abcEv,_ZThn4_N3ccc9CC11x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y103pqrEv,_ZThn4_N3ccc9CC11x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y103abcEv,_ZThn4_N3ccc9CC11x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y10E[];
Class_Descriptor cd__ZN3ccc9CC11x3y10E = {  "_ZN3ccc9CC11x3y10E", // class name
  bases__ZN3ccc9CC11x3y10E, 2,
  &(vtc__ZN3ccc9CC11x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y11  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC11x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x3y113efgEv
  ~CC11x3y11(); // tgen
  CC11x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y11E) C1{ BC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x3y113pqrEv");}
void  ccc::CC11x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x3y113efgEv");}
ccc::CC11x3y11 ::~CC11x3y11(){ note_dtor("_ZN3ccc9CC11x3y11E", this);} // tgen
ccc::CC11x3y11 ::CC11x3y11(){ note_ctor("_ZN3ccc9CC11x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y11E, buf);
    ::ccc::CC11x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y11E);
    dp->::ccc::CC11x3y11::~CC11x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y11E(Test__ZN3ccc9CC11x3y11E, "_ZN3ccc9CC11x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y11C1Ev();
extern void _ZN3ccc9CC11x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y11E[] = {
  NSPAIR(_ZN3ccc9CC11x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y11E[];
extern void _ZN3ccc9CC11x3y113pqrEv();
extern void _ZN3ccc9CC11x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y113efgEv,_ZThn4_N3ccc9CC11x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y113pqrEv,_ZThn4_N3ccc9CC11x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y113efgEv,_ZThn4_N3ccc9CC11x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y113pqrEv,_ZThn4_N3ccc9CC11x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y11E[];
Class_Descriptor cd__ZN3ccc9CC11x3y11E = {  "_ZN3ccc9CC11x3y11E", // class name
  bases__ZN3ccc9CC11x3y11E, 2,
  &(vtc__ZN3ccc9CC11x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y12  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC11x3y123abcEv
  ~CC11x3y12(); // tgen
  CC11x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y12E) C1{ BC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC11x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x3y123abcEv");}
ccc::CC11x3y12 ::~CC11x3y12(){ note_dtor("_ZN3ccc9CC11x3y12E", this);} // tgen
ccc::CC11x3y12 ::CC11x3y12(){ note_ctor("_ZN3ccc9CC11x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y12E, buf);
    ::ccc::CC11x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y12E);
    dp->::ccc::CC11x3y12::~CC11x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y12E(Test__ZN3ccc9CC11x3y12E, "_ZN3ccc9CC11x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y12C1Ev();
extern void _ZN3ccc9CC11x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y12E[] = {
  NSPAIR(_ZN3ccc9CC11x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y123abcEv,_ZThn4_N3ccc9CC11x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y123abcEv,_ZThn4_N3ccc9CC11x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y12E[];
Class_Descriptor cd__ZN3ccc9CC11x3y12E = {  "_ZN3ccc9CC11x3y12E", // class name
  bases__ZN3ccc9CC11x3y12E, 2,
  &(vtc__ZN3ccc9CC11x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y13  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC11x3y133efgEv
  ~CC11x3y13(); // tgen
  CC11x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y13E) C1{ BC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x3y133efgEv");}
ccc::CC11x3y13 ::~CC11x3y13(){ note_dtor("_ZN3ccc9CC11x3y13E", this);} // tgen
ccc::CC11x3y13 ::CC11x3y13(){ note_ctor("_ZN3ccc9CC11x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y13E, buf);
    ::ccc::CC11x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y13E);
    dp->::ccc::CC11x3y13::~CC11x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y13E(Test__ZN3ccc9CC11x3y13E, "_ZN3ccc9CC11x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y13C1Ev();
extern void _ZN3ccc9CC11x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y13E[] = {
  NSPAIR(_ZN3ccc9CC11x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y133efgEv,_ZThn4_N3ccc9CC11x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y133efgEv,_ZThn4_N3ccc9CC11x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y13E[];
Class_Descriptor cd__ZN3ccc9CC11x3y13E = {  "_ZN3ccc9CC11x3y13E", // class name
  bases__ZN3ccc9CC11x3y13E, 2,
  &(vtc__ZN3ccc9CC11x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y14  : ::ccc::AA11 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC11x3y143pqrEv
  ~CC11x3y14(); // tgen
  CC11x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y14E) C1{ BC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x3y143pqrEv");}
ccc::CC11x3y14 ::~CC11x3y14(){ note_dtor("_ZN3ccc9CC11x3y14E", this);} // tgen
ccc::CC11x3y14 ::CC11x3y14(){ note_ctor("_ZN3ccc9CC11x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y14E, buf);
    ::ccc::CC11x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y14E);
    dp->::ccc::CC11x3y14::~CC11x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y14E(Test__ZN3ccc9CC11x3y14E, "_ZN3ccc9CC11x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y14C1Ev();
extern void _ZN3ccc9CC11x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y14E[] = {
  NSPAIR(_ZN3ccc9CC11x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y14E[];
extern void _ZN3ccc9CC11x3y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x3y143pqrEv,_ZThn4_N3ccc9CC11x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x3y143pqrEv,_ZThn4_N3ccc9CC11x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y14E[];
Class_Descriptor cd__ZN3ccc9CC11x3y14E = {  "_ZN3ccc9CC11x3y14E", // class name
  bases__ZN3ccc9CC11x3y14E, 2,
  &(vtc__ZN3ccc9CC11x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x3y15  : ::ccc::AA11 , ::ccc::BB3 {
  ~CC11x3y15(); // tgen
  CC11x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x3y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x3y15 ::~CC11x3y15(){ note_dtor("_ZN3ccc9CC11x3y15E", this);} // tgen
ccc::CC11x3y15 ::CC11x3y15(){ note_ctor("_ZN3ccc9CC11x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x3y15E, buf);
    ::ccc::CC11x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x3y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC11x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x3y15E);
    dp->::ccc::CC11x3y15::~CC11x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x3y15E(Test__ZN3ccc9CC11x3y15E, "_ZN3ccc9CC11x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x3y15C1Ev();
extern void _ZN3ccc9CC11x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x3y15E[] = {
  NSPAIR(_ZN3ccc9CC11x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC11x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x3y15E[];
Class_Descriptor cd__ZN3ccc9CC11x3y15E = {  "_ZN3ccc9CC11x3y15E", // class name
  bases__ZN3ccc9CC11x3y15E, 2,
  &(vtc__ZN3ccc9CC11x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x3y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y0  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC11x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y03pqrEv
  ~CC11x4y0(); // tgen
  CC11x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y0E) C1{ BC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y03abcEv");}
void  ccc::CC11x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y03efgEv");}
void  ccc::CC11x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y03pqrEv");}
ccc::CC11x4y0 ::~CC11x4y0(){ note_dtor("_ZN3ccc8CC11x4y0E", this);} // tgen
ccc::CC11x4y0 ::CC11x4y0(){ note_ctor("_ZN3ccc8CC11x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y0E, buf);
    ::ccc::CC11x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y0E);
    dp->::ccc::CC11x4y0::~CC11x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y0E(Test__ZN3ccc8CC11x4y0E, "_ZN3ccc8CC11x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y0C1Ev();
extern void _ZN3ccc8CC11x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y0E[] = {
  NSPAIR(_ZN3ccc8CC11x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y0E[];
extern void _ZN3ccc8CC11x4y03pqrEv();
extern void _ZN3ccc8CC11x4y03efgEv();
extern void _ZN3ccc8CC11x4y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y03pqrEv,_ZThn4_N3ccc8CC11x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y03abcEv,_ZThn4_N3ccc8CC11x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y03efgEv,_ZThn4_N3ccc8CC11x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y03pqrEv,_ZThn4_N3ccc8CC11x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y03abcEv,_ZThn4_N3ccc8CC11x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y03efgEv,_ZThn4_N3ccc8CC11x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y0E[];
Class_Descriptor cd__ZN3ccc8CC11x4y0E = {  "_ZN3ccc8CC11x4y0E", // class name
  bases__ZN3ccc8CC11x4y0E, 2,
  &(vtc__ZN3ccc8CC11x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y1  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC11x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x4y13efgEv
  ~CC11x4y1(); // tgen
  CC11x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y1E) C1{ BC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y13abcEv");}
void  ccc::CC11x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y13pqrEv");}
void  ccc::CC11x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y13efgEv");}
ccc::CC11x4y1 ::~CC11x4y1(){ note_dtor("_ZN3ccc8CC11x4y1E", this);} // tgen
ccc::CC11x4y1 ::CC11x4y1(){ note_ctor("_ZN3ccc8CC11x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y1E, buf);
    ::ccc::CC11x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y1E);
    dp->::ccc::CC11x4y1::~CC11x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y1E(Test__ZN3ccc8CC11x4y1E, "_ZN3ccc8CC11x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y1C1Ev();
extern void _ZN3ccc8CC11x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y1E[] = {
  NSPAIR(_ZN3ccc8CC11x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y1E[];
extern void _ZN3ccc8CC11x4y13pqrEv();
extern void _ZN3ccc8CC11x4y13efgEv();
extern void _ZN3ccc8CC11x4y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y13pqrEv,_ZThn4_N3ccc8CC11x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y13abcEv,_ZThn4_N3ccc8CC11x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y13efgEv,_ZThn4_N3ccc8CC11x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y13pqrEv,_ZThn4_N3ccc8CC11x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y13abcEv,_ZThn4_N3ccc8CC11x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y13efgEv,_ZThn4_N3ccc8CC11x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y1E[];
Class_Descriptor cd__ZN3ccc8CC11x4y1E = {  "_ZN3ccc8CC11x4y1E", // class name
  bases__ZN3ccc8CC11x4y1E, 2,
  &(vtc__ZN3ccc8CC11x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y2  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC11x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y23pqrEv
  ~CC11x4y2(); // tgen
  CC11x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y2E) C1{ BC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y23efgEv");}
void  ccc::CC11x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y23abcEv");}
void  ccc::CC11x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y23pqrEv");}
ccc::CC11x4y2 ::~CC11x4y2(){ note_dtor("_ZN3ccc8CC11x4y2E", this);} // tgen
ccc::CC11x4y2 ::CC11x4y2(){ note_ctor("_ZN3ccc8CC11x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y2E, buf);
    ::ccc::CC11x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y2E);
    dp->::ccc::CC11x4y2::~CC11x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y2E(Test__ZN3ccc8CC11x4y2E, "_ZN3ccc8CC11x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y2C1Ev();
extern void _ZN3ccc8CC11x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y2E[] = {
  NSPAIR(_ZN3ccc8CC11x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y2E[];
extern void _ZN3ccc8CC11x4y23pqrEv();
extern void _ZN3ccc8CC11x4y23efgEv();
extern void _ZN3ccc8CC11x4y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y23pqrEv,_ZThn4_N3ccc8CC11x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y23abcEv,_ZThn4_N3ccc8CC11x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y23efgEv,_ZThn4_N3ccc8CC11x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y23pqrEv,_ZThn4_N3ccc8CC11x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y23abcEv,_ZThn4_N3ccc8CC11x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y23efgEv,_ZThn4_N3ccc8CC11x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y2E[];
Class_Descriptor cd__ZN3ccc8CC11x4y2E = {  "_ZN3ccc8CC11x4y2E", // class name
  bases__ZN3ccc8CC11x4y2E, 2,
  &(vtc__ZN3ccc8CC11x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y3  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC11x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x4y33abcEv
  ~CC11x4y3(); // tgen
  CC11x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y3E) C1{ BC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y33efgEv");}
void  ccc::CC11x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y33pqrEv");}
void  ccc::CC11x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y33abcEv");}
ccc::CC11x4y3 ::~CC11x4y3(){ note_dtor("_ZN3ccc8CC11x4y3E", this);} // tgen
ccc::CC11x4y3 ::CC11x4y3(){ note_ctor("_ZN3ccc8CC11x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y3E, buf);
    ::ccc::CC11x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y3E);
    dp->::ccc::CC11x4y3::~CC11x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y3E(Test__ZN3ccc8CC11x4y3E, "_ZN3ccc8CC11x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y3C1Ev();
extern void _ZN3ccc8CC11x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y3E[] = {
  NSPAIR(_ZN3ccc8CC11x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y3E[];
extern void _ZN3ccc8CC11x4y33pqrEv();
extern void _ZN3ccc8CC11x4y33efgEv();
extern void _ZN3ccc8CC11x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y33pqrEv,_ZThn4_N3ccc8CC11x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y33abcEv,_ZThn4_N3ccc8CC11x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y33efgEv,_ZThn4_N3ccc8CC11x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y33pqrEv,_ZThn4_N3ccc8CC11x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y33abcEv,_ZThn4_N3ccc8CC11x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y33efgEv,_ZThn4_N3ccc8CC11x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y3E[];
Class_Descriptor cd__ZN3ccc8CC11x4y3E = {  "_ZN3ccc8CC11x4y3E", // class name
  bases__ZN3ccc8CC11x4y3E, 2,
  &(vtc__ZN3ccc8CC11x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y4  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC11x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x4y43efgEv
  ~CC11x4y4(); // tgen
  CC11x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y4E) C1{ BC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y43pqrEv");}
void  ccc::CC11x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y43abcEv");}
void  ccc::CC11x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y43efgEv");}
ccc::CC11x4y4 ::~CC11x4y4(){ note_dtor("_ZN3ccc8CC11x4y4E", this);} // tgen
ccc::CC11x4y4 ::CC11x4y4(){ note_ctor("_ZN3ccc8CC11x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y4E, buf);
    ::ccc::CC11x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y4E);
    dp->::ccc::CC11x4y4::~CC11x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y4E(Test__ZN3ccc8CC11x4y4E, "_ZN3ccc8CC11x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y4C1Ev();
extern void _ZN3ccc8CC11x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y4E[] = {
  NSPAIR(_ZN3ccc8CC11x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y4E[];
extern void _ZN3ccc8CC11x4y43pqrEv();
extern void _ZN3ccc8CC11x4y43efgEv();
extern void _ZN3ccc8CC11x4y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y43pqrEv,_ZThn4_N3ccc8CC11x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y43abcEv,_ZThn4_N3ccc8CC11x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y43efgEv,_ZThn4_N3ccc8CC11x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y43pqrEv,_ZThn4_N3ccc8CC11x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y43abcEv,_ZThn4_N3ccc8CC11x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y43efgEv,_ZThn4_N3ccc8CC11x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y4E[];
Class_Descriptor cd__ZN3ccc8CC11x4y4E = {  "_ZN3ccc8CC11x4y4E", // class name
  bases__ZN3ccc8CC11x4y4E, 2,
  &(vtc__ZN3ccc8CC11x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y5  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC11x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x4y53abcEv
  ~CC11x4y5(); // tgen
  CC11x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y5E) C1{ BC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y53pqrEv");}
void  ccc::CC11x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y53efgEv");}
void  ccc::CC11x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y53abcEv");}
ccc::CC11x4y5 ::~CC11x4y5(){ note_dtor("_ZN3ccc8CC11x4y5E", this);} // tgen
ccc::CC11x4y5 ::CC11x4y5(){ note_ctor("_ZN3ccc8CC11x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y5E, buf);
    ::ccc::CC11x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y5E);
    dp->::ccc::CC11x4y5::~CC11x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y5E(Test__ZN3ccc8CC11x4y5E, "_ZN3ccc8CC11x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y5C1Ev();
extern void _ZN3ccc8CC11x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y5E[] = {
  NSPAIR(_ZN3ccc8CC11x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y5E[];
extern void _ZN3ccc8CC11x4y53pqrEv();
extern void _ZN3ccc8CC11x4y53efgEv();
extern void _ZN3ccc8CC11x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y53pqrEv,_ZThn4_N3ccc8CC11x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y53abcEv,_ZThn4_N3ccc8CC11x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y53efgEv,_ZThn4_N3ccc8CC11x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y53pqrEv,_ZThn4_N3ccc8CC11x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y53abcEv,_ZThn4_N3ccc8CC11x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y53efgEv,_ZThn4_N3ccc8CC11x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y5E[];
Class_Descriptor cd__ZN3ccc8CC11x4y5E = {  "_ZN3ccc8CC11x4y5E", // class name
  bases__ZN3ccc8CC11x4y5E, 2,
  &(vtc__ZN3ccc8CC11x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y6  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC11x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x4y63efgEv
  ~CC11x4y6(); // tgen
  CC11x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y6E) C1{ BC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y63abcEv");}
void  ccc::CC11x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y63efgEv");}
ccc::CC11x4y6 ::~CC11x4y6(){ note_dtor("_ZN3ccc8CC11x4y6E", this);} // tgen
ccc::CC11x4y6 ::CC11x4y6(){ note_ctor("_ZN3ccc8CC11x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y6E, buf);
    ::ccc::CC11x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y6E);
    dp->::ccc::CC11x4y6::~CC11x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y6E(Test__ZN3ccc8CC11x4y6E, "_ZN3ccc8CC11x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y6C1Ev();
extern void _ZN3ccc8CC11x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y6E[] = {
  NSPAIR(_ZN3ccc8CC11x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x4y63efgEv();
extern void _ZN3ccc8CC11x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y63abcEv,_ZThn4_N3ccc8CC11x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y63efgEv,_ZThn4_N3ccc8CC11x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y63abcEv,_ZThn4_N3ccc8CC11x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y63efgEv,_ZThn4_N3ccc8CC11x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y6E[];
Class_Descriptor cd__ZN3ccc8CC11x4y6E = {  "_ZN3ccc8CC11x4y6E", // class name
  bases__ZN3ccc8CC11x4y6E, 2,
  &(vtc__ZN3ccc8CC11x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y7  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC11x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y73pqrEv
  ~CC11x4y7(); // tgen
  CC11x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y7E) C1{ BC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y73abcEv");}
void  ccc::CC11x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y73pqrEv");}
ccc::CC11x4y7 ::~CC11x4y7(){ note_dtor("_ZN3ccc8CC11x4y7E", this);} // tgen
ccc::CC11x4y7 ::CC11x4y7(){ note_ctor("_ZN3ccc8CC11x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y7E, buf);
    ::ccc::CC11x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y7E);
    dp->::ccc::CC11x4y7::~CC11x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y7E(Test__ZN3ccc8CC11x4y7E, "_ZN3ccc8CC11x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y7C1Ev();
extern void _ZN3ccc8CC11x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y7E[] = {
  NSPAIR(_ZN3ccc8CC11x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y7E[];
extern void _ZN3ccc8CC11x4y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y73pqrEv,_ZThn4_N3ccc8CC11x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y73abcEv,_ZThn4_N3ccc8CC11x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y73pqrEv,_ZThn4_N3ccc8CC11x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y73abcEv,_ZThn4_N3ccc8CC11x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y7E[];
Class_Descriptor cd__ZN3ccc8CC11x4y7E = {  "_ZN3ccc8CC11x4y7E", // class name
  bases__ZN3ccc8CC11x4y7E, 2,
  &(vtc__ZN3ccc8CC11x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y8  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC11x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x4y83abcEv
  ~CC11x4y8(); // tgen
  CC11x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y8E) C1{ BC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y83efgEv");}
void  ccc::CC11x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x4y83abcEv");}
ccc::CC11x4y8 ::~CC11x4y8(){ note_dtor("_ZN3ccc8CC11x4y8E", this);} // tgen
ccc::CC11x4y8 ::CC11x4y8(){ note_ctor("_ZN3ccc8CC11x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y8E, buf);
    ::ccc::CC11x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y8E);
    dp->::ccc::CC11x4y8::~CC11x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y8E(Test__ZN3ccc8CC11x4y8E, "_ZN3ccc8CC11x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y8C1Ev();
extern void _ZN3ccc8CC11x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y8E[] = {
  NSPAIR(_ZN3ccc8CC11x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x4y83efgEv();
extern void _ZN3ccc8CC11x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y83abcEv,_ZThn4_N3ccc8CC11x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y83efgEv,_ZThn4_N3ccc8CC11x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y83abcEv,_ZThn4_N3ccc8CC11x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y83efgEv,_ZThn4_N3ccc8CC11x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y8E[];
Class_Descriptor cd__ZN3ccc8CC11x4y8E = {  "_ZN3ccc8CC11x4y8E", // class name
  bases__ZN3ccc8CC11x4y8E, 2,
  &(vtc__ZN3ccc8CC11x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y9  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC11x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x4y93pqrEv
  ~CC11x4y9(); // tgen
  CC11x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x4y9E) C1{ BC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x4y93efgEv");}
void  ccc::CC11x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x4y93pqrEv");}
ccc::CC11x4y9 ::~CC11x4y9(){ note_dtor("_ZN3ccc8CC11x4y9E", this);} // tgen
ccc::CC11x4y9 ::CC11x4y9(){ note_ctor("_ZN3ccc8CC11x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x4y9E, buf);
    ::ccc::CC11x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x4y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC11x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x4y9E);
    dp->::ccc::CC11x4y9::~CC11x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x4y9E(Test__ZN3ccc8CC11x4y9E, "_ZN3ccc8CC11x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x4y9C1Ev();
extern void _ZN3ccc8CC11x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x4y9E[] = {
  NSPAIR(_ZN3ccc8CC11x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC11x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y9E[];
extern void _ZN3ccc8CC11x4y93pqrEv();
extern void _ZN3ccc8CC11x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y93pqrEv,_ZThn4_N3ccc8CC11x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x4y93efgEv,_ZThn4_N3ccc8CC11x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y93pqrEv,_ZThn4_N3ccc8CC11x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x4y93efgEv,_ZThn4_N3ccc8CC11x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x4y9E[];
Class_Descriptor cd__ZN3ccc8CC11x4y9E = {  "_ZN3ccc8CC11x4y9E", // class name
  bases__ZN3ccc8CC11x4y9E, 2,
  &(vtc__ZN3ccc8CC11x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x4y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y10  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC11x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x4y103abcEv
  ~CC11x4y10(); // tgen
  CC11x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y10E) C1{ BC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x4y103pqrEv");}
void  ccc::CC11x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x4y103abcEv");}
ccc::CC11x4y10 ::~CC11x4y10(){ note_dtor("_ZN3ccc9CC11x4y10E", this);} // tgen
ccc::CC11x4y10 ::CC11x4y10(){ note_ctor("_ZN3ccc9CC11x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y10E, buf);
    ::ccc::CC11x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y10E);
    dp->::ccc::CC11x4y10::~CC11x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y10E(Test__ZN3ccc9CC11x4y10E, "_ZN3ccc9CC11x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y10C1Ev();
extern void _ZN3ccc9CC11x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y10E[] = {
  NSPAIR(_ZN3ccc9CC11x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y10E[];
extern void _ZN3ccc9CC11x4y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y103pqrEv,_ZThn4_N3ccc9CC11x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y103abcEv,_ZThn4_N3ccc9CC11x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y103pqrEv,_ZThn4_N3ccc9CC11x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y103abcEv,_ZThn4_N3ccc9CC11x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y10E[];
Class_Descriptor cd__ZN3ccc9CC11x4y10E = {  "_ZN3ccc9CC11x4y10E", // class name
  bases__ZN3ccc9CC11x4y10E, 2,
  &(vtc__ZN3ccc9CC11x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y11  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC11x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x4y113efgEv
  ~CC11x4y11(); // tgen
  CC11x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y11E) C1{ BC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x4y113pqrEv");}
void  ccc::CC11x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x4y113efgEv");}
ccc::CC11x4y11 ::~CC11x4y11(){ note_dtor("_ZN3ccc9CC11x4y11E", this);} // tgen
ccc::CC11x4y11 ::CC11x4y11(){ note_ctor("_ZN3ccc9CC11x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y11E, buf);
    ::ccc::CC11x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y11E);
    dp->::ccc::CC11x4y11::~CC11x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y11E(Test__ZN3ccc9CC11x4y11E, "_ZN3ccc9CC11x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y11C1Ev();
extern void _ZN3ccc9CC11x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y11E[] = {
  NSPAIR(_ZN3ccc9CC11x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y11E[];
extern void _ZN3ccc9CC11x4y113pqrEv();
extern void _ZN3ccc9CC11x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y113pqrEv,_ZThn4_N3ccc9CC11x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y113efgEv,_ZThn4_N3ccc9CC11x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y113pqrEv,_ZThn4_N3ccc9CC11x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y113efgEv,_ZThn4_N3ccc9CC11x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y11E[];
Class_Descriptor cd__ZN3ccc9CC11x4y11E = {  "_ZN3ccc9CC11x4y11E", // class name
  bases__ZN3ccc9CC11x4y11E, 2,
  &(vtc__ZN3ccc9CC11x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y12  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC11x4y123abcEv
  ~CC11x4y12(); // tgen
  CC11x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y12E) C1{ BC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC11x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x4y123abcEv");}
ccc::CC11x4y12 ::~CC11x4y12(){ note_dtor("_ZN3ccc9CC11x4y12E", this);} // tgen
ccc::CC11x4y12 ::CC11x4y12(){ note_ctor("_ZN3ccc9CC11x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y12E, buf);
    ::ccc::CC11x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y12E);
    dp->::ccc::CC11x4y12::~CC11x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y12E(Test__ZN3ccc9CC11x4y12E, "_ZN3ccc9CC11x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y12C1Ev();
extern void _ZN3ccc9CC11x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y12E[] = {
  NSPAIR(_ZN3ccc9CC11x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y123abcEv,_ZThn4_N3ccc9CC11x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y123abcEv,_ZThn4_N3ccc9CC11x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y12E[];
Class_Descriptor cd__ZN3ccc9CC11x4y12E = {  "_ZN3ccc9CC11x4y12E", // class name
  bases__ZN3ccc9CC11x4y12E, 2,
  &(vtc__ZN3ccc9CC11x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y13  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC11x4y133efgEv
  ~CC11x4y13(); // tgen
  CC11x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y13E) C1{ BC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x4y133efgEv");}
ccc::CC11x4y13 ::~CC11x4y13(){ note_dtor("_ZN3ccc9CC11x4y13E", this);} // tgen
ccc::CC11x4y13 ::CC11x4y13(){ note_ctor("_ZN3ccc9CC11x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y13E, buf);
    ::ccc::CC11x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y13E);
    dp->::ccc::CC11x4y13::~CC11x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y13E(Test__ZN3ccc9CC11x4y13E, "_ZN3ccc9CC11x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y13C1Ev();
extern void _ZN3ccc9CC11x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y13E[] = {
  NSPAIR(_ZN3ccc9CC11x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y133efgEv,_ZThn4_N3ccc9CC11x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y133efgEv,_ZThn4_N3ccc9CC11x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y13E[];
Class_Descriptor cd__ZN3ccc9CC11x4y13E = {  "_ZN3ccc9CC11x4y13E", // class name
  bases__ZN3ccc9CC11x4y13E, 2,
  &(vtc__ZN3ccc9CC11x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y14  : ::ccc::AA11 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC11x4y143pqrEv
  ~CC11x4y14(); // tgen
  CC11x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y14E) C1{ BC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x4y143pqrEv");}
ccc::CC11x4y14 ::~CC11x4y14(){ note_dtor("_ZN3ccc9CC11x4y14E", this);} // tgen
ccc::CC11x4y14 ::CC11x4y14(){ note_ctor("_ZN3ccc9CC11x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y14E, buf);
    ::ccc::CC11x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y14E);
    dp->::ccc::CC11x4y14::~CC11x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y14E(Test__ZN3ccc9CC11x4y14E, "_ZN3ccc9CC11x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y14C1Ev();
extern void _ZN3ccc9CC11x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y14E[] = {
  NSPAIR(_ZN3ccc9CC11x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y14E[];
extern void _ZN3ccc9CC11x4y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x4y143pqrEv,_ZThn4_N3ccc9CC11x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x4y143pqrEv,_ZThn4_N3ccc9CC11x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y14E[];
Class_Descriptor cd__ZN3ccc9CC11x4y14E = {  "_ZN3ccc9CC11x4y14E", // class name
  bases__ZN3ccc9CC11x4y14E, 2,
  &(vtc__ZN3ccc9CC11x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x4y15  : ::ccc::AA11 , ::ccc::BB4 {
  ~CC11x4y15(); // tgen
  CC11x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x4y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x4y15 ::~CC11x4y15(){ note_dtor("_ZN3ccc9CC11x4y15E", this);} // tgen
ccc::CC11x4y15 ::CC11x4y15(){ note_ctor("_ZN3ccc9CC11x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x4y15E, buf);
    ::ccc::CC11x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x4y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC11x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x4y15E);
    dp->::ccc::CC11x4y15::~CC11x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x4y15E(Test__ZN3ccc9CC11x4y15E, "_ZN3ccc9CC11x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x4y15C1Ev();
extern void _ZN3ccc9CC11x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x4y15E[] = {
  NSPAIR(_ZN3ccc9CC11x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC11x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x4y15E[];
Class_Descriptor cd__ZN3ccc9CC11x4y15E = {  "_ZN3ccc9CC11x4y15E", // class name
  bases__ZN3ccc9CC11x4y15E, 2,
  &(vtc__ZN3ccc9CC11x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x4y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y0  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC11x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y03pqrEv
  ~CC11x5y0(); // tgen
  CC11x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y0E) C1{ BC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y03abcEv");}
void  ccc::CC11x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y03efgEv");}
void  ccc::CC11x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y03pqrEv");}
ccc::CC11x5y0 ::~CC11x5y0(){ note_dtor("_ZN3ccc8CC11x5y0E", this);} // tgen
ccc::CC11x5y0 ::CC11x5y0(){ note_ctor("_ZN3ccc8CC11x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y0E, buf);
    ::ccc::CC11x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y0E);
    dp->::ccc::CC11x5y0::~CC11x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y0E(Test__ZN3ccc8CC11x5y0E, "_ZN3ccc8CC11x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y0C1Ev();
extern void _ZN3ccc8CC11x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y0E[] = {
  NSPAIR(_ZN3ccc8CC11x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y0E[];
extern void _ZN3ccc8CC11x5y03pqrEv();
extern void _ZN3ccc8CC11x5y03efgEv();
extern void _ZN3ccc8CC11x5y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y03pqrEv,_ZThn4_N3ccc8CC11x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y03efgEv,_ZThn4_N3ccc8CC11x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y03abcEv,_ZThn4_N3ccc8CC11x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y03pqrEv,_ZThn4_N3ccc8CC11x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y03efgEv,_ZThn4_N3ccc8CC11x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y03abcEv,_ZThn4_N3ccc8CC11x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y0E[];
Class_Descriptor cd__ZN3ccc8CC11x5y0E = {  "_ZN3ccc8CC11x5y0E", // class name
  bases__ZN3ccc8CC11x5y0E, 2,
  &(vtc__ZN3ccc8CC11x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y1  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC11x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x5y13efgEv
  ~CC11x5y1(); // tgen
  CC11x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y1E) C1{ BC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y13abcEv");}
void  ccc::CC11x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y13pqrEv");}
void  ccc::CC11x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y13efgEv");}
ccc::CC11x5y1 ::~CC11x5y1(){ note_dtor("_ZN3ccc8CC11x5y1E", this);} // tgen
ccc::CC11x5y1 ::CC11x5y1(){ note_ctor("_ZN3ccc8CC11x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y1E, buf);
    ::ccc::CC11x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y1E);
    dp->::ccc::CC11x5y1::~CC11x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y1E(Test__ZN3ccc8CC11x5y1E, "_ZN3ccc8CC11x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y1C1Ev();
extern void _ZN3ccc8CC11x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y1E[] = {
  NSPAIR(_ZN3ccc8CC11x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y1E[];
extern void _ZN3ccc8CC11x5y13pqrEv();
extern void _ZN3ccc8CC11x5y13efgEv();
extern void _ZN3ccc8CC11x5y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y13pqrEv,_ZThn4_N3ccc8CC11x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y13efgEv,_ZThn4_N3ccc8CC11x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y13abcEv,_ZThn4_N3ccc8CC11x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y13pqrEv,_ZThn4_N3ccc8CC11x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y13efgEv,_ZThn4_N3ccc8CC11x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y13abcEv,_ZThn4_N3ccc8CC11x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y1E[];
Class_Descriptor cd__ZN3ccc8CC11x5y1E = {  "_ZN3ccc8CC11x5y1E", // class name
  bases__ZN3ccc8CC11x5y1E, 2,
  &(vtc__ZN3ccc8CC11x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y2  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC11x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y23pqrEv
  ~CC11x5y2(); // tgen
  CC11x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y2E) C1{ BC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y23efgEv");}
void  ccc::CC11x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y23abcEv");}
void  ccc::CC11x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y23pqrEv");}
ccc::CC11x5y2 ::~CC11x5y2(){ note_dtor("_ZN3ccc8CC11x5y2E", this);} // tgen
ccc::CC11x5y2 ::CC11x5y2(){ note_ctor("_ZN3ccc8CC11x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y2E, buf);
    ::ccc::CC11x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y2E);
    dp->::ccc::CC11x5y2::~CC11x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y2E(Test__ZN3ccc8CC11x5y2E, "_ZN3ccc8CC11x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y2C1Ev();
extern void _ZN3ccc8CC11x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y2E[] = {
  NSPAIR(_ZN3ccc8CC11x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y2E[];
extern void _ZN3ccc8CC11x5y23pqrEv();
extern void _ZN3ccc8CC11x5y23efgEv();
extern void _ZN3ccc8CC11x5y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y23pqrEv,_ZThn4_N3ccc8CC11x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y23efgEv,_ZThn4_N3ccc8CC11x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y23abcEv,_ZThn4_N3ccc8CC11x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y23pqrEv,_ZThn4_N3ccc8CC11x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y23efgEv,_ZThn4_N3ccc8CC11x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y23abcEv,_ZThn4_N3ccc8CC11x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y2E[];
Class_Descriptor cd__ZN3ccc8CC11x5y2E = {  "_ZN3ccc8CC11x5y2E", // class name
  bases__ZN3ccc8CC11x5y2E, 2,
  &(vtc__ZN3ccc8CC11x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y3  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC11x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x5y33abcEv
  ~CC11x5y3(); // tgen
  CC11x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y3E) C1{ BC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y33efgEv");}
void  ccc::CC11x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y33pqrEv");}
void  ccc::CC11x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y33abcEv");}
ccc::CC11x5y3 ::~CC11x5y3(){ note_dtor("_ZN3ccc8CC11x5y3E", this);} // tgen
ccc::CC11x5y3 ::CC11x5y3(){ note_ctor("_ZN3ccc8CC11x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y3E, buf);
    ::ccc::CC11x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y3E);
    dp->::ccc::CC11x5y3::~CC11x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y3E(Test__ZN3ccc8CC11x5y3E, "_ZN3ccc8CC11x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y3C1Ev();
extern void _ZN3ccc8CC11x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y3E[] = {
  NSPAIR(_ZN3ccc8CC11x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y3E[];
extern void _ZN3ccc8CC11x5y33pqrEv();
extern void _ZN3ccc8CC11x5y33efgEv();
extern void _ZN3ccc8CC11x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y33pqrEv,_ZThn4_N3ccc8CC11x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y33efgEv,_ZThn4_N3ccc8CC11x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y33abcEv,_ZThn4_N3ccc8CC11x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y33pqrEv,_ZThn4_N3ccc8CC11x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y33efgEv,_ZThn4_N3ccc8CC11x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y33abcEv,_ZThn4_N3ccc8CC11x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y3E[];
Class_Descriptor cd__ZN3ccc8CC11x5y3E = {  "_ZN3ccc8CC11x5y3E", // class name
  bases__ZN3ccc8CC11x5y3E, 2,
  &(vtc__ZN3ccc8CC11x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y4  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC11x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x5y43efgEv
  ~CC11x5y4(); // tgen
  CC11x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y4E) C1{ BC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y43pqrEv");}
void  ccc::CC11x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y43abcEv");}
void  ccc::CC11x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y43efgEv");}
ccc::CC11x5y4 ::~CC11x5y4(){ note_dtor("_ZN3ccc8CC11x5y4E", this);} // tgen
ccc::CC11x5y4 ::CC11x5y4(){ note_ctor("_ZN3ccc8CC11x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y4E, buf);
    ::ccc::CC11x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y4E);
    dp->::ccc::CC11x5y4::~CC11x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y4E(Test__ZN3ccc8CC11x5y4E, "_ZN3ccc8CC11x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y4C1Ev();
extern void _ZN3ccc8CC11x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y4E[] = {
  NSPAIR(_ZN3ccc8CC11x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y4E[];
extern void _ZN3ccc8CC11x5y43pqrEv();
extern void _ZN3ccc8CC11x5y43efgEv();
extern void _ZN3ccc8CC11x5y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y43pqrEv,_ZThn4_N3ccc8CC11x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y43efgEv,_ZThn4_N3ccc8CC11x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y43abcEv,_ZThn4_N3ccc8CC11x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y43pqrEv,_ZThn4_N3ccc8CC11x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y43efgEv,_ZThn4_N3ccc8CC11x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y43abcEv,_ZThn4_N3ccc8CC11x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y4E[];
Class_Descriptor cd__ZN3ccc8CC11x5y4E = {  "_ZN3ccc8CC11x5y4E", // class name
  bases__ZN3ccc8CC11x5y4E, 2,
  &(vtc__ZN3ccc8CC11x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y5  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC11x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x5y53abcEv
  ~CC11x5y5(); // tgen
  CC11x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y5E) C1{ BC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y53pqrEv");}
void  ccc::CC11x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y53efgEv");}
void  ccc::CC11x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y53abcEv");}
ccc::CC11x5y5 ::~CC11x5y5(){ note_dtor("_ZN3ccc8CC11x5y5E", this);} // tgen
ccc::CC11x5y5 ::CC11x5y5(){ note_ctor("_ZN3ccc8CC11x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y5E, buf);
    ::ccc::CC11x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y5E);
    dp->::ccc::CC11x5y5::~CC11x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y5E(Test__ZN3ccc8CC11x5y5E, "_ZN3ccc8CC11x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y5C1Ev();
extern void _ZN3ccc8CC11x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y5E[] = {
  NSPAIR(_ZN3ccc8CC11x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y5E[];
extern void _ZN3ccc8CC11x5y53pqrEv();
extern void _ZN3ccc8CC11x5y53efgEv();
extern void _ZN3ccc8CC11x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y53pqrEv,_ZThn4_N3ccc8CC11x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y53efgEv,_ZThn4_N3ccc8CC11x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y53abcEv,_ZThn4_N3ccc8CC11x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y53pqrEv,_ZThn4_N3ccc8CC11x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y53efgEv,_ZThn4_N3ccc8CC11x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y53abcEv,_ZThn4_N3ccc8CC11x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y5E[];
Class_Descriptor cd__ZN3ccc8CC11x5y5E = {  "_ZN3ccc8CC11x5y5E", // class name
  bases__ZN3ccc8CC11x5y5E, 2,
  &(vtc__ZN3ccc8CC11x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y6  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC11x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x5y63efgEv
  ~CC11x5y6(); // tgen
  CC11x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y6E) C1{ BC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y63abcEv");}
void  ccc::CC11x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y63efgEv");}
ccc::CC11x5y6 ::~CC11x5y6(){ note_dtor("_ZN3ccc8CC11x5y6E", this);} // tgen
ccc::CC11x5y6 ::CC11x5y6(){ note_ctor("_ZN3ccc8CC11x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y6E, buf);
    ::ccc::CC11x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y6E);
    dp->::ccc::CC11x5y6::~CC11x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y6E(Test__ZN3ccc8CC11x5y6E, "_ZN3ccc8CC11x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y6C1Ev();
extern void _ZN3ccc8CC11x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y6E[] = {
  NSPAIR(_ZN3ccc8CC11x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x5y63efgEv();
extern void _ZN3ccc8CC11x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y63efgEv,_ZThn4_N3ccc8CC11x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y63abcEv,_ZThn4_N3ccc8CC11x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y63efgEv,_ZThn4_N3ccc8CC11x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y63abcEv,_ZThn4_N3ccc8CC11x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y6E[];
Class_Descriptor cd__ZN3ccc8CC11x5y6E = {  "_ZN3ccc8CC11x5y6E", // class name
  bases__ZN3ccc8CC11x5y6E, 2,
  &(vtc__ZN3ccc8CC11x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y7  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC11x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y73pqrEv
  ~CC11x5y7(); // tgen
  CC11x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y7E) C1{ BC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y73abcEv");}
void  ccc::CC11x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y73pqrEv");}
ccc::CC11x5y7 ::~CC11x5y7(){ note_dtor("_ZN3ccc8CC11x5y7E", this);} // tgen
ccc::CC11x5y7 ::CC11x5y7(){ note_ctor("_ZN3ccc8CC11x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y7E, buf);
    ::ccc::CC11x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y7E);
    dp->::ccc::CC11x5y7::~CC11x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y7E(Test__ZN3ccc8CC11x5y7E, "_ZN3ccc8CC11x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y7C1Ev();
extern void _ZN3ccc8CC11x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y7E[] = {
  NSPAIR(_ZN3ccc8CC11x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y7E[];
extern void _ZN3ccc8CC11x5y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y73pqrEv,_ZThn4_N3ccc8CC11x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y73abcEv,_ZThn4_N3ccc8CC11x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y73pqrEv,_ZThn4_N3ccc8CC11x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y73abcEv,_ZThn4_N3ccc8CC11x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y7E[];
Class_Descriptor cd__ZN3ccc8CC11x5y7E = {  "_ZN3ccc8CC11x5y7E", // class name
  bases__ZN3ccc8CC11x5y7E, 2,
  &(vtc__ZN3ccc8CC11x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y8  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC11x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x5y83abcEv
  ~CC11x5y8(); // tgen
  CC11x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y8E) C1{ BC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y83efgEv");}
void  ccc::CC11x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x5y83abcEv");}
ccc::CC11x5y8 ::~CC11x5y8(){ note_dtor("_ZN3ccc8CC11x5y8E", this);} // tgen
ccc::CC11x5y8 ::CC11x5y8(){ note_ctor("_ZN3ccc8CC11x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y8E, buf);
    ::ccc::CC11x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y8E);
    dp->::ccc::CC11x5y8::~CC11x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y8E(Test__ZN3ccc8CC11x5y8E, "_ZN3ccc8CC11x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y8C1Ev();
extern void _ZN3ccc8CC11x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y8E[] = {
  NSPAIR(_ZN3ccc8CC11x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x5y83efgEv();
extern void _ZN3ccc8CC11x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y83efgEv,_ZThn4_N3ccc8CC11x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y83abcEv,_ZThn4_N3ccc8CC11x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y83efgEv,_ZThn4_N3ccc8CC11x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y83abcEv,_ZThn4_N3ccc8CC11x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y8E[];
Class_Descriptor cd__ZN3ccc8CC11x5y8E = {  "_ZN3ccc8CC11x5y8E", // class name
  bases__ZN3ccc8CC11x5y8E, 2,
  &(vtc__ZN3ccc8CC11x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y9  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC11x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x5y93pqrEv
  ~CC11x5y9(); // tgen
  CC11x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x5y9E) C1{ BC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x5y93efgEv");}
void  ccc::CC11x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x5y93pqrEv");}
ccc::CC11x5y9 ::~CC11x5y9(){ note_dtor("_ZN3ccc8CC11x5y9E", this);} // tgen
ccc::CC11x5y9 ::CC11x5y9(){ note_ctor("_ZN3ccc8CC11x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x5y9E, buf);
    ::ccc::CC11x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x5y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC11x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x5y9E);
    dp->::ccc::CC11x5y9::~CC11x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x5y9E(Test__ZN3ccc8CC11x5y9E, "_ZN3ccc8CC11x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x5y9C1Ev();
extern void _ZN3ccc8CC11x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x5y9E[] = {
  NSPAIR(_ZN3ccc8CC11x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC11x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y9E[];
extern void _ZN3ccc8CC11x5y93pqrEv();
extern void _ZN3ccc8CC11x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y93pqrEv,_ZThn4_N3ccc8CC11x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x5y93efgEv,_ZThn4_N3ccc8CC11x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y93pqrEv,_ZThn4_N3ccc8CC11x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x5y93efgEv,_ZThn4_N3ccc8CC11x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x5y9E[];
Class_Descriptor cd__ZN3ccc8CC11x5y9E = {  "_ZN3ccc8CC11x5y9E", // class name
  bases__ZN3ccc8CC11x5y9E, 2,
  &(vtc__ZN3ccc8CC11x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x5y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y10  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC11x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x5y103abcEv
  ~CC11x5y10(); // tgen
  CC11x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y10E) C1{ BC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x5y103pqrEv");}
void  ccc::CC11x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x5y103abcEv");}
ccc::CC11x5y10 ::~CC11x5y10(){ note_dtor("_ZN3ccc9CC11x5y10E", this);} // tgen
ccc::CC11x5y10 ::CC11x5y10(){ note_ctor("_ZN3ccc9CC11x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y10E, buf);
    ::ccc::CC11x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y10E);
    dp->::ccc::CC11x5y10::~CC11x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y10E(Test__ZN3ccc9CC11x5y10E, "_ZN3ccc9CC11x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y10C1Ev();
extern void _ZN3ccc9CC11x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y10E[] = {
  NSPAIR(_ZN3ccc9CC11x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y10E[];
extern void _ZN3ccc9CC11x5y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y103pqrEv,_ZThn4_N3ccc9CC11x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y103abcEv,_ZThn4_N3ccc9CC11x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y103pqrEv,_ZThn4_N3ccc9CC11x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y103abcEv,_ZThn4_N3ccc9CC11x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y10E[];
Class_Descriptor cd__ZN3ccc9CC11x5y10E = {  "_ZN3ccc9CC11x5y10E", // class name
  bases__ZN3ccc9CC11x5y10E, 2,
  &(vtc__ZN3ccc9CC11x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y11  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC11x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x5y113efgEv
  ~CC11x5y11(); // tgen
  CC11x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y11E) C1{ BC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x5y113pqrEv");}
void  ccc::CC11x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x5y113efgEv");}
ccc::CC11x5y11 ::~CC11x5y11(){ note_dtor("_ZN3ccc9CC11x5y11E", this);} // tgen
ccc::CC11x5y11 ::CC11x5y11(){ note_ctor("_ZN3ccc9CC11x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y11E, buf);
    ::ccc::CC11x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y11E);
    dp->::ccc::CC11x5y11::~CC11x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y11E(Test__ZN3ccc9CC11x5y11E, "_ZN3ccc9CC11x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y11C1Ev();
extern void _ZN3ccc9CC11x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y11E[] = {
  NSPAIR(_ZN3ccc9CC11x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y11E[];
extern void _ZN3ccc9CC11x5y113pqrEv();
extern void _ZN3ccc9CC11x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y113pqrEv,_ZThn4_N3ccc9CC11x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y113efgEv,_ZThn4_N3ccc9CC11x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y113pqrEv,_ZThn4_N3ccc9CC11x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y113efgEv,_ZThn4_N3ccc9CC11x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y11E[];
Class_Descriptor cd__ZN3ccc9CC11x5y11E = {  "_ZN3ccc9CC11x5y11E", // class name
  bases__ZN3ccc9CC11x5y11E, 2,
  &(vtc__ZN3ccc9CC11x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y12  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC11x5y123abcEv
  ~CC11x5y12(); // tgen
  CC11x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y12E) C1{ BC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC11x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x5y123abcEv");}
ccc::CC11x5y12 ::~CC11x5y12(){ note_dtor("_ZN3ccc9CC11x5y12E", this);} // tgen
ccc::CC11x5y12 ::CC11x5y12(){ note_ctor("_ZN3ccc9CC11x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y12E, buf);
    ::ccc::CC11x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y12E);
    dp->::ccc::CC11x5y12::~CC11x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y12E(Test__ZN3ccc9CC11x5y12E, "_ZN3ccc9CC11x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y12C1Ev();
extern void _ZN3ccc9CC11x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y12E[] = {
  NSPAIR(_ZN3ccc9CC11x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y123abcEv,_ZThn4_N3ccc9CC11x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y123abcEv,_ZThn4_N3ccc9CC11x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y12E[];
Class_Descriptor cd__ZN3ccc9CC11x5y12E = {  "_ZN3ccc9CC11x5y12E", // class name
  bases__ZN3ccc9CC11x5y12E, 2,
  &(vtc__ZN3ccc9CC11x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y12E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y13  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC11x5y133efgEv
  ~CC11x5y13(); // tgen
  CC11x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y13E) C1{ BC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x5y133efgEv");}
ccc::CC11x5y13 ::~CC11x5y13(){ note_dtor("_ZN3ccc9CC11x5y13E", this);} // tgen
ccc::CC11x5y13 ::CC11x5y13(){ note_ctor("_ZN3ccc9CC11x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y13E, buf);
    ::ccc::CC11x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y13E);
    dp->::ccc::CC11x5y13::~CC11x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y13E(Test__ZN3ccc9CC11x5y13E, "_ZN3ccc9CC11x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y13C1Ev();
extern void _ZN3ccc9CC11x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y13E[] = {
  NSPAIR(_ZN3ccc9CC11x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y133efgEv,_ZThn4_N3ccc9CC11x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y133efgEv,_ZThn4_N3ccc9CC11x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y13E[];
Class_Descriptor cd__ZN3ccc9CC11x5y13E = {  "_ZN3ccc9CC11x5y13E", // class name
  bases__ZN3ccc9CC11x5y13E, 2,
  &(vtc__ZN3ccc9CC11x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y14  : ::ccc::AA11 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC11x5y143pqrEv
  ~CC11x5y14(); // tgen
  CC11x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y14E) C1{ BC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x5y143pqrEv");}
ccc::CC11x5y14 ::~CC11x5y14(){ note_dtor("_ZN3ccc9CC11x5y14E", this);} // tgen
ccc::CC11x5y14 ::CC11x5y14(){ note_ctor("_ZN3ccc9CC11x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y14E, buf);
    ::ccc::CC11x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y14E);
    dp->::ccc::CC11x5y14::~CC11x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y14E(Test__ZN3ccc9CC11x5y14E, "_ZN3ccc9CC11x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y14C1Ev();
extern void _ZN3ccc9CC11x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y14E[] = {
  NSPAIR(_ZN3ccc9CC11x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y14E[];
extern void _ZN3ccc9CC11x5y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x5y143pqrEv,_ZThn4_N3ccc9CC11x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x5y143pqrEv,_ZThn4_N3ccc9CC11x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y14E[];
Class_Descriptor cd__ZN3ccc9CC11x5y14E = {  "_ZN3ccc9CC11x5y14E", // class name
  bases__ZN3ccc9CC11x5y14E, 2,
  &(vtc__ZN3ccc9CC11x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x5y15  : ::ccc::AA11 , ::ccc::BB5 {
  ~CC11x5y15(); // tgen
  CC11x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x5y15E) C1{ BC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC11x5y15 ::~CC11x5y15(){ note_dtor("_ZN3ccc9CC11x5y15E", this);} // tgen
ccc::CC11x5y15 ::CC11x5y15(){ note_ctor("_ZN3ccc9CC11x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x5y15E, buf);
    ::ccc::CC11x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x5y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC11x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x5y15E);
    dp->::ccc::CC11x5y15::~CC11x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x5y15E(Test__ZN3ccc9CC11x5y15E, "_ZN3ccc9CC11x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x5y15C1Ev();
extern void _ZN3ccc9CC11x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x5y15E[] = {
  NSPAIR(_ZN3ccc9CC11x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC11x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x5y15E[];
Class_Descriptor cd__ZN3ccc9CC11x5y15E = {  "_ZN3ccc9CC11x5y15E", // class name
  bases__ZN3ccc9CC11x5y15E, 2,
  &(vtc__ZN3ccc9CC11x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x5y15E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y0  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC11x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y03pqrEv
  ~CC11x6y0(); // tgen
  CC11x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y0E) C1{ BC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y03abcEv");}
void  ccc::CC11x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y03efgEv");}
void  ccc::CC11x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y03pqrEv");}
ccc::CC11x6y0 ::~CC11x6y0(){ note_dtor("_ZN3ccc8CC11x6y0E", this);} // tgen
ccc::CC11x6y0 ::CC11x6y0(){ note_ctor("_ZN3ccc8CC11x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y0E, buf);
    ::ccc::CC11x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y0E);
    dp->::ccc::CC11x6y0::~CC11x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y0E(Test__ZN3ccc8CC11x6y0E, "_ZN3ccc8CC11x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y0C1Ev();
extern void _ZN3ccc8CC11x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y0E[] = {
  NSPAIR(_ZN3ccc8CC11x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y0E[];
extern void _ZN3ccc8CC11x6y03pqrEv();
extern void _ZN3ccc8CC11x6y03efgEv();
extern void _ZN3ccc8CC11x6y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y03abcEv,_ZThn4_N3ccc8CC11x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y03efgEv,_ZThn4_N3ccc8CC11x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y03abcEv,_ZThn4_N3ccc8CC11x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y03efgEv,_ZThn4_N3ccc8CC11x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y0E[];
Class_Descriptor cd__ZN3ccc8CC11x6y0E = {  "_ZN3ccc8CC11x6y0E", // class name
  bases__ZN3ccc8CC11x6y0E, 2,
  &(vtc__ZN3ccc8CC11x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y1  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC11x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x6y13efgEv
  ~CC11x6y1(); // tgen
  CC11x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y1E) C1{ BC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y13abcEv");}
void  ccc::CC11x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y13pqrEv");}
void  ccc::CC11x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y13efgEv");}
ccc::CC11x6y1 ::~CC11x6y1(){ note_dtor("_ZN3ccc8CC11x6y1E", this);} // tgen
ccc::CC11x6y1 ::CC11x6y1(){ note_ctor("_ZN3ccc8CC11x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y1E, buf);
    ::ccc::CC11x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y1E);
    dp->::ccc::CC11x6y1::~CC11x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y1E(Test__ZN3ccc8CC11x6y1E, "_ZN3ccc8CC11x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y1C1Ev();
extern void _ZN3ccc8CC11x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y1E[] = {
  NSPAIR(_ZN3ccc8CC11x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y1E[];
extern void _ZN3ccc8CC11x6y13pqrEv();
extern void _ZN3ccc8CC11x6y13efgEv();
extern void _ZN3ccc8CC11x6y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y13abcEv,_ZThn4_N3ccc8CC11x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y13efgEv,_ZThn4_N3ccc8CC11x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y13abcEv,_ZThn4_N3ccc8CC11x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y13efgEv,_ZThn4_N3ccc8CC11x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y1E[];
Class_Descriptor cd__ZN3ccc8CC11x6y1E = {  "_ZN3ccc8CC11x6y1E", // class name
  bases__ZN3ccc8CC11x6y1E, 2,
  &(vtc__ZN3ccc8CC11x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y2  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC11x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y23pqrEv
  ~CC11x6y2(); // tgen
  CC11x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y2E) C1{ BC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y23efgEv");}
void  ccc::CC11x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y23abcEv");}
void  ccc::CC11x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y23pqrEv");}
ccc::CC11x6y2 ::~CC11x6y2(){ note_dtor("_ZN3ccc8CC11x6y2E", this);} // tgen
ccc::CC11x6y2 ::CC11x6y2(){ note_ctor("_ZN3ccc8CC11x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y2E, buf);
    ::ccc::CC11x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y2E);
    dp->::ccc::CC11x6y2::~CC11x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y2E(Test__ZN3ccc8CC11x6y2E, "_ZN3ccc8CC11x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y2C1Ev();
extern void _ZN3ccc8CC11x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y2E[] = {
  NSPAIR(_ZN3ccc8CC11x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y2E[];
extern void _ZN3ccc8CC11x6y23pqrEv();
extern void _ZN3ccc8CC11x6y23efgEv();
extern void _ZN3ccc8CC11x6y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y23abcEv,_ZThn4_N3ccc8CC11x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y23efgEv,_ZThn4_N3ccc8CC11x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y23abcEv,_ZThn4_N3ccc8CC11x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y23efgEv,_ZThn4_N3ccc8CC11x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y2E[];
Class_Descriptor cd__ZN3ccc8CC11x6y2E = {  "_ZN3ccc8CC11x6y2E", // class name
  bases__ZN3ccc8CC11x6y2E, 2,
  &(vtc__ZN3ccc8CC11x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y3  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC11x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x6y33abcEv
  ~CC11x6y3(); // tgen
  CC11x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y3E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y33efgEv");}
void  ccc::CC11x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y33pqrEv");}
void  ccc::CC11x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y33abcEv");}
ccc::CC11x6y3 ::~CC11x6y3(){ note_dtor("_ZN3ccc8CC11x6y3E", this);} // tgen
ccc::CC11x6y3 ::CC11x6y3(){ note_ctor("_ZN3ccc8CC11x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y3E, buf);
    ::ccc::CC11x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y3E);
    dp->::ccc::CC11x6y3::~CC11x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y3E(Test__ZN3ccc8CC11x6y3E, "_ZN3ccc8CC11x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y3C1Ev();
extern void _ZN3ccc8CC11x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y3E[] = {
  NSPAIR(_ZN3ccc8CC11x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y3E[];
extern void _ZN3ccc8CC11x6y33pqrEv();
extern void _ZN3ccc8CC11x6y33efgEv();
extern void _ZN3ccc8CC11x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y33abcEv,_ZThn4_N3ccc8CC11x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y33efgEv,_ZThn4_N3ccc8CC11x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y33abcEv,_ZThn4_N3ccc8CC11x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y33efgEv,_ZThn4_N3ccc8CC11x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y3E[];
Class_Descriptor cd__ZN3ccc8CC11x6y3E = {  "_ZN3ccc8CC11x6y3E", // class name
  bases__ZN3ccc8CC11x6y3E, 2,
  &(vtc__ZN3ccc8CC11x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y4  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC11x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x6y43efgEv
  ~CC11x6y4(); // tgen
  CC11x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y4E) C1{ BC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y43pqrEv");}
void  ccc::CC11x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y43abcEv");}
void  ccc::CC11x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y43efgEv");}
ccc::CC11x6y4 ::~CC11x6y4(){ note_dtor("_ZN3ccc8CC11x6y4E", this);} // tgen
ccc::CC11x6y4 ::CC11x6y4(){ note_ctor("_ZN3ccc8CC11x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y4E, buf);
    ::ccc::CC11x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y4E);
    dp->::ccc::CC11x6y4::~CC11x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y4E(Test__ZN3ccc8CC11x6y4E, "_ZN3ccc8CC11x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y4C1Ev();
extern void _ZN3ccc8CC11x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y4E[] = {
  NSPAIR(_ZN3ccc8CC11x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y4E[];
extern void _ZN3ccc8CC11x6y43pqrEv();
extern void _ZN3ccc8CC11x6y43efgEv();
extern void _ZN3ccc8CC11x6y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y43abcEv,_ZThn4_N3ccc8CC11x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y43efgEv,_ZThn4_N3ccc8CC11x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y43abcEv,_ZThn4_N3ccc8CC11x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y43efgEv,_ZThn4_N3ccc8CC11x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y4E[];
Class_Descriptor cd__ZN3ccc8CC11x6y4E = {  "_ZN3ccc8CC11x6y4E", // class name
  bases__ZN3ccc8CC11x6y4E, 2,
  &(vtc__ZN3ccc8CC11x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y5  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC11x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x6y53abcEv
  ~CC11x6y5(); // tgen
  CC11x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y5E) C1{ BC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y53pqrEv");}
void  ccc::CC11x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y53efgEv");}
void  ccc::CC11x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y53abcEv");}
ccc::CC11x6y5 ::~CC11x6y5(){ note_dtor("_ZN3ccc8CC11x6y5E", this);} // tgen
ccc::CC11x6y5 ::CC11x6y5(){ note_ctor("_ZN3ccc8CC11x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y5E, buf);
    ::ccc::CC11x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y5E);
    dp->::ccc::CC11x6y5::~CC11x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y5E(Test__ZN3ccc8CC11x6y5E, "_ZN3ccc8CC11x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y5C1Ev();
extern void _ZN3ccc8CC11x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y5E[] = {
  NSPAIR(_ZN3ccc8CC11x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y5E[];
extern void _ZN3ccc8CC11x6y53pqrEv();
extern void _ZN3ccc8CC11x6y53efgEv();
extern void _ZN3ccc8CC11x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y53abcEv,_ZThn4_N3ccc8CC11x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y53efgEv,_ZThn4_N3ccc8CC11x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y53abcEv,_ZThn4_N3ccc8CC11x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y53efgEv,_ZThn4_N3ccc8CC11x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y5E[];
Class_Descriptor cd__ZN3ccc8CC11x6y5E = {  "_ZN3ccc8CC11x6y5E", // class name
  bases__ZN3ccc8CC11x6y5E, 2,
  &(vtc__ZN3ccc8CC11x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y6  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC11x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x6y63efgEv
  ~CC11x6y6(); // tgen
  CC11x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y6E) C1{ BC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y63abcEv");}
void  ccc::CC11x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y63efgEv");}
ccc::CC11x6y6 ::~CC11x6y6(){ note_dtor("_ZN3ccc8CC11x6y6E", this);} // tgen
ccc::CC11x6y6 ::CC11x6y6(){ note_ctor("_ZN3ccc8CC11x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y6E, buf);
    ::ccc::CC11x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y6E);
    dp->::ccc::CC11x6y6::~CC11x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y6E(Test__ZN3ccc8CC11x6y6E, "_ZN3ccc8CC11x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y6C1Ev();
extern void _ZN3ccc8CC11x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y6E[] = {
  NSPAIR(_ZN3ccc8CC11x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x6y63efgEv();
extern void _ZN3ccc8CC11x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y63abcEv,_ZThn4_N3ccc8CC11x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y63efgEv,_ZThn4_N3ccc8CC11x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y63abcEv,_ZThn4_N3ccc8CC11x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y63efgEv,_ZThn4_N3ccc8CC11x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y6E[];
Class_Descriptor cd__ZN3ccc8CC11x6y6E = {  "_ZN3ccc8CC11x6y6E", // class name
  bases__ZN3ccc8CC11x6y6E, 2,
  &(vtc__ZN3ccc8CC11x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y7  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC11x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y73pqrEv
  ~CC11x6y7(); // tgen
  CC11x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y7E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y73abcEv");}
void  ccc::CC11x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y73pqrEv");}
ccc::CC11x6y7 ::~CC11x6y7(){ note_dtor("_ZN3ccc8CC11x6y7E", this);} // tgen
ccc::CC11x6y7 ::CC11x6y7(){ note_ctor("_ZN3ccc8CC11x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y7E, buf);
    ::ccc::CC11x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y7E);
    dp->::ccc::CC11x6y7::~CC11x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y7E(Test__ZN3ccc8CC11x6y7E, "_ZN3ccc8CC11x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y7C1Ev();
extern void _ZN3ccc8CC11x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y7E[] = {
  NSPAIR(_ZN3ccc8CC11x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y7E[];
extern void _ZN3ccc8CC11x6y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y73abcEv,_ZThn4_N3ccc8CC11x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y73abcEv,_ZThn4_N3ccc8CC11x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y7E[];
Class_Descriptor cd__ZN3ccc8CC11x6y7E = {  "_ZN3ccc8CC11x6y7E", // class name
  bases__ZN3ccc8CC11x6y7E, 2,
  &(vtc__ZN3ccc8CC11x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y8  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC11x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x6y83abcEv
  ~CC11x6y8(); // tgen
  CC11x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y8E) C1{ BC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y83efgEv");}
void  ccc::CC11x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x6y83abcEv");}
ccc::CC11x6y8 ::~CC11x6y8(){ note_dtor("_ZN3ccc8CC11x6y8E", this);} // tgen
ccc::CC11x6y8 ::CC11x6y8(){ note_ctor("_ZN3ccc8CC11x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y8E, buf);
    ::ccc::CC11x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y8E);
    dp->::ccc::CC11x6y8::~CC11x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y8E(Test__ZN3ccc8CC11x6y8E, "_ZN3ccc8CC11x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y8C1Ev();
extern void _ZN3ccc8CC11x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y8E[] = {
  NSPAIR(_ZN3ccc8CC11x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x6y83efgEv();
extern void _ZN3ccc8CC11x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y83abcEv,_ZThn4_N3ccc8CC11x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y83efgEv,_ZThn4_N3ccc8CC11x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y83abcEv,_ZThn4_N3ccc8CC11x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y83efgEv,_ZThn4_N3ccc8CC11x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y8E[];
Class_Descriptor cd__ZN3ccc8CC11x6y8E = {  "_ZN3ccc8CC11x6y8E", // class name
  bases__ZN3ccc8CC11x6y8E, 2,
  &(vtc__ZN3ccc8CC11x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y9  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC11x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x6y93pqrEv
  ~CC11x6y9(); // tgen
  CC11x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x6y9E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x6y93efgEv");}
void  ccc::CC11x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x6y93pqrEv");}
ccc::CC11x6y9 ::~CC11x6y9(){ note_dtor("_ZN3ccc8CC11x6y9E", this);} // tgen
ccc::CC11x6y9 ::CC11x6y9(){ note_ctor("_ZN3ccc8CC11x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x6y9E, buf);
    ::ccc::CC11x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x6y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC11x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x6y9E);
    dp->::ccc::CC11x6y9::~CC11x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x6y9E(Test__ZN3ccc8CC11x6y9E, "_ZN3ccc8CC11x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x6y9C1Ev();
extern void _ZN3ccc8CC11x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x6y9E[] = {
  NSPAIR(_ZN3ccc8CC11x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC11x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y9E[];
extern void _ZN3ccc8CC11x6y93pqrEv();
extern void _ZN3ccc8CC11x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x6y93efgEv,_ZThn4_N3ccc8CC11x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x6y93efgEv,_ZThn4_N3ccc8CC11x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x6y9E[];
Class_Descriptor cd__ZN3ccc8CC11x6y9E = {  "_ZN3ccc8CC11x6y9E", // class name
  bases__ZN3ccc8CC11x6y9E, 2,
  &(vtc__ZN3ccc8CC11x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x6y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y10  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC11x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x6y103abcEv
  ~CC11x6y10(); // tgen
  CC11x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y10E) C1{ BC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x6y103pqrEv");}
void  ccc::CC11x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x6y103abcEv");}
ccc::CC11x6y10 ::~CC11x6y10(){ note_dtor("_ZN3ccc9CC11x6y10E", this);} // tgen
ccc::CC11x6y10 ::CC11x6y10(){ note_ctor("_ZN3ccc9CC11x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y10E, buf);
    ::ccc::CC11x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y10E);
    dp->::ccc::CC11x6y10::~CC11x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y10E(Test__ZN3ccc9CC11x6y10E, "_ZN3ccc9CC11x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y10C1Ev();
extern void _ZN3ccc9CC11x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y10E[] = {
  NSPAIR(_ZN3ccc9CC11x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y10E[];
extern void _ZN3ccc9CC11x6y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x6y103abcEv,_ZThn4_N3ccc9CC11x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x6y103abcEv,_ZThn4_N3ccc9CC11x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y10E[];
Class_Descriptor cd__ZN3ccc9CC11x6y10E = {  "_ZN3ccc9CC11x6y10E", // class name
  bases__ZN3ccc9CC11x6y10E, 2,
  &(vtc__ZN3ccc9CC11x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y11  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC11x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x6y113efgEv
  ~CC11x6y11(); // tgen
  CC11x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y11E) C1{ BC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x6y113pqrEv");}
void  ccc::CC11x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x6y113efgEv");}
ccc::CC11x6y11 ::~CC11x6y11(){ note_dtor("_ZN3ccc9CC11x6y11E", this);} // tgen
ccc::CC11x6y11 ::CC11x6y11(){ note_ctor("_ZN3ccc9CC11x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y11E, buf);
    ::ccc::CC11x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y11E);
    dp->::ccc::CC11x6y11::~CC11x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y11E(Test__ZN3ccc9CC11x6y11E, "_ZN3ccc9CC11x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y11C1Ev();
extern void _ZN3ccc9CC11x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y11E[] = {
  NSPAIR(_ZN3ccc9CC11x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y11E[];
extern void _ZN3ccc9CC11x6y113pqrEv();
extern void _ZN3ccc9CC11x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x6y113efgEv,_ZThn4_N3ccc9CC11x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x6y113efgEv,_ZThn4_N3ccc9CC11x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y11E[];
Class_Descriptor cd__ZN3ccc9CC11x6y11E = {  "_ZN3ccc9CC11x6y11E", // class name
  bases__ZN3ccc9CC11x6y11E, 2,
  &(vtc__ZN3ccc9CC11x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y12  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC11x6y123abcEv
  ~CC11x6y12(); // tgen
  CC11x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y12E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x6y123abcEv");}
ccc::CC11x6y12 ::~CC11x6y12(){ note_dtor("_ZN3ccc9CC11x6y12E", this);} // tgen
ccc::CC11x6y12 ::CC11x6y12(){ note_ctor("_ZN3ccc9CC11x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y12E, buf);
    ::ccc::CC11x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y12E);
    dp->::ccc::CC11x6y12::~CC11x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y12E(Test__ZN3ccc9CC11x6y12E, "_ZN3ccc9CC11x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y12C1Ev();
extern void _ZN3ccc9CC11x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y12E[] = {
  NSPAIR(_ZN3ccc9CC11x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x6y123abcEv,_ZThn4_N3ccc9CC11x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x6y123abcEv,_ZThn4_N3ccc9CC11x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y12E[];
Class_Descriptor cd__ZN3ccc9CC11x6y12E = {  "_ZN3ccc9CC11x6y12E", // class name
  bases__ZN3ccc9CC11x6y12E, 2,
  &(vtc__ZN3ccc9CC11x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y13  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC11x6y133efgEv
  ~CC11x6y13(); // tgen
  CC11x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y13E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC11x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x6y133efgEv");}
ccc::CC11x6y13 ::~CC11x6y13(){ note_dtor("_ZN3ccc9CC11x6y13E", this);} // tgen
ccc::CC11x6y13 ::CC11x6y13(){ note_ctor("_ZN3ccc9CC11x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y13E, buf);
    ::ccc::CC11x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y13E);
    dp->::ccc::CC11x6y13::~CC11x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y13E(Test__ZN3ccc9CC11x6y13E, "_ZN3ccc9CC11x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y13C1Ev();
extern void _ZN3ccc9CC11x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y13E[] = {
  NSPAIR(_ZN3ccc9CC11x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x6y133efgEv,_ZThn4_N3ccc9CC11x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x6y133efgEv,_ZThn4_N3ccc9CC11x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y13E[];
Class_Descriptor cd__ZN3ccc9CC11x6y13E = {  "_ZN3ccc9CC11x6y13E", // class name
  bases__ZN3ccc9CC11x6y13E, 2,
  &(vtc__ZN3ccc9CC11x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y14  : ::ccc::AA11 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC11x6y143pqrEv
  ~CC11x6y14(); // tgen
  CC11x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y14E) C1{ BC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x6y143pqrEv");}
ccc::CC11x6y14 ::~CC11x6y14(){ note_dtor("_ZN3ccc9CC11x6y14E", this);} // tgen
ccc::CC11x6y14 ::CC11x6y14(){ note_ctor("_ZN3ccc9CC11x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y14E, buf);
    ::ccc::CC11x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y14E);
    dp->::ccc::CC11x6y14::~CC11x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y14E(Test__ZN3ccc9CC11x6y14E, "_ZN3ccc9CC11x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y14C1Ev();
extern void _ZN3ccc9CC11x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y14E[] = {
  NSPAIR(_ZN3ccc9CC11x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y14E[];
extern void _ZN3ccc9CC11x6y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y14E[];
Class_Descriptor cd__ZN3ccc9CC11x6y14E = {  "_ZN3ccc9CC11x6y14E", // class name
  bases__ZN3ccc9CC11x6y14E, 2,
  &(vtc__ZN3ccc9CC11x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x6y15  : ::ccc::AA11 , ::ccc::BB6 {
  ~CC11x6y15(); // tgen
  CC11x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x6y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x6y15 ::~CC11x6y15(){ note_dtor("_ZN3ccc9CC11x6y15E", this);} // tgen
ccc::CC11x6y15 ::CC11x6y15(){ note_ctor("_ZN3ccc9CC11x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x6y15E, buf);
    ::ccc::CC11x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x6y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC11x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x6y15E);
    dp->::ccc::CC11x6y15::~CC11x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x6y15E(Test__ZN3ccc9CC11x6y15E, "_ZN3ccc9CC11x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x6y15C1Ev();
extern void _ZN3ccc9CC11x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x6y15E[] = {
  NSPAIR(_ZN3ccc9CC11x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC11x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x6y15E[];
Class_Descriptor cd__ZN3ccc9CC11x6y15E = {  "_ZN3ccc9CC11x6y15E", // class name
  bases__ZN3ccc9CC11x6y15E, 2,
  &(vtc__ZN3ccc9CC11x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x6y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y0  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC11x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y03pqrEv
  ~CC11x7y0(); // tgen
  CC11x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y0E) C1{ BC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y03abcEv");}
void  ccc::CC11x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y03efgEv");}
void  ccc::CC11x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y03pqrEv");}
ccc::CC11x7y0 ::~CC11x7y0(){ note_dtor("_ZN3ccc8CC11x7y0E", this);} // tgen
ccc::CC11x7y0 ::CC11x7y0(){ note_ctor("_ZN3ccc8CC11x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y0E, buf);
    ::ccc::CC11x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y0E);
    dp->::ccc::CC11x7y0::~CC11x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y0E(Test__ZN3ccc8CC11x7y0E, "_ZN3ccc8CC11x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y0C1Ev();
extern void _ZN3ccc8CC11x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y0E[] = {
  NSPAIR(_ZN3ccc8CC11x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y0E[];
extern void _ZN3ccc8CC11x7y03pqrEv();
extern void _ZN3ccc8CC11x7y03efgEv();
extern void _ZN3ccc8CC11x7y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y03abcEv,_ZThn4_N3ccc8CC11x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y03pqrEv,_ZThn4_N3ccc8CC11x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y03abcEv,_ZThn4_N3ccc8CC11x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y03pqrEv,_ZThn4_N3ccc8CC11x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y0E[];
Class_Descriptor cd__ZN3ccc8CC11x7y0E = {  "_ZN3ccc8CC11x7y0E", // class name
  bases__ZN3ccc8CC11x7y0E, 2,
  &(vtc__ZN3ccc8CC11x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y1  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC11x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x7y13efgEv
  ~CC11x7y1(); // tgen
  CC11x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y1E) C1{ BC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y13abcEv");}
void  ccc::CC11x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y13pqrEv");}
void  ccc::CC11x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y13efgEv");}
ccc::CC11x7y1 ::~CC11x7y1(){ note_dtor("_ZN3ccc8CC11x7y1E", this);} // tgen
ccc::CC11x7y1 ::CC11x7y1(){ note_ctor("_ZN3ccc8CC11x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y1E, buf);
    ::ccc::CC11x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y1E);
    dp->::ccc::CC11x7y1::~CC11x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y1E(Test__ZN3ccc8CC11x7y1E, "_ZN3ccc8CC11x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y1C1Ev();
extern void _ZN3ccc8CC11x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y1E[] = {
  NSPAIR(_ZN3ccc8CC11x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y1E[];
extern void _ZN3ccc8CC11x7y13pqrEv();
extern void _ZN3ccc8CC11x7y13efgEv();
extern void _ZN3ccc8CC11x7y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y13abcEv,_ZThn4_N3ccc8CC11x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y13pqrEv,_ZThn4_N3ccc8CC11x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y13abcEv,_ZThn4_N3ccc8CC11x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y13pqrEv,_ZThn4_N3ccc8CC11x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y1E[];
Class_Descriptor cd__ZN3ccc8CC11x7y1E = {  "_ZN3ccc8CC11x7y1E", // class name
  bases__ZN3ccc8CC11x7y1E, 2,
  &(vtc__ZN3ccc8CC11x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y2  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC11x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y23pqrEv
  ~CC11x7y2(); // tgen
  CC11x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y2E) C1{ BC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y23efgEv");}
void  ccc::CC11x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y23abcEv");}
void  ccc::CC11x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y23pqrEv");}
ccc::CC11x7y2 ::~CC11x7y2(){ note_dtor("_ZN3ccc8CC11x7y2E", this);} // tgen
ccc::CC11x7y2 ::CC11x7y2(){ note_ctor("_ZN3ccc8CC11x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y2E, buf);
    ::ccc::CC11x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y2E);
    dp->::ccc::CC11x7y2::~CC11x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y2E(Test__ZN3ccc8CC11x7y2E, "_ZN3ccc8CC11x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y2C1Ev();
extern void _ZN3ccc8CC11x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y2E[] = {
  NSPAIR(_ZN3ccc8CC11x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y2E[];
extern void _ZN3ccc8CC11x7y23pqrEv();
extern void _ZN3ccc8CC11x7y23efgEv();
extern void _ZN3ccc8CC11x7y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y23abcEv,_ZThn4_N3ccc8CC11x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y23pqrEv,_ZThn4_N3ccc8CC11x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y23abcEv,_ZThn4_N3ccc8CC11x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y23pqrEv,_ZThn4_N3ccc8CC11x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y2E[];
Class_Descriptor cd__ZN3ccc8CC11x7y2E = {  "_ZN3ccc8CC11x7y2E", // class name
  bases__ZN3ccc8CC11x7y2E, 2,
  &(vtc__ZN3ccc8CC11x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y3  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC11x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x7y33abcEv
  ~CC11x7y3(); // tgen
  CC11x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y3E) C1{ BC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y33efgEv");}
void  ccc::CC11x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y33pqrEv");}
void  ccc::CC11x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y33abcEv");}
ccc::CC11x7y3 ::~CC11x7y3(){ note_dtor("_ZN3ccc8CC11x7y3E", this);} // tgen
ccc::CC11x7y3 ::CC11x7y3(){ note_ctor("_ZN3ccc8CC11x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y3E, buf);
    ::ccc::CC11x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y3E);
    dp->::ccc::CC11x7y3::~CC11x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y3E(Test__ZN3ccc8CC11x7y3E, "_ZN3ccc8CC11x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y3C1Ev();
extern void _ZN3ccc8CC11x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y3E[] = {
  NSPAIR(_ZN3ccc8CC11x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y3E[];
extern void _ZN3ccc8CC11x7y33pqrEv();
extern void _ZN3ccc8CC11x7y33efgEv();
extern void _ZN3ccc8CC11x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y33abcEv,_ZThn4_N3ccc8CC11x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y33pqrEv,_ZThn4_N3ccc8CC11x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y33abcEv,_ZThn4_N3ccc8CC11x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y33pqrEv,_ZThn4_N3ccc8CC11x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y3E[];
Class_Descriptor cd__ZN3ccc8CC11x7y3E = {  "_ZN3ccc8CC11x7y3E", // class name
  bases__ZN3ccc8CC11x7y3E, 2,
  &(vtc__ZN3ccc8CC11x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y4  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC11x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x7y43efgEv
  ~CC11x7y4(); // tgen
  CC11x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y4E) C1{ BC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y43pqrEv");}
void  ccc::CC11x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y43abcEv");}
void  ccc::CC11x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y43efgEv");}
ccc::CC11x7y4 ::~CC11x7y4(){ note_dtor("_ZN3ccc8CC11x7y4E", this);} // tgen
ccc::CC11x7y4 ::CC11x7y4(){ note_ctor("_ZN3ccc8CC11x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y4E, buf);
    ::ccc::CC11x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y4E);
    dp->::ccc::CC11x7y4::~CC11x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y4E(Test__ZN3ccc8CC11x7y4E, "_ZN3ccc8CC11x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y4C1Ev();
extern void _ZN3ccc8CC11x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y4E[] = {
  NSPAIR(_ZN3ccc8CC11x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y4E[];
extern void _ZN3ccc8CC11x7y43pqrEv();
extern void _ZN3ccc8CC11x7y43efgEv();
extern void _ZN3ccc8CC11x7y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y43abcEv,_ZThn4_N3ccc8CC11x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y43pqrEv,_ZThn4_N3ccc8CC11x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y43abcEv,_ZThn4_N3ccc8CC11x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y43pqrEv,_ZThn4_N3ccc8CC11x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y4E[];
Class_Descriptor cd__ZN3ccc8CC11x7y4E = {  "_ZN3ccc8CC11x7y4E", // class name
  bases__ZN3ccc8CC11x7y4E, 2,
  &(vtc__ZN3ccc8CC11x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y5  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC11x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x7y53abcEv
  ~CC11x7y5(); // tgen
  CC11x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y5E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y53pqrEv");}
void  ccc::CC11x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y53efgEv");}
void  ccc::CC11x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y53abcEv");}
ccc::CC11x7y5 ::~CC11x7y5(){ note_dtor("_ZN3ccc8CC11x7y5E", this);} // tgen
ccc::CC11x7y5 ::CC11x7y5(){ note_ctor("_ZN3ccc8CC11x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y5E, buf);
    ::ccc::CC11x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y5E);
    dp->::ccc::CC11x7y5::~CC11x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y5E(Test__ZN3ccc8CC11x7y5E, "_ZN3ccc8CC11x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y5C1Ev();
extern void _ZN3ccc8CC11x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y5E[] = {
  NSPAIR(_ZN3ccc8CC11x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y5E[];
extern void _ZN3ccc8CC11x7y53pqrEv();
extern void _ZN3ccc8CC11x7y53efgEv();
extern void _ZN3ccc8CC11x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y53abcEv,_ZThn4_N3ccc8CC11x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y53pqrEv,_ZThn4_N3ccc8CC11x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y53abcEv,_ZThn4_N3ccc8CC11x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y53pqrEv,_ZThn4_N3ccc8CC11x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y5E[];
Class_Descriptor cd__ZN3ccc8CC11x7y5E = {  "_ZN3ccc8CC11x7y5E", // class name
  bases__ZN3ccc8CC11x7y5E, 2,
  &(vtc__ZN3ccc8CC11x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y6  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC11x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x7y63efgEv
  ~CC11x7y6(); // tgen
  CC11x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y6E) C1{ BC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y63abcEv");}
void  ccc::CC11x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y63efgEv");}
ccc::CC11x7y6 ::~CC11x7y6(){ note_dtor("_ZN3ccc8CC11x7y6E", this);} // tgen
ccc::CC11x7y6 ::CC11x7y6(){ note_ctor("_ZN3ccc8CC11x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y6E, buf);
    ::ccc::CC11x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y6E);
    dp->::ccc::CC11x7y6::~CC11x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y6E(Test__ZN3ccc8CC11x7y6E, "_ZN3ccc8CC11x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y6C1Ev();
extern void _ZN3ccc8CC11x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y6E[] = {
  NSPAIR(_ZN3ccc8CC11x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x7y63efgEv();
extern void _ZN3ccc8CC11x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y63abcEv,_ZThn4_N3ccc8CC11x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y63abcEv,_ZThn4_N3ccc8CC11x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y6E[];
Class_Descriptor cd__ZN3ccc8CC11x7y6E = {  "_ZN3ccc8CC11x7y6E", // class name
  bases__ZN3ccc8CC11x7y6E, 2,
  &(vtc__ZN3ccc8CC11x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y7  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC11x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y73pqrEv
  ~CC11x7y7(); // tgen
  CC11x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y7E) C1{ BC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y73abcEv");}
void  ccc::CC11x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y73pqrEv");}
ccc::CC11x7y7 ::~CC11x7y7(){ note_dtor("_ZN3ccc8CC11x7y7E", this);} // tgen
ccc::CC11x7y7 ::CC11x7y7(){ note_ctor("_ZN3ccc8CC11x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y7E, buf);
    ::ccc::CC11x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y7E);
    dp->::ccc::CC11x7y7::~CC11x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y7E(Test__ZN3ccc8CC11x7y7E, "_ZN3ccc8CC11x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y7C1Ev();
extern void _ZN3ccc8CC11x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y7E[] = {
  NSPAIR(_ZN3ccc8CC11x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y7E[];
extern void _ZN3ccc8CC11x7y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y73abcEv,_ZThn4_N3ccc8CC11x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y73pqrEv,_ZThn4_N3ccc8CC11x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y73abcEv,_ZThn4_N3ccc8CC11x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y73pqrEv,_ZThn4_N3ccc8CC11x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y7E[];
Class_Descriptor cd__ZN3ccc8CC11x7y7E = {  "_ZN3ccc8CC11x7y7E", // class name
  bases__ZN3ccc8CC11x7y7E, 2,
  &(vtc__ZN3ccc8CC11x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y8  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC11x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x7y83abcEv
  ~CC11x7y8(); // tgen
  CC11x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y8E) C1{ BC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y83efgEv");}
void  ccc::CC11x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x7y83abcEv");}
ccc::CC11x7y8 ::~CC11x7y8(){ note_dtor("_ZN3ccc8CC11x7y8E", this);} // tgen
ccc::CC11x7y8 ::CC11x7y8(){ note_ctor("_ZN3ccc8CC11x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y8E, buf);
    ::ccc::CC11x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y8E);
    dp->::ccc::CC11x7y8::~CC11x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y8E(Test__ZN3ccc8CC11x7y8E, "_ZN3ccc8CC11x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y8C1Ev();
extern void _ZN3ccc8CC11x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y8E[] = {
  NSPAIR(_ZN3ccc8CC11x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x7y83efgEv();
extern void _ZN3ccc8CC11x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y83abcEv,_ZThn4_N3ccc8CC11x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y83abcEv,_ZThn4_N3ccc8CC11x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y8E[];
Class_Descriptor cd__ZN3ccc8CC11x7y8E = {  "_ZN3ccc8CC11x7y8E", // class name
  bases__ZN3ccc8CC11x7y8E, 2,
  &(vtc__ZN3ccc8CC11x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y9  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC11x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x7y93pqrEv
  ~CC11x7y9(); // tgen
  CC11x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x7y9E) C1{ BC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x7y93efgEv");}
void  ccc::CC11x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x7y93pqrEv");}
ccc::CC11x7y9 ::~CC11x7y9(){ note_dtor("_ZN3ccc8CC11x7y9E", this);} // tgen
ccc::CC11x7y9 ::CC11x7y9(){ note_ctor("_ZN3ccc8CC11x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x7y9E, buf);
    ::ccc::CC11x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x7y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC11x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x7y9E);
    dp->::ccc::CC11x7y9::~CC11x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x7y9E(Test__ZN3ccc8CC11x7y9E, "_ZN3ccc8CC11x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x7y9C1Ev();
extern void _ZN3ccc8CC11x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x7y9E[] = {
  NSPAIR(_ZN3ccc8CC11x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC11x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y9E[];
extern void _ZN3ccc8CC11x7y93pqrEv();
extern void _ZN3ccc8CC11x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x7y93pqrEv,_ZThn4_N3ccc8CC11x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x7y93pqrEv,_ZThn4_N3ccc8CC11x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x7y9E[];
Class_Descriptor cd__ZN3ccc8CC11x7y9E = {  "_ZN3ccc8CC11x7y9E", // class name
  bases__ZN3ccc8CC11x7y9E, 2,
  &(vtc__ZN3ccc8CC11x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x7y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y10  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC11x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x7y103abcEv
  ~CC11x7y10(); // tgen
  CC11x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y10E) C1{ BC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x7y103pqrEv");}
void  ccc::CC11x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x7y103abcEv");}
ccc::CC11x7y10 ::~CC11x7y10(){ note_dtor("_ZN3ccc9CC11x7y10E", this);} // tgen
ccc::CC11x7y10 ::CC11x7y10(){ note_ctor("_ZN3ccc9CC11x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y10E, buf);
    ::ccc::CC11x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y10E);
    dp->::ccc::CC11x7y10::~CC11x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y10E(Test__ZN3ccc9CC11x7y10E, "_ZN3ccc9CC11x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y10C1Ev();
extern void _ZN3ccc9CC11x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y10E[] = {
  NSPAIR(_ZN3ccc9CC11x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y10E[];
extern void _ZN3ccc9CC11x7y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x7y103abcEv,_ZThn4_N3ccc9CC11x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x7y103pqrEv,_ZThn4_N3ccc9CC11x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x7y103abcEv,_ZThn4_N3ccc9CC11x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x7y103pqrEv,_ZThn4_N3ccc9CC11x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y10E[];
Class_Descriptor cd__ZN3ccc9CC11x7y10E = {  "_ZN3ccc9CC11x7y10E", // class name
  bases__ZN3ccc9CC11x7y10E, 2,
  &(vtc__ZN3ccc9CC11x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y11  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC11x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x7y113efgEv
  ~CC11x7y11(); // tgen
  CC11x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y11E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x7y113pqrEv");}
void  ccc::CC11x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x7y113efgEv");}
ccc::CC11x7y11 ::~CC11x7y11(){ note_dtor("_ZN3ccc9CC11x7y11E", this);} // tgen
ccc::CC11x7y11 ::CC11x7y11(){ note_ctor("_ZN3ccc9CC11x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y11E, buf);
    ::ccc::CC11x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y11E);
    dp->::ccc::CC11x7y11::~CC11x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y11E(Test__ZN3ccc9CC11x7y11E, "_ZN3ccc9CC11x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y11C1Ev();
extern void _ZN3ccc9CC11x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y11E[] = {
  NSPAIR(_ZN3ccc9CC11x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y11E[];
extern void _ZN3ccc9CC11x7y113pqrEv();
extern void _ZN3ccc9CC11x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x7y113pqrEv,_ZThn4_N3ccc9CC11x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x7y113pqrEv,_ZThn4_N3ccc9CC11x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y11E[];
Class_Descriptor cd__ZN3ccc9CC11x7y11E = {  "_ZN3ccc9CC11x7y11E", // class name
  bases__ZN3ccc9CC11x7y11E, 2,
  &(vtc__ZN3ccc9CC11x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y12  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC11x7y123abcEv
  ~CC11x7y12(); // tgen
  CC11x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y12E) C1{ BC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC11x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x7y123abcEv");}
ccc::CC11x7y12 ::~CC11x7y12(){ note_dtor("_ZN3ccc9CC11x7y12E", this);} // tgen
ccc::CC11x7y12 ::CC11x7y12(){ note_ctor("_ZN3ccc9CC11x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y12E, buf);
    ::ccc::CC11x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y12E);
    dp->::ccc::CC11x7y12::~CC11x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y12E(Test__ZN3ccc9CC11x7y12E, "_ZN3ccc9CC11x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y12C1Ev();
extern void _ZN3ccc9CC11x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y12E[] = {
  NSPAIR(_ZN3ccc9CC11x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x7y123abcEv,_ZThn4_N3ccc9CC11x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x7y123abcEv,_ZThn4_N3ccc9CC11x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y12E[];
Class_Descriptor cd__ZN3ccc9CC11x7y12E = {  "_ZN3ccc9CC11x7y12E", // class name
  bases__ZN3ccc9CC11x7y12E, 2,
  &(vtc__ZN3ccc9CC11x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y13  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC11x7y133efgEv
  ~CC11x7y13(); // tgen
  CC11x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y13E) C1{ BC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x7y133efgEv");}
ccc::CC11x7y13 ::~CC11x7y13(){ note_dtor("_ZN3ccc9CC11x7y13E", this);} // tgen
ccc::CC11x7y13 ::CC11x7y13(){ note_ctor("_ZN3ccc9CC11x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y13E, buf);
    ::ccc::CC11x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y13E);
    dp->::ccc::CC11x7y13::~CC11x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y13E(Test__ZN3ccc9CC11x7y13E, "_ZN3ccc9CC11x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y13C1Ev();
extern void _ZN3ccc9CC11x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y13E[] = {
  NSPAIR(_ZN3ccc9CC11x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y13E[];
Class_Descriptor cd__ZN3ccc9CC11x7y13E = {  "_ZN3ccc9CC11x7y13E", // class name
  bases__ZN3ccc9CC11x7y13E, 2,
  &(vtc__ZN3ccc9CC11x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y14  : ::ccc::AA11 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC11x7y143pqrEv
  ~CC11x7y14(); // tgen
  CC11x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y14E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC11x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x7y143pqrEv");}
ccc::CC11x7y14 ::~CC11x7y14(){ note_dtor("_ZN3ccc9CC11x7y14E", this);} // tgen
ccc::CC11x7y14 ::CC11x7y14(){ note_ctor("_ZN3ccc9CC11x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y14E, buf);
    ::ccc::CC11x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y14E);
    dp->::ccc::CC11x7y14::~CC11x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y14E(Test__ZN3ccc9CC11x7y14E, "_ZN3ccc9CC11x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y14C1Ev();
extern void _ZN3ccc9CC11x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y14E[] = {
  NSPAIR(_ZN3ccc9CC11x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y14E[];
extern void _ZN3ccc9CC11x7y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x7y143pqrEv,_ZThn4_N3ccc9CC11x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x7y143pqrEv,_ZThn4_N3ccc9CC11x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y14E[];
Class_Descriptor cd__ZN3ccc9CC11x7y14E = {  "_ZN3ccc9CC11x7y14E", // class name
  bases__ZN3ccc9CC11x7y14E, 2,
  &(vtc__ZN3ccc9CC11x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x7y15  : ::ccc::AA11 , ::ccc::BB7 {
  ~CC11x7y15(); // tgen
  CC11x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x7y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x7y15 ::~CC11x7y15(){ note_dtor("_ZN3ccc9CC11x7y15E", this);} // tgen
ccc::CC11x7y15 ::CC11x7y15(){ note_ctor("_ZN3ccc9CC11x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x7y15E, buf);
    ::ccc::CC11x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x7y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC11x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x7y15E);
    dp->::ccc::CC11x7y15::~CC11x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x7y15E(Test__ZN3ccc9CC11x7y15E, "_ZN3ccc9CC11x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x7y15C1Ev();
extern void _ZN3ccc9CC11x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x7y15E[] = {
  NSPAIR(_ZN3ccc9CC11x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC11x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x7y15E[];
Class_Descriptor cd__ZN3ccc9CC11x7y15E = {  "_ZN3ccc9CC11x7y15E", // class name
  bases__ZN3ccc9CC11x7y15E, 2,
  &(vtc__ZN3ccc9CC11x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x7y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y0  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC11x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y03pqrEv
  ~CC11x8y0(); // tgen
  CC11x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y0E) C1{ BC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y03abcEv");}
void  ccc::CC11x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y03efgEv");}
void  ccc::CC11x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y03pqrEv");}
ccc::CC11x8y0 ::~CC11x8y0(){ note_dtor("_ZN3ccc8CC11x8y0E", this);} // tgen
ccc::CC11x8y0 ::CC11x8y0(){ note_ctor("_ZN3ccc8CC11x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y0E, buf);
    ::ccc::CC11x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y0E);
    dp->::ccc::CC11x8y0::~CC11x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y0E(Test__ZN3ccc8CC11x8y0E, "_ZN3ccc8CC11x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y0C1Ev();
extern void _ZN3ccc8CC11x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y0E[] = {
  NSPAIR(_ZN3ccc8CC11x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y0E[];
extern void _ZN3ccc8CC11x8y03pqrEv();
extern void _ZN3ccc8CC11x8y03efgEv();
extern void _ZN3ccc8CC11x8y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y03efgEv,_ZThn4_N3ccc8CC11x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y03abcEv,_ZThn4_N3ccc8CC11x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y03efgEv,_ZThn4_N3ccc8CC11x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y03abcEv,_ZThn4_N3ccc8CC11x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y0E[];
Class_Descriptor cd__ZN3ccc8CC11x8y0E = {  "_ZN3ccc8CC11x8y0E", // class name
  bases__ZN3ccc8CC11x8y0E, 2,
  &(vtc__ZN3ccc8CC11x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y1  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC11x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x8y13efgEv
  ~CC11x8y1(); // tgen
  CC11x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y1E) C1{ BC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y13abcEv");}
void  ccc::CC11x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y13pqrEv");}
void  ccc::CC11x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y13efgEv");}
ccc::CC11x8y1 ::~CC11x8y1(){ note_dtor("_ZN3ccc8CC11x8y1E", this);} // tgen
ccc::CC11x8y1 ::CC11x8y1(){ note_ctor("_ZN3ccc8CC11x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y1E, buf);
    ::ccc::CC11x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y1E);
    dp->::ccc::CC11x8y1::~CC11x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y1E(Test__ZN3ccc8CC11x8y1E, "_ZN3ccc8CC11x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y1C1Ev();
extern void _ZN3ccc8CC11x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y1E[] = {
  NSPAIR(_ZN3ccc8CC11x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y1E[];
extern void _ZN3ccc8CC11x8y13pqrEv();
extern void _ZN3ccc8CC11x8y13efgEv();
extern void _ZN3ccc8CC11x8y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y13efgEv,_ZThn4_N3ccc8CC11x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y13abcEv,_ZThn4_N3ccc8CC11x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y13efgEv,_ZThn4_N3ccc8CC11x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y13abcEv,_ZThn4_N3ccc8CC11x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y1E[];
Class_Descriptor cd__ZN3ccc8CC11x8y1E = {  "_ZN3ccc8CC11x8y1E", // class name
  bases__ZN3ccc8CC11x8y1E, 2,
  &(vtc__ZN3ccc8CC11x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y2  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC11x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y23pqrEv
  ~CC11x8y2(); // tgen
  CC11x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y2E) C1{ BC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y23efgEv");}
void  ccc::CC11x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y23abcEv");}
void  ccc::CC11x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y23pqrEv");}
ccc::CC11x8y2 ::~CC11x8y2(){ note_dtor("_ZN3ccc8CC11x8y2E", this);} // tgen
ccc::CC11x8y2 ::CC11x8y2(){ note_ctor("_ZN3ccc8CC11x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y2E, buf);
    ::ccc::CC11x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y2E);
    dp->::ccc::CC11x8y2::~CC11x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y2E(Test__ZN3ccc8CC11x8y2E, "_ZN3ccc8CC11x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y2C1Ev();
extern void _ZN3ccc8CC11x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y2E[] = {
  NSPAIR(_ZN3ccc8CC11x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y2E[];
extern void _ZN3ccc8CC11x8y23pqrEv();
extern void _ZN3ccc8CC11x8y23efgEv();
extern void _ZN3ccc8CC11x8y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y23efgEv,_ZThn4_N3ccc8CC11x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y23abcEv,_ZThn4_N3ccc8CC11x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y23efgEv,_ZThn4_N3ccc8CC11x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y23abcEv,_ZThn4_N3ccc8CC11x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y2E[];
Class_Descriptor cd__ZN3ccc8CC11x8y2E = {  "_ZN3ccc8CC11x8y2E", // class name
  bases__ZN3ccc8CC11x8y2E, 2,
  &(vtc__ZN3ccc8CC11x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y3  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC11x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x8y33abcEv
  ~CC11x8y3(); // tgen
  CC11x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y3E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y33efgEv");}
void  ccc::CC11x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y33pqrEv");}
void  ccc::CC11x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y33abcEv");}
ccc::CC11x8y3 ::~CC11x8y3(){ note_dtor("_ZN3ccc8CC11x8y3E", this);} // tgen
ccc::CC11x8y3 ::CC11x8y3(){ note_ctor("_ZN3ccc8CC11x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y3E, buf);
    ::ccc::CC11x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y3E);
    dp->::ccc::CC11x8y3::~CC11x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y3E(Test__ZN3ccc8CC11x8y3E, "_ZN3ccc8CC11x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y3C1Ev();
extern void _ZN3ccc8CC11x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y3E[] = {
  NSPAIR(_ZN3ccc8CC11x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y3E[];
extern void _ZN3ccc8CC11x8y33pqrEv();
extern void _ZN3ccc8CC11x8y33efgEv();
extern void _ZN3ccc8CC11x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y33efgEv,_ZThn4_N3ccc8CC11x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y33abcEv,_ZThn4_N3ccc8CC11x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y33efgEv,_ZThn4_N3ccc8CC11x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y33abcEv,_ZThn4_N3ccc8CC11x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y3E[];
Class_Descriptor cd__ZN3ccc8CC11x8y3E = {  "_ZN3ccc8CC11x8y3E", // class name
  bases__ZN3ccc8CC11x8y3E, 2,
  &(vtc__ZN3ccc8CC11x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y4  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC11x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x8y43efgEv
  ~CC11x8y4(); // tgen
  CC11x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y4E) C1{ BC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y43pqrEv");}
void  ccc::CC11x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y43abcEv");}
void  ccc::CC11x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y43efgEv");}
ccc::CC11x8y4 ::~CC11x8y4(){ note_dtor("_ZN3ccc8CC11x8y4E", this);} // tgen
ccc::CC11x8y4 ::CC11x8y4(){ note_ctor("_ZN3ccc8CC11x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y4E, buf);
    ::ccc::CC11x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y4E);
    dp->::ccc::CC11x8y4::~CC11x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y4E(Test__ZN3ccc8CC11x8y4E, "_ZN3ccc8CC11x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y4C1Ev();
extern void _ZN3ccc8CC11x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y4E[] = {
  NSPAIR(_ZN3ccc8CC11x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y4E[];
extern void _ZN3ccc8CC11x8y43pqrEv();
extern void _ZN3ccc8CC11x8y43efgEv();
extern void _ZN3ccc8CC11x8y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y43efgEv,_ZThn4_N3ccc8CC11x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y43abcEv,_ZThn4_N3ccc8CC11x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y43efgEv,_ZThn4_N3ccc8CC11x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y43abcEv,_ZThn4_N3ccc8CC11x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y4E[];
Class_Descriptor cd__ZN3ccc8CC11x8y4E = {  "_ZN3ccc8CC11x8y4E", // class name
  bases__ZN3ccc8CC11x8y4E, 2,
  &(vtc__ZN3ccc8CC11x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y5  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC11x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x8y53abcEv
  ~CC11x8y5(); // tgen
  CC11x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y5E) C1{ BC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y53pqrEv");}
void  ccc::CC11x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y53efgEv");}
void  ccc::CC11x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y53abcEv");}
ccc::CC11x8y5 ::~CC11x8y5(){ note_dtor("_ZN3ccc8CC11x8y5E", this);} // tgen
ccc::CC11x8y5 ::CC11x8y5(){ note_ctor("_ZN3ccc8CC11x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y5E, buf);
    ::ccc::CC11x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y5E);
    dp->::ccc::CC11x8y5::~CC11x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y5E(Test__ZN3ccc8CC11x8y5E, "_ZN3ccc8CC11x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y5C1Ev();
extern void _ZN3ccc8CC11x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y5E[] = {
  NSPAIR(_ZN3ccc8CC11x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y5E[];
extern void _ZN3ccc8CC11x8y53pqrEv();
extern void _ZN3ccc8CC11x8y53efgEv();
extern void _ZN3ccc8CC11x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y53efgEv,_ZThn4_N3ccc8CC11x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y53abcEv,_ZThn4_N3ccc8CC11x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y53efgEv,_ZThn4_N3ccc8CC11x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y53abcEv,_ZThn4_N3ccc8CC11x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y5E[];
Class_Descriptor cd__ZN3ccc8CC11x8y5E = {  "_ZN3ccc8CC11x8y5E", // class name
  bases__ZN3ccc8CC11x8y5E, 2,
  &(vtc__ZN3ccc8CC11x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y6  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC11x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x8y63efgEv
  ~CC11x8y6(); // tgen
  CC11x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y6E) C1{ BC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y63abcEv");}
void  ccc::CC11x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y63efgEv");}
ccc::CC11x8y6 ::~CC11x8y6(){ note_dtor("_ZN3ccc8CC11x8y6E", this);} // tgen
ccc::CC11x8y6 ::CC11x8y6(){ note_ctor("_ZN3ccc8CC11x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y6E, buf);
    ::ccc::CC11x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y6E);
    dp->::ccc::CC11x8y6::~CC11x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y6E(Test__ZN3ccc8CC11x8y6E, "_ZN3ccc8CC11x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y6C1Ev();
extern void _ZN3ccc8CC11x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y6E[] = {
  NSPAIR(_ZN3ccc8CC11x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x8y63efgEv();
extern void _ZN3ccc8CC11x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y63efgEv,_ZThn4_N3ccc8CC11x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y63abcEv,_ZThn4_N3ccc8CC11x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y63efgEv,_ZThn4_N3ccc8CC11x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y63abcEv,_ZThn4_N3ccc8CC11x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y6E[];
Class_Descriptor cd__ZN3ccc8CC11x8y6E = {  "_ZN3ccc8CC11x8y6E", // class name
  bases__ZN3ccc8CC11x8y6E, 2,
  &(vtc__ZN3ccc8CC11x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y7  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC11x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y73pqrEv
  ~CC11x8y7(); // tgen
  CC11x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y7E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y73abcEv");}
void  ccc::CC11x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y73pqrEv");}
ccc::CC11x8y7 ::~CC11x8y7(){ note_dtor("_ZN3ccc8CC11x8y7E", this);} // tgen
ccc::CC11x8y7 ::CC11x8y7(){ note_ctor("_ZN3ccc8CC11x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y7E, buf);
    ::ccc::CC11x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y7E);
    dp->::ccc::CC11x8y7::~CC11x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y7E(Test__ZN3ccc8CC11x8y7E, "_ZN3ccc8CC11x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y7C1Ev();
extern void _ZN3ccc8CC11x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y7E[] = {
  NSPAIR(_ZN3ccc8CC11x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y7E[];
extern void _ZN3ccc8CC11x8y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y73abcEv,_ZThn4_N3ccc8CC11x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y73abcEv,_ZThn4_N3ccc8CC11x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y7E[];
Class_Descriptor cd__ZN3ccc8CC11x8y7E = {  "_ZN3ccc8CC11x8y7E", // class name
  bases__ZN3ccc8CC11x8y7E, 2,
  &(vtc__ZN3ccc8CC11x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y8  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC11x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x8y83abcEv
  ~CC11x8y8(); // tgen
  CC11x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y8E) C1{ BC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y83efgEv");}
void  ccc::CC11x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x8y83abcEv");}
ccc::CC11x8y8 ::~CC11x8y8(){ note_dtor("_ZN3ccc8CC11x8y8E", this);} // tgen
ccc::CC11x8y8 ::CC11x8y8(){ note_ctor("_ZN3ccc8CC11x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y8E, buf);
    ::ccc::CC11x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y8E);
    dp->::ccc::CC11x8y8::~CC11x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y8E(Test__ZN3ccc8CC11x8y8E, "_ZN3ccc8CC11x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y8C1Ev();
extern void _ZN3ccc8CC11x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y8E[] = {
  NSPAIR(_ZN3ccc8CC11x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x8y83efgEv();
extern void _ZN3ccc8CC11x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y83efgEv,_ZThn4_N3ccc8CC11x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y83abcEv,_ZThn4_N3ccc8CC11x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y83efgEv,_ZThn4_N3ccc8CC11x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y83abcEv,_ZThn4_N3ccc8CC11x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y8E[];
Class_Descriptor cd__ZN3ccc8CC11x8y8E = {  "_ZN3ccc8CC11x8y8E", // class name
  bases__ZN3ccc8CC11x8y8E, 2,
  &(vtc__ZN3ccc8CC11x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y9  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC11x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x8y93pqrEv
  ~CC11x8y9(); // tgen
  CC11x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x8y9E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x8y93efgEv");}
void  ccc::CC11x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x8y93pqrEv");}
ccc::CC11x8y9 ::~CC11x8y9(){ note_dtor("_ZN3ccc8CC11x8y9E", this);} // tgen
ccc::CC11x8y9 ::CC11x8y9(){ note_ctor("_ZN3ccc8CC11x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x8y9E, buf);
    ::ccc::CC11x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x8y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC11x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x8y9E);
    dp->::ccc::CC11x8y9::~CC11x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x8y9E(Test__ZN3ccc8CC11x8y9E, "_ZN3ccc8CC11x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x8y9C1Ev();
extern void _ZN3ccc8CC11x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x8y9E[] = {
  NSPAIR(_ZN3ccc8CC11x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC11x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y9E[];
extern void _ZN3ccc8CC11x8y93pqrEv();
extern void _ZN3ccc8CC11x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x8y93efgEv,_ZThn4_N3ccc8CC11x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x8y93efgEv,_ZThn4_N3ccc8CC11x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x8y9E[];
Class_Descriptor cd__ZN3ccc8CC11x8y9E = {  "_ZN3ccc8CC11x8y9E", // class name
  bases__ZN3ccc8CC11x8y9E, 2,
  &(vtc__ZN3ccc8CC11x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x8y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y10  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC11x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x8y103abcEv
  ~CC11x8y10(); // tgen
  CC11x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y10E) C1{ BC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x8y103pqrEv");}
void  ccc::CC11x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x8y103abcEv");}
ccc::CC11x8y10 ::~CC11x8y10(){ note_dtor("_ZN3ccc9CC11x8y10E", this);} // tgen
ccc::CC11x8y10 ::CC11x8y10(){ note_ctor("_ZN3ccc9CC11x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y10E, buf);
    ::ccc::CC11x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y10E);
    dp->::ccc::CC11x8y10::~CC11x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y10E(Test__ZN3ccc9CC11x8y10E, "_ZN3ccc9CC11x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y10C1Ev();
extern void _ZN3ccc9CC11x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y10E[] = {
  NSPAIR(_ZN3ccc9CC11x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y10E[];
extern void _ZN3ccc9CC11x8y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x8y103abcEv,_ZThn4_N3ccc9CC11x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x8y103abcEv,_ZThn4_N3ccc9CC11x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y10E[];
Class_Descriptor cd__ZN3ccc9CC11x8y10E = {  "_ZN3ccc9CC11x8y10E", // class name
  bases__ZN3ccc9CC11x8y10E, 2,
  &(vtc__ZN3ccc9CC11x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y11  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC11x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x8y113efgEv
  ~CC11x8y11(); // tgen
  CC11x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y11E) C1{ BC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x8y113pqrEv");}
void  ccc::CC11x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x8y113efgEv");}
ccc::CC11x8y11 ::~CC11x8y11(){ note_dtor("_ZN3ccc9CC11x8y11E", this);} // tgen
ccc::CC11x8y11 ::CC11x8y11(){ note_ctor("_ZN3ccc9CC11x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y11E, buf);
    ::ccc::CC11x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y11E);
    dp->::ccc::CC11x8y11::~CC11x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y11E(Test__ZN3ccc9CC11x8y11E, "_ZN3ccc9CC11x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y11C1Ev();
extern void _ZN3ccc9CC11x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y11E[] = {
  NSPAIR(_ZN3ccc9CC11x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y11E[];
extern void _ZN3ccc9CC11x8y113pqrEv();
extern void _ZN3ccc9CC11x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x8y113efgEv,_ZThn4_N3ccc9CC11x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x8y113efgEv,_ZThn4_N3ccc9CC11x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y11E[];
Class_Descriptor cd__ZN3ccc9CC11x8y11E = {  "_ZN3ccc9CC11x8y11E", // class name
  bases__ZN3ccc9CC11x8y11E, 2,
  &(vtc__ZN3ccc9CC11x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y12  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC11x8y123abcEv
  ~CC11x8y12(); // tgen
  CC11x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y12E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x8y123abcEv");}
ccc::CC11x8y12 ::~CC11x8y12(){ note_dtor("_ZN3ccc9CC11x8y12E", this);} // tgen
ccc::CC11x8y12 ::CC11x8y12(){ note_ctor("_ZN3ccc9CC11x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y12E, buf);
    ::ccc::CC11x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y12E);
    dp->::ccc::CC11x8y12::~CC11x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y12E(Test__ZN3ccc9CC11x8y12E, "_ZN3ccc9CC11x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y12C1Ev();
extern void _ZN3ccc9CC11x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y12E[] = {
  NSPAIR(_ZN3ccc9CC11x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x8y123abcEv,_ZThn4_N3ccc9CC11x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x8y123abcEv,_ZThn4_N3ccc9CC11x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y12E[];
Class_Descriptor cd__ZN3ccc9CC11x8y12E = {  "_ZN3ccc9CC11x8y12E", // class name
  bases__ZN3ccc9CC11x8y12E, 2,
  &(vtc__ZN3ccc9CC11x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y13  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC11x8y133efgEv
  ~CC11x8y13(); // tgen
  CC11x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y13E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC11x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x8y133efgEv");}
ccc::CC11x8y13 ::~CC11x8y13(){ note_dtor("_ZN3ccc9CC11x8y13E", this);} // tgen
ccc::CC11x8y13 ::CC11x8y13(){ note_ctor("_ZN3ccc9CC11x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y13E, buf);
    ::ccc::CC11x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y13E);
    dp->::ccc::CC11x8y13::~CC11x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y13E(Test__ZN3ccc9CC11x8y13E, "_ZN3ccc9CC11x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y13C1Ev();
extern void _ZN3ccc9CC11x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y13E[] = {
  NSPAIR(_ZN3ccc9CC11x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x8y133efgEv,_ZThn4_N3ccc9CC11x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x8y133efgEv,_ZThn4_N3ccc9CC11x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y13E[];
Class_Descriptor cd__ZN3ccc9CC11x8y13E = {  "_ZN3ccc9CC11x8y13E", // class name
  bases__ZN3ccc9CC11x8y13E, 2,
  &(vtc__ZN3ccc9CC11x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y14  : ::ccc::AA11 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC11x8y143pqrEv
  ~CC11x8y14(); // tgen
  CC11x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y14E) C1{ BC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x8y143pqrEv");}
ccc::CC11x8y14 ::~CC11x8y14(){ note_dtor("_ZN3ccc9CC11x8y14E", this);} // tgen
ccc::CC11x8y14 ::CC11x8y14(){ note_ctor("_ZN3ccc9CC11x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y14E, buf);
    ::ccc::CC11x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y14E);
    dp->::ccc::CC11x8y14::~CC11x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y14E(Test__ZN3ccc9CC11x8y14E, "_ZN3ccc9CC11x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y14C1Ev();
extern void _ZN3ccc9CC11x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y14E[] = {
  NSPAIR(_ZN3ccc9CC11x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y14E[];
extern void _ZN3ccc9CC11x8y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y14E[];
Class_Descriptor cd__ZN3ccc9CC11x8y14E = {  "_ZN3ccc9CC11x8y14E", // class name
  bases__ZN3ccc9CC11x8y14E, 2,
  &(vtc__ZN3ccc9CC11x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x8y15  : ::ccc::AA11 , ::ccc::BB8 {
  ~CC11x8y15(); // tgen
  CC11x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x8y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x8y15 ::~CC11x8y15(){ note_dtor("_ZN3ccc9CC11x8y15E", this);} // tgen
ccc::CC11x8y15 ::CC11x8y15(){ note_ctor("_ZN3ccc9CC11x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x8y15E, buf);
    ::ccc::CC11x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x8y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC11x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x8y15E);
    dp->::ccc::CC11x8y15::~CC11x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x8y15E(Test__ZN3ccc9CC11x8y15E, "_ZN3ccc9CC11x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x8y15C1Ev();
extern void _ZN3ccc9CC11x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x8y15E[] = {
  NSPAIR(_ZN3ccc9CC11x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC11x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x8y15E[];
Class_Descriptor cd__ZN3ccc9CC11x8y15E = {  "_ZN3ccc9CC11x8y15E", // class name
  bases__ZN3ccc9CC11x8y15E, 2,
  &(vtc__ZN3ccc9CC11x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x8y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y0  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC11x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC11x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y03pqrEv
  ~CC11x9y0(); // tgen
  CC11x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y0E) C1{ BC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y03abcEv");}
void  ccc::CC11x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y03efgEv");}
void  ccc::CC11x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y03pqrEv");}
ccc::CC11x9y0 ::~CC11x9y0(){ note_dtor("_ZN3ccc8CC11x9y0E", this);} // tgen
ccc::CC11x9y0 ::CC11x9y0(){ note_ctor("_ZN3ccc8CC11x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y0E, buf);
    ::ccc::CC11x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y0E);
    dp->::ccc::CC11x9y0::~CC11x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y0E(Test__ZN3ccc8CC11x9y0E, "_ZN3ccc8CC11x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y0C1Ev();
extern void _ZN3ccc8CC11x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y0E[] = {
  NSPAIR(_ZN3ccc8CC11x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y0E[];
extern void _ZN3ccc8CC11x9y03pqrEv();
extern void _ZN3ccc8CC11x9y03efgEv();
extern void _ZN3ccc8CC11x9y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y03efgEv,_ZThn4_N3ccc8CC11x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y03pqrEv,_ZThn4_N3ccc8CC11x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y03efgEv,_ZThn4_N3ccc8CC11x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y03pqrEv,_ZThn4_N3ccc8CC11x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y0E[];
Class_Descriptor cd__ZN3ccc8CC11x9y0E = {  "_ZN3ccc8CC11x9y0E", // class name
  bases__ZN3ccc8CC11x9y0E, 2,
  &(vtc__ZN3ccc8CC11x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y1  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC11x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x9y13efgEv
  ~CC11x9y1(); // tgen
  CC11x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y1E) C1{ BC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y13abcEv");}
void  ccc::CC11x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y13pqrEv");}
void  ccc::CC11x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y13efgEv");}
ccc::CC11x9y1 ::~CC11x9y1(){ note_dtor("_ZN3ccc8CC11x9y1E", this);} // tgen
ccc::CC11x9y1 ::CC11x9y1(){ note_ctor("_ZN3ccc8CC11x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y1E, buf);
    ::ccc::CC11x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y1E);
    dp->::ccc::CC11x9y1::~CC11x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y1E(Test__ZN3ccc8CC11x9y1E, "_ZN3ccc8CC11x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y1C1Ev();
extern void _ZN3ccc8CC11x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y1E[] = {
  NSPAIR(_ZN3ccc8CC11x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y1E[];
extern void _ZN3ccc8CC11x9y13pqrEv();
extern void _ZN3ccc8CC11x9y13efgEv();
extern void _ZN3ccc8CC11x9y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y13efgEv,_ZThn4_N3ccc8CC11x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y13pqrEv,_ZThn4_N3ccc8CC11x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y13efgEv,_ZThn4_N3ccc8CC11x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y13pqrEv,_ZThn4_N3ccc8CC11x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y1E[];
Class_Descriptor cd__ZN3ccc8CC11x9y1E = {  "_ZN3ccc8CC11x9y1E", // class name
  bases__ZN3ccc8CC11x9y1E, 2,
  &(vtc__ZN3ccc8CC11x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y2  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC11x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC11x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y23pqrEv
  ~CC11x9y2(); // tgen
  CC11x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y2E) C1{ BC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y23efgEv");}
void  ccc::CC11x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y23abcEv");}
void  ccc::CC11x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y23pqrEv");}
ccc::CC11x9y2 ::~CC11x9y2(){ note_dtor("_ZN3ccc8CC11x9y2E", this);} // tgen
ccc::CC11x9y2 ::CC11x9y2(){ note_ctor("_ZN3ccc8CC11x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y2E, buf);
    ::ccc::CC11x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y2E);
    dp->::ccc::CC11x9y2::~CC11x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y2E(Test__ZN3ccc8CC11x9y2E, "_ZN3ccc8CC11x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y2C1Ev();
extern void _ZN3ccc8CC11x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y2E[] = {
  NSPAIR(_ZN3ccc8CC11x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y2E[];
extern void _ZN3ccc8CC11x9y23pqrEv();
extern void _ZN3ccc8CC11x9y23efgEv();
extern void _ZN3ccc8CC11x9y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y23efgEv,_ZThn4_N3ccc8CC11x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y23pqrEv,_ZThn4_N3ccc8CC11x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y23efgEv,_ZThn4_N3ccc8CC11x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y23pqrEv,_ZThn4_N3ccc8CC11x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y2E[];
Class_Descriptor cd__ZN3ccc8CC11x9y2E = {  "_ZN3ccc8CC11x9y2E", // class name
  bases__ZN3ccc8CC11x9y2E, 2,
  &(vtc__ZN3ccc8CC11x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y3  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC11x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x9y33abcEv
  ~CC11x9y3(); // tgen
  CC11x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y3E) C1{ BC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y33efgEv");}
void  ccc::CC11x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y33pqrEv");}
void  ccc::CC11x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y33abcEv");}
ccc::CC11x9y3 ::~CC11x9y3(){ note_dtor("_ZN3ccc8CC11x9y3E", this);} // tgen
ccc::CC11x9y3 ::CC11x9y3(){ note_ctor("_ZN3ccc8CC11x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y3E, buf);
    ::ccc::CC11x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y3E);
    dp->::ccc::CC11x9y3::~CC11x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y3E(Test__ZN3ccc8CC11x9y3E, "_ZN3ccc8CC11x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y3C1Ev();
extern void _ZN3ccc8CC11x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y3E[] = {
  NSPAIR(_ZN3ccc8CC11x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y3E[];
extern void _ZN3ccc8CC11x9y33pqrEv();
extern void _ZN3ccc8CC11x9y33efgEv();
extern void _ZN3ccc8CC11x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y33efgEv,_ZThn4_N3ccc8CC11x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y33pqrEv,_ZThn4_N3ccc8CC11x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y33efgEv,_ZThn4_N3ccc8CC11x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y33pqrEv,_ZThn4_N3ccc8CC11x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y3E[];
Class_Descriptor cd__ZN3ccc8CC11x9y3E = {  "_ZN3ccc8CC11x9y3E", // class name
  bases__ZN3ccc8CC11x9y3E, 2,
  &(vtc__ZN3ccc8CC11x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y4  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC11x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC11x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC11x9y43efgEv
  ~CC11x9y4(); // tgen
  CC11x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y4E) C1{ BC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y43pqrEv");}
void  ccc::CC11x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y43abcEv");}
void  ccc::CC11x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y43efgEv");}
ccc::CC11x9y4 ::~CC11x9y4(){ note_dtor("_ZN3ccc8CC11x9y4E", this);} // tgen
ccc::CC11x9y4 ::CC11x9y4(){ note_ctor("_ZN3ccc8CC11x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y4E, buf);
    ::ccc::CC11x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y4E);
    dp->::ccc::CC11x9y4::~CC11x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y4E(Test__ZN3ccc8CC11x9y4E, "_ZN3ccc8CC11x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y4C1Ev();
extern void _ZN3ccc8CC11x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y4E[] = {
  NSPAIR(_ZN3ccc8CC11x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y4E[];
extern void _ZN3ccc8CC11x9y43pqrEv();
extern void _ZN3ccc8CC11x9y43efgEv();
extern void _ZN3ccc8CC11x9y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y43efgEv,_ZThn4_N3ccc8CC11x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y43pqrEv,_ZThn4_N3ccc8CC11x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y43efgEv,_ZThn4_N3ccc8CC11x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y43pqrEv,_ZThn4_N3ccc8CC11x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y4E[];
Class_Descriptor cd__ZN3ccc8CC11x9y4E = {  "_ZN3ccc8CC11x9y4E", // class name
  bases__ZN3ccc8CC11x9y4E, 2,
  &(vtc__ZN3ccc8CC11x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y5  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC11x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC11x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC11x9y53abcEv
  ~CC11x9y5(); // tgen
  CC11x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y5E) C1{ BC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y53pqrEv");}
void  ccc::CC11x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y53efgEv");}
void  ccc::CC11x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y53abcEv");}
ccc::CC11x9y5 ::~CC11x9y5(){ note_dtor("_ZN3ccc8CC11x9y5E", this);} // tgen
ccc::CC11x9y5 ::CC11x9y5(){ note_ctor("_ZN3ccc8CC11x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y5E, buf);
    ::ccc::CC11x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y5E);
    dp->::ccc::CC11x9y5::~CC11x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y5E(Test__ZN3ccc8CC11x9y5E, "_ZN3ccc8CC11x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y5C1Ev();
extern void _ZN3ccc8CC11x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y5E[] = {
  NSPAIR(_ZN3ccc8CC11x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y5E[];
extern void _ZN3ccc8CC11x9y53pqrEv();
extern void _ZN3ccc8CC11x9y53efgEv();
extern void _ZN3ccc8CC11x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y53efgEv,_ZThn4_N3ccc8CC11x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y53pqrEv,_ZThn4_N3ccc8CC11x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y53efgEv,_ZThn4_N3ccc8CC11x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y53pqrEv,_ZThn4_N3ccc8CC11x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y5E[];
Class_Descriptor cd__ZN3ccc8CC11x9y5E = {  "_ZN3ccc8CC11x9y5E", // class name
  bases__ZN3ccc8CC11x9y5E, 2,
  &(vtc__ZN3ccc8CC11x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y6  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC11x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC11x9y63efgEv
  ~CC11x9y6(); // tgen
  CC11x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y6E) C1{ BC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y63abcEv");}
void  ccc::CC11x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y63efgEv");}
ccc::CC11x9y6 ::~CC11x9y6(){ note_dtor("_ZN3ccc8CC11x9y6E", this);} // tgen
ccc::CC11x9y6 ::CC11x9y6(){ note_ctor("_ZN3ccc8CC11x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y6E, buf);
    ::ccc::CC11x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y6E);
    dp->::ccc::CC11x9y6::~CC11x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y6E(Test__ZN3ccc8CC11x9y6E, "_ZN3ccc8CC11x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y6C1Ev();
extern void _ZN3ccc8CC11x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y6E[] = {
  NSPAIR(_ZN3ccc8CC11x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x9y63efgEv();
extern void _ZN3ccc8CC11x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y63efgEv,_ZThn4_N3ccc8CC11x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y63efgEv,_ZThn4_N3ccc8CC11x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y6E[];
Class_Descriptor cd__ZN3ccc8CC11x9y6E = {  "_ZN3ccc8CC11x9y6E", // class name
  bases__ZN3ccc8CC11x9y6E, 2,
  &(vtc__ZN3ccc8CC11x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y7  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC11x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y73pqrEv
  ~CC11x9y7(); // tgen
  CC11x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y7E) C1{ BC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y73abcEv");}
void  ccc::CC11x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y73pqrEv");}
ccc::CC11x9y7 ::~CC11x9y7(){ note_dtor("_ZN3ccc8CC11x9y7E", this);} // tgen
ccc::CC11x9y7 ::CC11x9y7(){ note_ctor("_ZN3ccc8CC11x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y7E, buf);
    ::ccc::CC11x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y7E);
    dp->::ccc::CC11x9y7::~CC11x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y7E(Test__ZN3ccc8CC11x9y7E, "_ZN3ccc8CC11x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y7C1Ev();
extern void _ZN3ccc8CC11x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y7E[] = {
  NSPAIR(_ZN3ccc8CC11x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y7E[];
extern void _ZN3ccc8CC11x9y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc8CC11x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y73pqrEv,_ZThn4_N3ccc8CC11x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y73pqrEv,_ZThn4_N3ccc8CC11x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y7E[];
Class_Descriptor cd__ZN3ccc8CC11x9y7E = {  "_ZN3ccc8CC11x9y7E", // class name
  bases__ZN3ccc8CC11x9y7E, 2,
  &(vtc__ZN3ccc8CC11x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y8  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC11x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC11x9y83abcEv
  ~CC11x9y8(); // tgen
  CC11x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y8E) C1{ BC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y83efgEv");}
void  ccc::CC11x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC11x9y83abcEv");}
ccc::CC11x9y8 ::~CC11x9y8(){ note_dtor("_ZN3ccc8CC11x9y8E", this);} // tgen
ccc::CC11x9y8 ::CC11x9y8(){ note_ctor("_ZN3ccc8CC11x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y8E, buf);
    ::ccc::CC11x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y8E);
    dp->::ccc::CC11x9y8::~CC11x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y8E(Test__ZN3ccc8CC11x9y8E, "_ZN3ccc8CC11x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y8C1Ev();
extern void _ZN3ccc8CC11x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y8E[] = {
  NSPAIR(_ZN3ccc8CC11x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc8CC11x9y83efgEv();
extern void _ZN3ccc8CC11x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y83efgEv,_ZThn4_N3ccc8CC11x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y83efgEv,_ZThn4_N3ccc8CC11x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y8E[];
Class_Descriptor cd__ZN3ccc8CC11x9y8E = {  "_ZN3ccc8CC11x9y8E", // class name
  bases__ZN3ccc8CC11x9y8E, 2,
  &(vtc__ZN3ccc8CC11x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y9  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC11x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC11x9y93pqrEv
  ~CC11x9y9(); // tgen
  CC11x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC11x9y9E) C1{ BC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC11x9y93efgEv");}
void  ccc::CC11x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC11x9y93pqrEv");}
ccc::CC11x9y9 ::~CC11x9y9(){ note_dtor("_ZN3ccc8CC11x9y9E", this);} // tgen
ccc::CC11x9y9 ::CC11x9y9(){ note_ctor("_ZN3ccc8CC11x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC11x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC11x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC11x9y9E, buf);
    ::ccc::CC11x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC11x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC11x9y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc8CC11x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC11x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC11x9y9E);
    dp->::ccc::CC11x9y9::~CC11x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC11x9y9E(Test__ZN3ccc8CC11x9y9E, "_ZN3ccc8CC11x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC11x9y9C1Ev();
extern void _ZN3ccc8CC11x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC11x9y9E[] = {
  NSPAIR(_ZN3ccc8CC11x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC11x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC11x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y9E[];
extern void _ZN3ccc8CC11x9y93pqrEv();
extern void _ZN3ccc8CC11x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y93efgEv,_ZThn4_N3ccc8CC11x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC11x9y93pqrEv,_ZThn4_N3ccc8CC11x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC11x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC11x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC11x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y93efgEv,_ZThn4_N3ccc8CC11x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC11x9y93pqrEv,_ZThn4_N3ccc8CC11x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC11x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC11x9y9E[];
Class_Descriptor cd__ZN3ccc8CC11x9y9E = {  "_ZN3ccc8CC11x9y9E", // class name
  bases__ZN3ccc8CC11x9y9E, 2,
  &(vtc__ZN3ccc8CC11x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC11x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC11x9y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y10  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC11x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x9y103abcEv
  ~CC11x9y10(); // tgen
  CC11x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y10E) C1{ BC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x9y103pqrEv");}
void  ccc::CC11x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x9y103abcEv");}
ccc::CC11x9y10 ::~CC11x9y10(){ note_dtor("_ZN3ccc9CC11x9y10E", this);} // tgen
ccc::CC11x9y10 ::CC11x9y10(){ note_ctor("_ZN3ccc9CC11x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y10E, buf);
    ::ccc::CC11x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y10E);
    dp->::ccc::CC11x9y10::~CC11x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y10E(Test__ZN3ccc9CC11x9y10E, "_ZN3ccc9CC11x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y10C1Ev();
extern void _ZN3ccc9CC11x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y10E[] = {
  NSPAIR(_ZN3ccc9CC11x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y10E[];
extern void _ZN3ccc9CC11x9y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x9y103pqrEv,_ZThn4_N3ccc9CC11x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x9y103pqrEv,_ZThn4_N3ccc9CC11x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y10E[];
Class_Descriptor cd__ZN3ccc9CC11x9y10E = {  "_ZN3ccc9CC11x9y10E", // class name
  bases__ZN3ccc9CC11x9y10E, 2,
  &(vtc__ZN3ccc9CC11x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y11  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC11x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x9y113efgEv
  ~CC11x9y11(); // tgen
  CC11x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y11E) C1{ BC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x9y113pqrEv");}
void  ccc::CC11x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x9y113efgEv");}
ccc::CC11x9y11 ::~CC11x9y11(){ note_dtor("_ZN3ccc9CC11x9y11E", this);} // tgen
ccc::CC11x9y11 ::CC11x9y11(){ note_ctor("_ZN3ccc9CC11x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y11E, buf);
    ::ccc::CC11x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y11E);
    dp->::ccc::CC11x9y11::~CC11x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y11E(Test__ZN3ccc9CC11x9y11E, "_ZN3ccc9CC11x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y11C1Ev();
extern void _ZN3ccc9CC11x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y11E[] = {
  NSPAIR(_ZN3ccc9CC11x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y11E[];
extern void _ZN3ccc9CC11x9y113pqrEv();
extern void _ZN3ccc9CC11x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x9y113efgEv,_ZThn4_N3ccc9CC11x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x9y113pqrEv,_ZThn4_N3ccc9CC11x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x9y113efgEv,_ZThn4_N3ccc9CC11x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x9y113pqrEv,_ZThn4_N3ccc9CC11x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y11E[];
Class_Descriptor cd__ZN3ccc9CC11x9y11E = {  "_ZN3ccc9CC11x9y11E", // class name
  bases__ZN3ccc9CC11x9y11E, 2,
  &(vtc__ZN3ccc9CC11x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y12  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC11x9y123abcEv
  ~CC11x9y12(); // tgen
  CC11x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y12E) C1{ BC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC11x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x9y123abcEv");}
ccc::CC11x9y12 ::~CC11x9y12(){ note_dtor("_ZN3ccc9CC11x9y12E", this);} // tgen
ccc::CC11x9y12 ::CC11x9y12(){ note_ctor("_ZN3ccc9CC11x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y12E, buf);
    ::ccc::CC11x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y12E);
    dp->::ccc::CC11x9y12::~CC11x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y12E(Test__ZN3ccc9CC11x9y12E, "_ZN3ccc9CC11x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y12C1Ev();
extern void _ZN3ccc9CC11x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y12E[] = {
  NSPAIR(_ZN3ccc9CC11x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y12E[];
Class_Descriptor cd__ZN3ccc9CC11x9y12E = {  "_ZN3ccc9CC11x9y12E", // class name
  bases__ZN3ccc9CC11x9y12E, 2,
  &(vtc__ZN3ccc9CC11x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y13  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC11x9y133efgEv
  ~CC11x9y13(); // tgen
  CC11x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y13E) C1{ BC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC11x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x9y133efgEv");}
ccc::CC11x9y13 ::~CC11x9y13(){ note_dtor("_ZN3ccc9CC11x9y13E", this);} // tgen
ccc::CC11x9y13 ::CC11x9y13(){ note_ctor("_ZN3ccc9CC11x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y13E, buf);
    ::ccc::CC11x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y13E);
    dp->::ccc::CC11x9y13::~CC11x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y13E(Test__ZN3ccc9CC11x9y13E, "_ZN3ccc9CC11x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y13C1Ev();
extern void _ZN3ccc9CC11x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y13E[] = {
  NSPAIR(_ZN3ccc9CC11x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x9y133efgEv,_ZThn4_N3ccc9CC11x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x9y133efgEv,_ZThn4_N3ccc9CC11x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y13E[];
Class_Descriptor cd__ZN3ccc9CC11x9y13E = {  "_ZN3ccc9CC11x9y13E", // class name
  bases__ZN3ccc9CC11x9y13E, 2,
  &(vtc__ZN3ccc9CC11x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y14  : ::ccc::AA11 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC11x9y143pqrEv
  ~CC11x9y14(); // tgen
  CC11x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y14E) C1{ BC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC11x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x9y143pqrEv");}
ccc::CC11x9y14 ::~CC11x9y14(){ note_dtor("_ZN3ccc9CC11x9y14E", this);} // tgen
ccc::CC11x9y14 ::CC11x9y14(){ note_ctor("_ZN3ccc9CC11x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y14E, buf);
    ::ccc::CC11x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y14E);
    dp->::ccc::CC11x9y14::~CC11x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y14E(Test__ZN3ccc9CC11x9y14E, "_ZN3ccc9CC11x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y14C1Ev();
extern void _ZN3ccc9CC11x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y14E[] = {
  NSPAIR(_ZN3ccc9CC11x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y14E[];
extern void _ZN3ccc9CC11x9y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x9y143pqrEv,_ZThn4_N3ccc9CC11x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x9y143pqrEv,_ZThn4_N3ccc9CC11x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y14E[];
Class_Descriptor cd__ZN3ccc9CC11x9y14E = {  "_ZN3ccc9CC11x9y14E", // class name
  bases__ZN3ccc9CC11x9y14E, 2,
  &(vtc__ZN3ccc9CC11x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x9y15  : ::ccc::AA11 , ::ccc::BB9 {
  ~CC11x9y15(); // tgen
  CC11x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC11x9y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x9y15 ::~CC11x9y15(){ note_dtor("_ZN3ccc9CC11x9y15E", this);} // tgen
ccc::CC11x9y15 ::CC11x9y15(){ note_ctor("_ZN3ccc9CC11x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC11x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x9y15E, buf);
    ::ccc::CC11x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x9y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC11x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x9y15E);
    dp->::ccc::CC11x9y15::~CC11x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x9y15E(Test__ZN3ccc9CC11x9y15E, "_ZN3ccc9CC11x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x9y15C1Ev();
extern void _ZN3ccc9CC11x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC11x9y15E[] = {
  NSPAIR(_ZN3ccc9CC11x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC11x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC11x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x9y15E[];
Class_Descriptor cd__ZN3ccc9CC11x9y15E = {  "_ZN3ccc9CC11x9y15E", // class name
  bases__ZN3ccc9CC11x9y15E, 2,
  &(vtc__ZN3ccc9CC11x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x9y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y0  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC11x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y03pqrEv
  ~CC11x10y0(); // tgen
  CC11x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y0E) C1{ BC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y03abcEv");}
void  ccc::CC11x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y03efgEv");}
void  ccc::CC11x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y03pqrEv");}
ccc::CC11x10y0 ::~CC11x10y0(){ note_dtor("_ZN3ccc9CC11x10y0E", this);} // tgen
ccc::CC11x10y0 ::CC11x10y0(){ note_ctor("_ZN3ccc9CC11x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y0E, buf);
    ::ccc::CC11x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y0E);
    dp->::ccc::CC11x10y0::~CC11x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y0E(Test__ZN3ccc9CC11x10y0E, "_ZN3ccc9CC11x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y0C1Ev();
extern void _ZN3ccc9CC11x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y0E[] = {
  NSPAIR(_ZN3ccc9CC11x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y0E[];
extern void _ZN3ccc9CC11x10y03pqrEv();
extern void _ZN3ccc9CC11x10y03efgEv();
extern void _ZN3ccc9CC11x10y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y03pqrEv,_ZThn4_N3ccc9CC11x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y03abcEv,_ZThn4_N3ccc9CC11x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y03pqrEv,_ZThn4_N3ccc9CC11x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y03abcEv,_ZThn4_N3ccc9CC11x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y0E[];
Class_Descriptor cd__ZN3ccc9CC11x10y0E = {  "_ZN3ccc9CC11x10y0E", // class name
  bases__ZN3ccc9CC11x10y0E, 2,
  &(vtc__ZN3ccc9CC11x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y1  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC11x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x10y13efgEv
  ~CC11x10y1(); // tgen
  CC11x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y1E) C1{ BC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y13abcEv");}
void  ccc::CC11x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y13pqrEv");}
void  ccc::CC11x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y13efgEv");}
ccc::CC11x10y1 ::~CC11x10y1(){ note_dtor("_ZN3ccc9CC11x10y1E", this);} // tgen
ccc::CC11x10y1 ::CC11x10y1(){ note_ctor("_ZN3ccc9CC11x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y1E, buf);
    ::ccc::CC11x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y1E);
    dp->::ccc::CC11x10y1::~CC11x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y1E(Test__ZN3ccc9CC11x10y1E, "_ZN3ccc9CC11x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y1C1Ev();
extern void _ZN3ccc9CC11x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y1E[] = {
  NSPAIR(_ZN3ccc9CC11x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y1E[];
extern void _ZN3ccc9CC11x10y13pqrEv();
extern void _ZN3ccc9CC11x10y13efgEv();
extern void _ZN3ccc9CC11x10y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y13pqrEv,_ZThn4_N3ccc9CC11x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y13abcEv,_ZThn4_N3ccc9CC11x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y13pqrEv,_ZThn4_N3ccc9CC11x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y13abcEv,_ZThn4_N3ccc9CC11x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y1E[];
Class_Descriptor cd__ZN3ccc9CC11x10y1E = {  "_ZN3ccc9CC11x10y1E", // class name
  bases__ZN3ccc9CC11x10y1E, 2,
  &(vtc__ZN3ccc9CC11x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y2  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC11x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y23pqrEv
  ~CC11x10y2(); // tgen
  CC11x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y2E) C1{ BC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y23efgEv");}
void  ccc::CC11x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y23abcEv");}
void  ccc::CC11x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y23pqrEv");}
ccc::CC11x10y2 ::~CC11x10y2(){ note_dtor("_ZN3ccc9CC11x10y2E", this);} // tgen
ccc::CC11x10y2 ::CC11x10y2(){ note_ctor("_ZN3ccc9CC11x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y2E, buf);
    ::ccc::CC11x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y2E);
    dp->::ccc::CC11x10y2::~CC11x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y2E(Test__ZN3ccc9CC11x10y2E, "_ZN3ccc9CC11x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y2C1Ev();
extern void _ZN3ccc9CC11x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y2E[] = {
  NSPAIR(_ZN3ccc9CC11x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y2E[];
extern void _ZN3ccc9CC11x10y23pqrEv();
extern void _ZN3ccc9CC11x10y23efgEv();
extern void _ZN3ccc9CC11x10y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y23pqrEv,_ZThn4_N3ccc9CC11x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y23abcEv,_ZThn4_N3ccc9CC11x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y23pqrEv,_ZThn4_N3ccc9CC11x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y23abcEv,_ZThn4_N3ccc9CC11x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y2E[];
Class_Descriptor cd__ZN3ccc9CC11x10y2E = {  "_ZN3ccc9CC11x10y2E", // class name
  bases__ZN3ccc9CC11x10y2E, 2,
  &(vtc__ZN3ccc9CC11x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y3  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC11x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x10y33abcEv
  ~CC11x10y3(); // tgen
  CC11x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y3E) C1{ BC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y33efgEv");}
void  ccc::CC11x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y33pqrEv");}
void  ccc::CC11x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y33abcEv");}
ccc::CC11x10y3 ::~CC11x10y3(){ note_dtor("_ZN3ccc9CC11x10y3E", this);} // tgen
ccc::CC11x10y3 ::CC11x10y3(){ note_ctor("_ZN3ccc9CC11x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y3E, buf);
    ::ccc::CC11x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y3E);
    dp->::ccc::CC11x10y3::~CC11x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y3E(Test__ZN3ccc9CC11x10y3E, "_ZN3ccc9CC11x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y3C1Ev();
extern void _ZN3ccc9CC11x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y3E[] = {
  NSPAIR(_ZN3ccc9CC11x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y3E[];
extern void _ZN3ccc9CC11x10y33pqrEv();
extern void _ZN3ccc9CC11x10y33efgEv();
extern void _ZN3ccc9CC11x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y33pqrEv,_ZThn4_N3ccc9CC11x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y33abcEv,_ZThn4_N3ccc9CC11x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y33pqrEv,_ZThn4_N3ccc9CC11x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y33abcEv,_ZThn4_N3ccc9CC11x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y3E[];
Class_Descriptor cd__ZN3ccc9CC11x10y3E = {  "_ZN3ccc9CC11x10y3E", // class name
  bases__ZN3ccc9CC11x10y3E, 2,
  &(vtc__ZN3ccc9CC11x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y4  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC11x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x10y43efgEv
  ~CC11x10y4(); // tgen
  CC11x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y4E) C1{ BC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y43pqrEv");}
void  ccc::CC11x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y43abcEv");}
void  ccc::CC11x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y43efgEv");}
ccc::CC11x10y4 ::~CC11x10y4(){ note_dtor("_ZN3ccc9CC11x10y4E", this);} // tgen
ccc::CC11x10y4 ::CC11x10y4(){ note_ctor("_ZN3ccc9CC11x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y4E, buf);
    ::ccc::CC11x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y4E);
    dp->::ccc::CC11x10y4::~CC11x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y4E(Test__ZN3ccc9CC11x10y4E, "_ZN3ccc9CC11x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y4C1Ev();
extern void _ZN3ccc9CC11x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y4E[] = {
  NSPAIR(_ZN3ccc9CC11x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y4E[];
extern void _ZN3ccc9CC11x10y43pqrEv();
extern void _ZN3ccc9CC11x10y43efgEv();
extern void _ZN3ccc9CC11x10y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y43pqrEv,_ZThn4_N3ccc9CC11x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y43abcEv,_ZThn4_N3ccc9CC11x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y43pqrEv,_ZThn4_N3ccc9CC11x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y43abcEv,_ZThn4_N3ccc9CC11x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y4E[];
Class_Descriptor cd__ZN3ccc9CC11x10y4E = {  "_ZN3ccc9CC11x10y4E", // class name
  bases__ZN3ccc9CC11x10y4E, 2,
  &(vtc__ZN3ccc9CC11x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y5  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC11x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x10y53abcEv
  ~CC11x10y5(); // tgen
  CC11x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y5E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y53pqrEv");}
void  ccc::CC11x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y53efgEv");}
void  ccc::CC11x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y53abcEv");}
ccc::CC11x10y5 ::~CC11x10y5(){ note_dtor("_ZN3ccc9CC11x10y5E", this);} // tgen
ccc::CC11x10y5 ::CC11x10y5(){ note_ctor("_ZN3ccc9CC11x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y5E, buf);
    ::ccc::CC11x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y5E);
    dp->::ccc::CC11x10y5::~CC11x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y5E(Test__ZN3ccc9CC11x10y5E, "_ZN3ccc9CC11x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y5C1Ev();
extern void _ZN3ccc9CC11x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y5E[] = {
  NSPAIR(_ZN3ccc9CC11x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y5E[];
extern void _ZN3ccc9CC11x10y53pqrEv();
extern void _ZN3ccc9CC11x10y53efgEv();
extern void _ZN3ccc9CC11x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y53pqrEv,_ZThn4_N3ccc9CC11x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y53abcEv,_ZThn4_N3ccc9CC11x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y53pqrEv,_ZThn4_N3ccc9CC11x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y53abcEv,_ZThn4_N3ccc9CC11x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y5E[];
Class_Descriptor cd__ZN3ccc9CC11x10y5E = {  "_ZN3ccc9CC11x10y5E", // class name
  bases__ZN3ccc9CC11x10y5E, 2,
  &(vtc__ZN3ccc9CC11x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y6  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC11x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x10y63efgEv
  ~CC11x10y6(); // tgen
  CC11x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y6E) C1{ BC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y63abcEv");}
void  ccc::CC11x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y63efgEv");}
ccc::CC11x10y6 ::~CC11x10y6(){ note_dtor("_ZN3ccc9CC11x10y6E", this);} // tgen
ccc::CC11x10y6 ::CC11x10y6(){ note_ctor("_ZN3ccc9CC11x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y6E, buf);
    ::ccc::CC11x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y6E);
    dp->::ccc::CC11x10y6::~CC11x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y6E(Test__ZN3ccc9CC11x10y6E, "_ZN3ccc9CC11x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y6C1Ev();
extern void _ZN3ccc9CC11x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y6E[] = {
  NSPAIR(_ZN3ccc9CC11x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x10y63efgEv();
extern void _ZN3ccc9CC11x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y63abcEv,_ZThn4_N3ccc9CC11x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y63abcEv,_ZThn4_N3ccc9CC11x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y6E[];
Class_Descriptor cd__ZN3ccc9CC11x10y6E = {  "_ZN3ccc9CC11x10y6E", // class name
  bases__ZN3ccc9CC11x10y6E, 2,
  &(vtc__ZN3ccc9CC11x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y7  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC11x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y73pqrEv
  ~CC11x10y7(); // tgen
  CC11x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y7E) C1{ BC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y73abcEv");}
void  ccc::CC11x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y73pqrEv");}
ccc::CC11x10y7 ::~CC11x10y7(){ note_dtor("_ZN3ccc9CC11x10y7E", this);} // tgen
ccc::CC11x10y7 ::CC11x10y7(){ note_ctor("_ZN3ccc9CC11x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y7E, buf);
    ::ccc::CC11x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y7E);
    dp->::ccc::CC11x10y7::~CC11x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y7E(Test__ZN3ccc9CC11x10y7E, "_ZN3ccc9CC11x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y7C1Ev();
extern void _ZN3ccc9CC11x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y7E[] = {
  NSPAIR(_ZN3ccc9CC11x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y7E[];
extern void _ZN3ccc9CC11x10y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y73pqrEv,_ZThn4_N3ccc9CC11x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y73abcEv,_ZThn4_N3ccc9CC11x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y73pqrEv,_ZThn4_N3ccc9CC11x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y73abcEv,_ZThn4_N3ccc9CC11x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y7E[];
Class_Descriptor cd__ZN3ccc9CC11x10y7E = {  "_ZN3ccc9CC11x10y7E", // class name
  bases__ZN3ccc9CC11x10y7E, 2,
  &(vtc__ZN3ccc9CC11x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y8  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC11x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x10y83abcEv
  ~CC11x10y8(); // tgen
  CC11x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y8E) C1{ BC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y83efgEv");}
void  ccc::CC11x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x10y83abcEv");}
ccc::CC11x10y8 ::~CC11x10y8(){ note_dtor("_ZN3ccc9CC11x10y8E", this);} // tgen
ccc::CC11x10y8 ::CC11x10y8(){ note_ctor("_ZN3ccc9CC11x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y8E, buf);
    ::ccc::CC11x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y8E);
    dp->::ccc::CC11x10y8::~CC11x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y8E(Test__ZN3ccc9CC11x10y8E, "_ZN3ccc9CC11x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y8C1Ev();
extern void _ZN3ccc9CC11x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y8E[] = {
  NSPAIR(_ZN3ccc9CC11x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x10y83efgEv();
extern void _ZN3ccc9CC11x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y83abcEv,_ZThn4_N3ccc9CC11x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y83abcEv,_ZThn4_N3ccc9CC11x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y8E[];
Class_Descriptor cd__ZN3ccc9CC11x10y8E = {  "_ZN3ccc9CC11x10y8E", // class name
  bases__ZN3ccc9CC11x10y8E, 2,
  &(vtc__ZN3ccc9CC11x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y9  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC11x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x10y93pqrEv
  ~CC11x10y9(); // tgen
  CC11x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x10y9E) C1{ BC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x10y93efgEv");}
void  ccc::CC11x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x10y93pqrEv");}
ccc::CC11x10y9 ::~CC11x10y9(){ note_dtor("_ZN3ccc9CC11x10y9E", this);} // tgen
ccc::CC11x10y9 ::CC11x10y9(){ note_ctor("_ZN3ccc9CC11x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x10y9E, buf);
    ::ccc::CC11x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x10y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC11x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x10y9E);
    dp->::ccc::CC11x10y9::~CC11x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x10y9E(Test__ZN3ccc9CC11x10y9E, "_ZN3ccc9CC11x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x10y9C1Ev();
extern void _ZN3ccc9CC11x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x10y9E[] = {
  NSPAIR(_ZN3ccc9CC11x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC11x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y9E[];
extern void _ZN3ccc9CC11x10y93pqrEv();
extern void _ZN3ccc9CC11x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x10y93pqrEv,_ZThn4_N3ccc9CC11x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x10y93pqrEv,_ZThn4_N3ccc9CC11x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x10y9E[];
Class_Descriptor cd__ZN3ccc9CC11x10y9E = {  "_ZN3ccc9CC11x10y9E", // class name
  bases__ZN3ccc9CC11x10y9E, 2,
  &(vtc__ZN3ccc9CC11x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x10y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y10  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC11x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x10y103abcEv
  ~CC11x10y10(); // tgen
  CC11x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y10E) C1{ BC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x10y103pqrEv");}
void  ccc::CC11x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x10y103abcEv");}
ccc::CC11x10y10 ::~CC11x10y10(){ note_dtor("_ZN3ccc10CC11x10y10E", this);} // tgen
ccc::CC11x10y10 ::CC11x10y10(){ note_ctor("_ZN3ccc10CC11x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y10E, buf);
    ::ccc::CC11x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y10E);
    dp->::ccc::CC11x10y10::~CC11x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y10E(Test__ZN3ccc10CC11x10y10E, "_ZN3ccc10CC11x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y10C1Ev();
extern void _ZN3ccc10CC11x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y10E[] = {
  NSPAIR(_ZN3ccc10CC11x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y10E[];
extern void _ZN3ccc10CC11x10y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x10y103pqrEv,_ZThn4_N3ccc10CC11x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC11x10y103abcEv,_ZThn4_N3ccc10CC11x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x10y103pqrEv,_ZThn4_N3ccc10CC11x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x10y103abcEv,_ZThn4_N3ccc10CC11x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y10E[];
Class_Descriptor cd__ZN3ccc10CC11x10y10E = {  "_ZN3ccc10CC11x10y10E", // class name
  bases__ZN3ccc10CC11x10y10E, 2,
  &(vtc__ZN3ccc10CC11x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y11  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC11x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x10y113efgEv
  ~CC11x10y11(); // tgen
  CC11x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y11E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x10y113pqrEv");}
void  ccc::CC11x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x10y113efgEv");}
ccc::CC11x10y11 ::~CC11x10y11(){ note_dtor("_ZN3ccc10CC11x10y11E", this);} // tgen
ccc::CC11x10y11 ::CC11x10y11(){ note_ctor("_ZN3ccc10CC11x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y11E, buf);
    ::ccc::CC11x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y11E);
    dp->::ccc::CC11x10y11::~CC11x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y11E(Test__ZN3ccc10CC11x10y11E, "_ZN3ccc10CC11x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y11C1Ev();
extern void _ZN3ccc10CC11x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y11E[] = {
  NSPAIR(_ZN3ccc10CC11x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y11E[];
extern void _ZN3ccc10CC11x10y113pqrEv();
extern void _ZN3ccc10CC11x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x10y113pqrEv,_ZThn4_N3ccc10CC11x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x10y113pqrEv,_ZThn4_N3ccc10CC11x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y11E[];
Class_Descriptor cd__ZN3ccc10CC11x10y11E = {  "_ZN3ccc10CC11x10y11E", // class name
  bases__ZN3ccc10CC11x10y11E, 2,
  &(vtc__ZN3ccc10CC11x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y12  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC11x10y123abcEv
  ~CC11x10y12(); // tgen
  CC11x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y12E) C1{ BC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC11x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x10y123abcEv");}
ccc::CC11x10y12 ::~CC11x10y12(){ note_dtor("_ZN3ccc10CC11x10y12E", this);} // tgen
ccc::CC11x10y12 ::CC11x10y12(){ note_ctor("_ZN3ccc10CC11x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y12E, buf);
    ::ccc::CC11x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y12E);
    dp->::ccc::CC11x10y12::~CC11x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y12E(Test__ZN3ccc10CC11x10y12E, "_ZN3ccc10CC11x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y12C1Ev();
extern void _ZN3ccc10CC11x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y12E[] = {
  NSPAIR(_ZN3ccc10CC11x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x10y123abcEv,_ZThn4_N3ccc10CC11x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x10y123abcEv,_ZThn4_N3ccc10CC11x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y12E[];
Class_Descriptor cd__ZN3ccc10CC11x10y12E = {  "_ZN3ccc10CC11x10y12E", // class name
  bases__ZN3ccc10CC11x10y12E, 2,
  &(vtc__ZN3ccc10CC11x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y13  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC11x10y133efgEv
  ~CC11x10y13(); // tgen
  CC11x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y13E) C1{ BC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC11x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x10y133efgEv");}
ccc::CC11x10y13 ::~CC11x10y13(){ note_dtor("_ZN3ccc10CC11x10y13E", this);} // tgen
ccc::CC11x10y13 ::CC11x10y13(){ note_ctor("_ZN3ccc10CC11x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y13E, buf);
    ::ccc::CC11x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y13E);
    dp->::ccc::CC11x10y13::~CC11x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y13E(Test__ZN3ccc10CC11x10y13E, "_ZN3ccc10CC11x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y13C1Ev();
extern void _ZN3ccc10CC11x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y13E[] = {
  NSPAIR(_ZN3ccc10CC11x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y13E[];
Class_Descriptor cd__ZN3ccc10CC11x10y13E = {  "_ZN3ccc10CC11x10y13E", // class name
  bases__ZN3ccc10CC11x10y13E, 2,
  &(vtc__ZN3ccc10CC11x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y14  : ::ccc::AA11 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC11x10y143pqrEv
  ~CC11x10y14(); // tgen
  CC11x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y14E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC11x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x10y143pqrEv");}
ccc::CC11x10y14 ::~CC11x10y14(){ note_dtor("_ZN3ccc10CC11x10y14E", this);} // tgen
ccc::CC11x10y14 ::CC11x10y14(){ note_ctor("_ZN3ccc10CC11x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y14E, buf);
    ::ccc::CC11x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y14E);
    dp->::ccc::CC11x10y14::~CC11x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y14E(Test__ZN3ccc10CC11x10y14E, "_ZN3ccc10CC11x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y14C1Ev();
extern void _ZN3ccc10CC11x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y14E[] = {
  NSPAIR(_ZN3ccc10CC11x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y14E[];
extern void _ZN3ccc10CC11x10y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x10y143pqrEv,_ZThn4_N3ccc10CC11x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x10y143pqrEv,_ZThn4_N3ccc10CC11x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y14E[];
Class_Descriptor cd__ZN3ccc10CC11x10y14E = {  "_ZN3ccc10CC11x10y14E", // class name
  bases__ZN3ccc10CC11x10y14E, 2,
  &(vtc__ZN3ccc10CC11x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x10y15  : ::ccc::AA11 , ::ccc::BB10 {
  ~CC11x10y15(); // tgen
  CC11x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x10y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x10y15 ::~CC11x10y15(){ note_dtor("_ZN3ccc10CC11x10y15E", this);} // tgen
ccc::CC11x10y15 ::CC11x10y15(){ note_ctor("_ZN3ccc10CC11x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x10y15E, buf);
    ::ccc::CC11x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x10y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC11x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x10y15E);
    dp->::ccc::CC11x10y15::~CC11x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x10y15E(Test__ZN3ccc10CC11x10y15E, "_ZN3ccc10CC11x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x10y15C1Ev();
extern void _ZN3ccc10CC11x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x10y15E[] = {
  NSPAIR(_ZN3ccc10CC11x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC11x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x10y15E[];
Class_Descriptor cd__ZN3ccc10CC11x10y15E = {  "_ZN3ccc10CC11x10y15E", // class name
  bases__ZN3ccc10CC11x10y15E, 2,
  &(vtc__ZN3ccc10CC11x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x10y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y0  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC11x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y03pqrEv
  ~CC11x11y0(); // tgen
  CC11x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y0E) C1{ BC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y03abcEv");}
void  ccc::CC11x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y03efgEv");}
void  ccc::CC11x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y03pqrEv");}
ccc::CC11x11y0 ::~CC11x11y0(){ note_dtor("_ZN3ccc9CC11x11y0E", this);} // tgen
ccc::CC11x11y0 ::CC11x11y0(){ note_ctor("_ZN3ccc9CC11x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y0E, buf);
    ::ccc::CC11x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y0E);
    dp->::ccc::CC11x11y0::~CC11x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y0E(Test__ZN3ccc9CC11x11y0E, "_ZN3ccc9CC11x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y0C1Ev();
extern void _ZN3ccc9CC11x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y0E[] = {
  NSPAIR(_ZN3ccc9CC11x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y0E[];
extern void _ZN3ccc9CC11x11y03pqrEv();
extern void _ZN3ccc9CC11x11y03efgEv();
extern void _ZN3ccc9CC11x11y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y03pqrEv,_ZThn4_N3ccc9CC11x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y03efgEv,_ZThn4_N3ccc9CC11x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y03pqrEv,_ZThn4_N3ccc9CC11x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y03efgEv,_ZThn4_N3ccc9CC11x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y0E[];
Class_Descriptor cd__ZN3ccc9CC11x11y0E = {  "_ZN3ccc9CC11x11y0E", // class name
  bases__ZN3ccc9CC11x11y0E, 2,
  &(vtc__ZN3ccc9CC11x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y1  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC11x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x11y13efgEv
  ~CC11x11y1(); // tgen
  CC11x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y1E) C1{ BC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y13abcEv");}
void  ccc::CC11x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y13pqrEv");}
void  ccc::CC11x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y13efgEv");}
ccc::CC11x11y1 ::~CC11x11y1(){ note_dtor("_ZN3ccc9CC11x11y1E", this);} // tgen
ccc::CC11x11y1 ::CC11x11y1(){ note_ctor("_ZN3ccc9CC11x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y1E, buf);
    ::ccc::CC11x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y1E);
    dp->::ccc::CC11x11y1::~CC11x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y1E(Test__ZN3ccc9CC11x11y1E, "_ZN3ccc9CC11x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y1C1Ev();
extern void _ZN3ccc9CC11x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y1E[] = {
  NSPAIR(_ZN3ccc9CC11x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y1E[];
extern void _ZN3ccc9CC11x11y13pqrEv();
extern void _ZN3ccc9CC11x11y13efgEv();
extern void _ZN3ccc9CC11x11y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y13pqrEv,_ZThn4_N3ccc9CC11x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y13efgEv,_ZThn4_N3ccc9CC11x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y13pqrEv,_ZThn4_N3ccc9CC11x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y13efgEv,_ZThn4_N3ccc9CC11x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y1E[];
Class_Descriptor cd__ZN3ccc9CC11x11y1E = {  "_ZN3ccc9CC11x11y1E", // class name
  bases__ZN3ccc9CC11x11y1E, 2,
  &(vtc__ZN3ccc9CC11x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y2  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC11x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y23pqrEv
  ~CC11x11y2(); // tgen
  CC11x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y2E) C1{ BC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y23efgEv");}
void  ccc::CC11x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y23abcEv");}
void  ccc::CC11x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y23pqrEv");}
ccc::CC11x11y2 ::~CC11x11y2(){ note_dtor("_ZN3ccc9CC11x11y2E", this);} // tgen
ccc::CC11x11y2 ::CC11x11y2(){ note_ctor("_ZN3ccc9CC11x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y2E, buf);
    ::ccc::CC11x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y2E);
    dp->::ccc::CC11x11y2::~CC11x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y2E(Test__ZN3ccc9CC11x11y2E, "_ZN3ccc9CC11x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y2C1Ev();
extern void _ZN3ccc9CC11x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y2E[] = {
  NSPAIR(_ZN3ccc9CC11x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y2E[];
extern void _ZN3ccc9CC11x11y23pqrEv();
extern void _ZN3ccc9CC11x11y23efgEv();
extern void _ZN3ccc9CC11x11y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y23pqrEv,_ZThn4_N3ccc9CC11x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y23efgEv,_ZThn4_N3ccc9CC11x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y23pqrEv,_ZThn4_N3ccc9CC11x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y23efgEv,_ZThn4_N3ccc9CC11x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y2E[];
Class_Descriptor cd__ZN3ccc9CC11x11y2E = {  "_ZN3ccc9CC11x11y2E", // class name
  bases__ZN3ccc9CC11x11y2E, 2,
  &(vtc__ZN3ccc9CC11x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y3  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC11x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x11y33abcEv
  ~CC11x11y3(); // tgen
  CC11x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y3E) C1{ BC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y33efgEv");}
void  ccc::CC11x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y33pqrEv");}
void  ccc::CC11x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y33abcEv");}
ccc::CC11x11y3 ::~CC11x11y3(){ note_dtor("_ZN3ccc9CC11x11y3E", this);} // tgen
ccc::CC11x11y3 ::CC11x11y3(){ note_ctor("_ZN3ccc9CC11x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y3E, buf);
    ::ccc::CC11x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y3E);
    dp->::ccc::CC11x11y3::~CC11x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y3E(Test__ZN3ccc9CC11x11y3E, "_ZN3ccc9CC11x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y3C1Ev();
extern void _ZN3ccc9CC11x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y3E[] = {
  NSPAIR(_ZN3ccc9CC11x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y3E[];
extern void _ZN3ccc9CC11x11y33pqrEv();
extern void _ZN3ccc9CC11x11y33efgEv();
extern void _ZN3ccc9CC11x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y33pqrEv,_ZThn4_N3ccc9CC11x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y33efgEv,_ZThn4_N3ccc9CC11x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y33pqrEv,_ZThn4_N3ccc9CC11x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y33efgEv,_ZThn4_N3ccc9CC11x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y3E[];
Class_Descriptor cd__ZN3ccc9CC11x11y3E = {  "_ZN3ccc9CC11x11y3E", // class name
  bases__ZN3ccc9CC11x11y3E, 2,
  &(vtc__ZN3ccc9CC11x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y4  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC11x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x11y43efgEv
  ~CC11x11y4(); // tgen
  CC11x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y4E) C1{ BC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y43pqrEv");}
void  ccc::CC11x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y43abcEv");}
void  ccc::CC11x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y43efgEv");}
ccc::CC11x11y4 ::~CC11x11y4(){ note_dtor("_ZN3ccc9CC11x11y4E", this);} // tgen
ccc::CC11x11y4 ::CC11x11y4(){ note_ctor("_ZN3ccc9CC11x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y4E, buf);
    ::ccc::CC11x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y4E);
    dp->::ccc::CC11x11y4::~CC11x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y4E(Test__ZN3ccc9CC11x11y4E, "_ZN3ccc9CC11x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y4C1Ev();
extern void _ZN3ccc9CC11x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y4E[] = {
  NSPAIR(_ZN3ccc9CC11x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y4E[];
extern void _ZN3ccc9CC11x11y43pqrEv();
extern void _ZN3ccc9CC11x11y43efgEv();
extern void _ZN3ccc9CC11x11y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y43pqrEv,_ZThn4_N3ccc9CC11x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y43efgEv,_ZThn4_N3ccc9CC11x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y43pqrEv,_ZThn4_N3ccc9CC11x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y43efgEv,_ZThn4_N3ccc9CC11x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y4E[];
Class_Descriptor cd__ZN3ccc9CC11x11y4E = {  "_ZN3ccc9CC11x11y4E", // class name
  bases__ZN3ccc9CC11x11y4E, 2,
  &(vtc__ZN3ccc9CC11x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y5  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC11x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x11y53abcEv
  ~CC11x11y5(); // tgen
  CC11x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y5E) C1{ BC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y53pqrEv");}
void  ccc::CC11x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y53efgEv");}
void  ccc::CC11x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y53abcEv");}
ccc::CC11x11y5 ::~CC11x11y5(){ note_dtor("_ZN3ccc9CC11x11y5E", this);} // tgen
ccc::CC11x11y5 ::CC11x11y5(){ note_ctor("_ZN3ccc9CC11x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y5E, buf);
    ::ccc::CC11x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y5E);
    dp->::ccc::CC11x11y5::~CC11x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y5E(Test__ZN3ccc9CC11x11y5E, "_ZN3ccc9CC11x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y5C1Ev();
extern void _ZN3ccc9CC11x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y5E[] = {
  NSPAIR(_ZN3ccc9CC11x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y5E[];
extern void _ZN3ccc9CC11x11y53pqrEv();
extern void _ZN3ccc9CC11x11y53efgEv();
extern void _ZN3ccc9CC11x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y53pqrEv,_ZThn4_N3ccc9CC11x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y53efgEv,_ZThn4_N3ccc9CC11x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y53pqrEv,_ZThn4_N3ccc9CC11x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y53efgEv,_ZThn4_N3ccc9CC11x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y5E[];
Class_Descriptor cd__ZN3ccc9CC11x11y5E = {  "_ZN3ccc9CC11x11y5E", // class name
  bases__ZN3ccc9CC11x11y5E, 2,
  &(vtc__ZN3ccc9CC11x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y6  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC11x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x11y63efgEv
  ~CC11x11y6(); // tgen
  CC11x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y6E) C1{ BC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y63abcEv");}
void  ccc::CC11x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y63efgEv");}
ccc::CC11x11y6 ::~CC11x11y6(){ note_dtor("_ZN3ccc9CC11x11y6E", this);} // tgen
ccc::CC11x11y6 ::CC11x11y6(){ note_ctor("_ZN3ccc9CC11x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y6E, buf);
    ::ccc::CC11x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y6E);
    dp->::ccc::CC11x11y6::~CC11x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y6E(Test__ZN3ccc9CC11x11y6E, "_ZN3ccc9CC11x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y6C1Ev();
extern void _ZN3ccc9CC11x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y6E[] = {
  NSPAIR(_ZN3ccc9CC11x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x11y63efgEv();
extern void _ZN3ccc9CC11x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y63efgEv,_ZThn4_N3ccc9CC11x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y63efgEv,_ZThn4_N3ccc9CC11x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y6E[];
Class_Descriptor cd__ZN3ccc9CC11x11y6E = {  "_ZN3ccc9CC11x11y6E", // class name
  bases__ZN3ccc9CC11x11y6E, 2,
  &(vtc__ZN3ccc9CC11x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y7  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC11x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y73pqrEv
  ~CC11x11y7(); // tgen
  CC11x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y7E) C1{ BC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y73abcEv");}
void  ccc::CC11x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y73pqrEv");}
ccc::CC11x11y7 ::~CC11x11y7(){ note_dtor("_ZN3ccc9CC11x11y7E", this);} // tgen
ccc::CC11x11y7 ::CC11x11y7(){ note_ctor("_ZN3ccc9CC11x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y7E, buf);
    ::ccc::CC11x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y7E);
    dp->::ccc::CC11x11y7::~CC11x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y7E(Test__ZN3ccc9CC11x11y7E, "_ZN3ccc9CC11x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y7C1Ev();
extern void _ZN3ccc9CC11x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y7E[] = {
  NSPAIR(_ZN3ccc9CC11x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y7E[];
extern void _ZN3ccc9CC11x11y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y73pqrEv,_ZThn4_N3ccc9CC11x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y73pqrEv,_ZThn4_N3ccc9CC11x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y7E[];
Class_Descriptor cd__ZN3ccc9CC11x11y7E = {  "_ZN3ccc9CC11x11y7E", // class name
  bases__ZN3ccc9CC11x11y7E, 2,
  &(vtc__ZN3ccc9CC11x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y8  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC11x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x11y83abcEv
  ~CC11x11y8(); // tgen
  CC11x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y8E) C1{ BC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y83efgEv");}
void  ccc::CC11x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x11y83abcEv");}
ccc::CC11x11y8 ::~CC11x11y8(){ note_dtor("_ZN3ccc9CC11x11y8E", this);} // tgen
ccc::CC11x11y8 ::CC11x11y8(){ note_ctor("_ZN3ccc9CC11x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y8E, buf);
    ::ccc::CC11x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y8E);
    dp->::ccc::CC11x11y8::~CC11x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y8E(Test__ZN3ccc9CC11x11y8E, "_ZN3ccc9CC11x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y8C1Ev();
extern void _ZN3ccc9CC11x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y8E[] = {
  NSPAIR(_ZN3ccc9CC11x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x11y83efgEv();
extern void _ZN3ccc9CC11x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y83efgEv,_ZThn4_N3ccc9CC11x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y83efgEv,_ZThn4_N3ccc9CC11x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y8E[];
Class_Descriptor cd__ZN3ccc9CC11x11y8E = {  "_ZN3ccc9CC11x11y8E", // class name
  bases__ZN3ccc9CC11x11y8E, 2,
  &(vtc__ZN3ccc9CC11x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y9  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC11x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x11y93pqrEv
  ~CC11x11y9(); // tgen
  CC11x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x11y9E) C1{ BC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x11y93efgEv");}
void  ccc::CC11x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x11y93pqrEv");}
ccc::CC11x11y9 ::~CC11x11y9(){ note_dtor("_ZN3ccc9CC11x11y9E", this);} // tgen
ccc::CC11x11y9 ::CC11x11y9(){ note_ctor("_ZN3ccc9CC11x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x11y9E, buf);
    ::ccc::CC11x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x11y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC11x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x11y9E);
    dp->::ccc::CC11x11y9::~CC11x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x11y9E(Test__ZN3ccc9CC11x11y9E, "_ZN3ccc9CC11x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x11y9C1Ev();
extern void _ZN3ccc9CC11x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x11y9E[] = {
  NSPAIR(_ZN3ccc9CC11x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC11x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y9E[];
extern void _ZN3ccc9CC11x11y93pqrEv();
extern void _ZN3ccc9CC11x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y93pqrEv,_ZThn4_N3ccc9CC11x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC11x11y93efgEv,_ZThn4_N3ccc9CC11x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y93pqrEv,_ZThn4_N3ccc9CC11x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x11y93efgEv,_ZThn4_N3ccc9CC11x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x11y9E[];
Class_Descriptor cd__ZN3ccc9CC11x11y9E = {  "_ZN3ccc9CC11x11y9E", // class name
  bases__ZN3ccc9CC11x11y9E, 2,
  &(vtc__ZN3ccc9CC11x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x11y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y10  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC11x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x11y103abcEv
  ~CC11x11y10(); // tgen
  CC11x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y10E) C1{ BC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x11y103pqrEv");}
void  ccc::CC11x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x11y103abcEv");}
ccc::CC11x11y10 ::~CC11x11y10(){ note_dtor("_ZN3ccc10CC11x11y10E", this);} // tgen
ccc::CC11x11y10 ::CC11x11y10(){ note_ctor("_ZN3ccc10CC11x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y10E, buf);
    ::ccc::CC11x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y10E);
    dp->::ccc::CC11x11y10::~CC11x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y10E(Test__ZN3ccc10CC11x11y10E, "_ZN3ccc10CC11x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y10C1Ev();
extern void _ZN3ccc10CC11x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y10E[] = {
  NSPAIR(_ZN3ccc10CC11x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y10E[];
extern void _ZN3ccc10CC11x11y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x11y103pqrEv,_ZThn4_N3ccc10CC11x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x11y103pqrEv,_ZThn4_N3ccc10CC11x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y10E[];
Class_Descriptor cd__ZN3ccc10CC11x11y10E = {  "_ZN3ccc10CC11x11y10E", // class name
  bases__ZN3ccc10CC11x11y10E, 2,
  &(vtc__ZN3ccc10CC11x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y11  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC11x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x11y113efgEv
  ~CC11x11y11(); // tgen
  CC11x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y11E) C1{ BC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x11y113pqrEv");}
void  ccc::CC11x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x11y113efgEv");}
ccc::CC11x11y11 ::~CC11x11y11(){ note_dtor("_ZN3ccc10CC11x11y11E", this);} // tgen
ccc::CC11x11y11 ::CC11x11y11(){ note_ctor("_ZN3ccc10CC11x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y11E, buf);
    ::ccc::CC11x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y11E);
    dp->::ccc::CC11x11y11::~CC11x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y11E(Test__ZN3ccc10CC11x11y11E, "_ZN3ccc10CC11x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y11C1Ev();
extern void _ZN3ccc10CC11x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y11E[] = {
  NSPAIR(_ZN3ccc10CC11x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y11E[];
extern void _ZN3ccc10CC11x11y113pqrEv();
extern void _ZN3ccc10CC11x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x11y113pqrEv,_ZThn4_N3ccc10CC11x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC11x11y113efgEv,_ZThn4_N3ccc10CC11x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x11y113pqrEv,_ZThn4_N3ccc10CC11x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x11y113efgEv,_ZThn4_N3ccc10CC11x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y11E[];
Class_Descriptor cd__ZN3ccc10CC11x11y11E = {  "_ZN3ccc10CC11x11y11E", // class name
  bases__ZN3ccc10CC11x11y11E, 2,
  &(vtc__ZN3ccc10CC11x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y12  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC11x11y123abcEv
  ~CC11x11y12(); // tgen
  CC11x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y12E) C1{ BC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC11x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x11y123abcEv");}
ccc::CC11x11y12 ::~CC11x11y12(){ note_dtor("_ZN3ccc10CC11x11y12E", this);} // tgen
ccc::CC11x11y12 ::CC11x11y12(){ note_ctor("_ZN3ccc10CC11x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y12E, buf);
    ::ccc::CC11x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y12E);
    dp->::ccc::CC11x11y12::~CC11x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y12E(Test__ZN3ccc10CC11x11y12E, "_ZN3ccc10CC11x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y12C1Ev();
extern void _ZN3ccc10CC11x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y12E[] = {
  NSPAIR(_ZN3ccc10CC11x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y12E[];
Class_Descriptor cd__ZN3ccc10CC11x11y12E = {  "_ZN3ccc10CC11x11y12E", // class name
  bases__ZN3ccc10CC11x11y12E, 2,
  &(vtc__ZN3ccc10CC11x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y13  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC11x11y133efgEv
  ~CC11x11y13(); // tgen
  CC11x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y13E) C1{ BC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC11x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x11y133efgEv");}
ccc::CC11x11y13 ::~CC11x11y13(){ note_dtor("_ZN3ccc10CC11x11y13E", this);} // tgen
ccc::CC11x11y13 ::CC11x11y13(){ note_ctor("_ZN3ccc10CC11x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y13E, buf);
    ::ccc::CC11x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y13E);
    dp->::ccc::CC11x11y13::~CC11x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y13E(Test__ZN3ccc10CC11x11y13E, "_ZN3ccc10CC11x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y13C1Ev();
extern void _ZN3ccc10CC11x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y13E[] = {
  NSPAIR(_ZN3ccc10CC11x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x11y133efgEv,_ZThn4_N3ccc10CC11x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x11y133efgEv,_ZThn4_N3ccc10CC11x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y13E[];
Class_Descriptor cd__ZN3ccc10CC11x11y13E = {  "_ZN3ccc10CC11x11y13E", // class name
  bases__ZN3ccc10CC11x11y13E, 2,
  &(vtc__ZN3ccc10CC11x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y14  : ::ccc::AA11 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC11x11y143pqrEv
  ~CC11x11y14(); // tgen
  CC11x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y14E) C1{ BC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC11x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x11y143pqrEv");}
ccc::CC11x11y14 ::~CC11x11y14(){ note_dtor("_ZN3ccc10CC11x11y14E", this);} // tgen
ccc::CC11x11y14 ::CC11x11y14(){ note_ctor("_ZN3ccc10CC11x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y14E, buf);
    ::ccc::CC11x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y14E);
    dp->::ccc::CC11x11y14::~CC11x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y14E(Test__ZN3ccc10CC11x11y14E, "_ZN3ccc10CC11x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y14C1Ev();
extern void _ZN3ccc10CC11x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y14E[] = {
  NSPAIR(_ZN3ccc10CC11x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y14E[];
extern void _ZN3ccc10CC11x11y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x11y143pqrEv,_ZThn4_N3ccc10CC11x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x11y143pqrEv,_ZThn4_N3ccc10CC11x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y14E[];
Class_Descriptor cd__ZN3ccc10CC11x11y14E = {  "_ZN3ccc10CC11x11y14E", // class name
  bases__ZN3ccc10CC11x11y14E, 2,
  &(vtc__ZN3ccc10CC11x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x11y15  : ::ccc::AA11 , ::ccc::BB11 {
  ~CC11x11y15(); // tgen
  CC11x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x11y15E) C1{ BC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC11x11y15 ::~CC11x11y15(){ note_dtor("_ZN3ccc10CC11x11y15E", this);} // tgen
ccc::CC11x11y15 ::CC11x11y15(){ note_ctor("_ZN3ccc10CC11x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x11y15E, buf);
    ::ccc::CC11x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x11y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC11x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x11y15E);
    dp->::ccc::CC11x11y15::~CC11x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x11y15E(Test__ZN3ccc10CC11x11y15E, "_ZN3ccc10CC11x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x11y15C1Ev();
extern void _ZN3ccc10CC11x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x11y15E[] = {
  NSPAIR(_ZN3ccc10CC11x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC11x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x11y15E[];
Class_Descriptor cd__ZN3ccc10CC11x11y15E = {  "_ZN3ccc10CC11x11y15E", // class name
  bases__ZN3ccc10CC11x11y15E, 2,
  &(vtc__ZN3ccc10CC11x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x11y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y0  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC11x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y03pqrEv
  ~CC11x12y0(); // tgen
  CC11x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y0E) C1{ BC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y03abcEv");}
void  ccc::CC11x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y03efgEv");}
void  ccc::CC11x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y03pqrEv");}
ccc::CC11x12y0 ::~CC11x12y0(){ note_dtor("_ZN3ccc9CC11x12y0E", this);} // tgen
ccc::CC11x12y0 ::CC11x12y0(){ note_ctor("_ZN3ccc9CC11x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y0E, buf);
    ::ccc::CC11x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y0E);
    dp->::ccc::CC11x12y0::~CC11x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y0E(Test__ZN3ccc9CC11x12y0E, "_ZN3ccc9CC11x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y0C1Ev();
extern void _ZN3ccc9CC11x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y0E[] = {
  NSPAIR(_ZN3ccc9CC11x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y0E[];
extern void _ZN3ccc9CC11x12y03pqrEv();
extern void _ZN3ccc9CC11x12y03efgEv();
extern void _ZN3ccc9CC11x12y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y03abcEv,_ZThn4_N3ccc9CC11x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y03abcEv,_ZThn4_N3ccc9CC11x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y0E[];
Class_Descriptor cd__ZN3ccc9CC11x12y0E = {  "_ZN3ccc9CC11x12y0E", // class name
  bases__ZN3ccc9CC11x12y0E, 2,
  &(vtc__ZN3ccc9CC11x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y1  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC11x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x12y13efgEv
  ~CC11x12y1(); // tgen
  CC11x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y1E) C1{ BC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y13abcEv");}
void  ccc::CC11x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y13pqrEv");}
void  ccc::CC11x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y13efgEv");}
ccc::CC11x12y1 ::~CC11x12y1(){ note_dtor("_ZN3ccc9CC11x12y1E", this);} // tgen
ccc::CC11x12y1 ::CC11x12y1(){ note_ctor("_ZN3ccc9CC11x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y1E, buf);
    ::ccc::CC11x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y1E);
    dp->::ccc::CC11x12y1::~CC11x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y1E(Test__ZN3ccc9CC11x12y1E, "_ZN3ccc9CC11x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y1C1Ev();
extern void _ZN3ccc9CC11x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y1E[] = {
  NSPAIR(_ZN3ccc9CC11x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y1E[];
extern void _ZN3ccc9CC11x12y13pqrEv();
extern void _ZN3ccc9CC11x12y13efgEv();
extern void _ZN3ccc9CC11x12y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y13abcEv,_ZThn4_N3ccc9CC11x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y13abcEv,_ZThn4_N3ccc9CC11x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y1E[];
Class_Descriptor cd__ZN3ccc9CC11x12y1E = {  "_ZN3ccc9CC11x12y1E", // class name
  bases__ZN3ccc9CC11x12y1E, 2,
  &(vtc__ZN3ccc9CC11x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y2  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC11x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y23pqrEv
  ~CC11x12y2(); // tgen
  CC11x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y2E) C1{ BC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y23efgEv");}
void  ccc::CC11x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y23abcEv");}
void  ccc::CC11x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y23pqrEv");}
ccc::CC11x12y2 ::~CC11x12y2(){ note_dtor("_ZN3ccc9CC11x12y2E", this);} // tgen
ccc::CC11x12y2 ::CC11x12y2(){ note_ctor("_ZN3ccc9CC11x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y2E, buf);
    ::ccc::CC11x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y2E);
    dp->::ccc::CC11x12y2::~CC11x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y2E(Test__ZN3ccc9CC11x12y2E, "_ZN3ccc9CC11x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y2C1Ev();
extern void _ZN3ccc9CC11x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y2E[] = {
  NSPAIR(_ZN3ccc9CC11x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y2E[];
extern void _ZN3ccc9CC11x12y23pqrEv();
extern void _ZN3ccc9CC11x12y23efgEv();
extern void _ZN3ccc9CC11x12y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y23abcEv,_ZThn4_N3ccc9CC11x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y23abcEv,_ZThn4_N3ccc9CC11x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y2E[];
Class_Descriptor cd__ZN3ccc9CC11x12y2E = {  "_ZN3ccc9CC11x12y2E", // class name
  bases__ZN3ccc9CC11x12y2E, 2,
  &(vtc__ZN3ccc9CC11x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y3  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC11x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x12y33abcEv
  ~CC11x12y3(); // tgen
  CC11x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y3E) C1{ BC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y33efgEv");}
void  ccc::CC11x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y33pqrEv");}
void  ccc::CC11x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y33abcEv");}
ccc::CC11x12y3 ::~CC11x12y3(){ note_dtor("_ZN3ccc9CC11x12y3E", this);} // tgen
ccc::CC11x12y3 ::CC11x12y3(){ note_ctor("_ZN3ccc9CC11x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y3E, buf);
    ::ccc::CC11x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y3E);
    dp->::ccc::CC11x12y3::~CC11x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y3E(Test__ZN3ccc9CC11x12y3E, "_ZN3ccc9CC11x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y3C1Ev();
extern void _ZN3ccc9CC11x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y3E[] = {
  NSPAIR(_ZN3ccc9CC11x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y3E[];
extern void _ZN3ccc9CC11x12y33pqrEv();
extern void _ZN3ccc9CC11x12y33efgEv();
extern void _ZN3ccc9CC11x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y33abcEv,_ZThn4_N3ccc9CC11x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y33abcEv,_ZThn4_N3ccc9CC11x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y3E[];
Class_Descriptor cd__ZN3ccc9CC11x12y3E = {  "_ZN3ccc9CC11x12y3E", // class name
  bases__ZN3ccc9CC11x12y3E, 2,
  &(vtc__ZN3ccc9CC11x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y4  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC11x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x12y43efgEv
  ~CC11x12y4(); // tgen
  CC11x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y4E) C1{ BC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y43pqrEv");}
void  ccc::CC11x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y43abcEv");}
void  ccc::CC11x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y43efgEv");}
ccc::CC11x12y4 ::~CC11x12y4(){ note_dtor("_ZN3ccc9CC11x12y4E", this);} // tgen
ccc::CC11x12y4 ::CC11x12y4(){ note_ctor("_ZN3ccc9CC11x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y4E, buf);
    ::ccc::CC11x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y4E);
    dp->::ccc::CC11x12y4::~CC11x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y4E(Test__ZN3ccc9CC11x12y4E, "_ZN3ccc9CC11x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y4C1Ev();
extern void _ZN3ccc9CC11x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y4E[] = {
  NSPAIR(_ZN3ccc9CC11x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y4E[];
extern void _ZN3ccc9CC11x12y43pqrEv();
extern void _ZN3ccc9CC11x12y43efgEv();
extern void _ZN3ccc9CC11x12y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y43abcEv,_ZThn4_N3ccc9CC11x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y43abcEv,_ZThn4_N3ccc9CC11x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y4E[];
Class_Descriptor cd__ZN3ccc9CC11x12y4E = {  "_ZN3ccc9CC11x12y4E", // class name
  bases__ZN3ccc9CC11x12y4E, 2,
  &(vtc__ZN3ccc9CC11x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y5  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC11x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x12y53abcEv
  ~CC11x12y5(); // tgen
  CC11x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y5E) C1{ BC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y53pqrEv");}
void  ccc::CC11x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y53efgEv");}
void  ccc::CC11x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y53abcEv");}
ccc::CC11x12y5 ::~CC11x12y5(){ note_dtor("_ZN3ccc9CC11x12y5E", this);} // tgen
ccc::CC11x12y5 ::CC11x12y5(){ note_ctor("_ZN3ccc9CC11x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y5E, buf);
    ::ccc::CC11x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y5E);
    dp->::ccc::CC11x12y5::~CC11x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y5E(Test__ZN3ccc9CC11x12y5E, "_ZN3ccc9CC11x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y5C1Ev();
extern void _ZN3ccc9CC11x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y5E[] = {
  NSPAIR(_ZN3ccc9CC11x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y5E[];
extern void _ZN3ccc9CC11x12y53pqrEv();
extern void _ZN3ccc9CC11x12y53efgEv();
extern void _ZN3ccc9CC11x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y53abcEv,_ZThn4_N3ccc9CC11x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y53abcEv,_ZThn4_N3ccc9CC11x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y5E[];
Class_Descriptor cd__ZN3ccc9CC11x12y5E = {  "_ZN3ccc9CC11x12y5E", // class name
  bases__ZN3ccc9CC11x12y5E, 2,
  &(vtc__ZN3ccc9CC11x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y6  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC11x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x12y63efgEv
  ~CC11x12y6(); // tgen
  CC11x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y6E) C1{ BC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y63abcEv");}
void  ccc::CC11x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y63efgEv");}
ccc::CC11x12y6 ::~CC11x12y6(){ note_dtor("_ZN3ccc9CC11x12y6E", this);} // tgen
ccc::CC11x12y6 ::CC11x12y6(){ note_ctor("_ZN3ccc9CC11x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y6E, buf);
    ::ccc::CC11x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y6E);
    dp->::ccc::CC11x12y6::~CC11x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y6E(Test__ZN3ccc9CC11x12y6E, "_ZN3ccc9CC11x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y6C1Ev();
extern void _ZN3ccc9CC11x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y6E[] = {
  NSPAIR(_ZN3ccc9CC11x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x12y63efgEv();
extern void _ZN3ccc9CC11x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y63abcEv,_ZThn4_N3ccc9CC11x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y63abcEv,_ZThn4_N3ccc9CC11x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y6E[];
Class_Descriptor cd__ZN3ccc9CC11x12y6E = {  "_ZN3ccc9CC11x12y6E", // class name
  bases__ZN3ccc9CC11x12y6E, 2,
  &(vtc__ZN3ccc9CC11x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y7  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC11x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y73pqrEv
  ~CC11x12y7(); // tgen
  CC11x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y7E) C1{ BC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y73abcEv");}
void  ccc::CC11x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y73pqrEv");}
ccc::CC11x12y7 ::~CC11x12y7(){ note_dtor("_ZN3ccc9CC11x12y7E", this);} // tgen
ccc::CC11x12y7 ::CC11x12y7(){ note_ctor("_ZN3ccc9CC11x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y7E, buf);
    ::ccc::CC11x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y7E);
    dp->::ccc::CC11x12y7::~CC11x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y7E(Test__ZN3ccc9CC11x12y7E, "_ZN3ccc9CC11x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y7C1Ev();
extern void _ZN3ccc9CC11x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y7E[] = {
  NSPAIR(_ZN3ccc9CC11x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y7E[];
extern void _ZN3ccc9CC11x12y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y73abcEv,_ZThn4_N3ccc9CC11x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y73abcEv,_ZThn4_N3ccc9CC11x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y7E[];
Class_Descriptor cd__ZN3ccc9CC11x12y7E = {  "_ZN3ccc9CC11x12y7E", // class name
  bases__ZN3ccc9CC11x12y7E, 2,
  &(vtc__ZN3ccc9CC11x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y8  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC11x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x12y83abcEv
  ~CC11x12y8(); // tgen
  CC11x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y8E) C1{ BC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y83efgEv");}
void  ccc::CC11x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x12y83abcEv");}
ccc::CC11x12y8 ::~CC11x12y8(){ note_dtor("_ZN3ccc9CC11x12y8E", this);} // tgen
ccc::CC11x12y8 ::CC11x12y8(){ note_ctor("_ZN3ccc9CC11x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y8E, buf);
    ::ccc::CC11x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y8E);
    dp->::ccc::CC11x12y8::~CC11x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y8E(Test__ZN3ccc9CC11x12y8E, "_ZN3ccc9CC11x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y8C1Ev();
extern void _ZN3ccc9CC11x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y8E[] = {
  NSPAIR(_ZN3ccc9CC11x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x12y83efgEv();
extern void _ZN3ccc9CC11x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x12y83abcEv,_ZThn4_N3ccc9CC11x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x12y83abcEv,_ZThn4_N3ccc9CC11x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y8E[];
Class_Descriptor cd__ZN3ccc9CC11x12y8E = {  "_ZN3ccc9CC11x12y8E", // class name
  bases__ZN3ccc9CC11x12y8E, 2,
  &(vtc__ZN3ccc9CC11x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y9  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC11x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x12y93pqrEv
  ~CC11x12y9(); // tgen
  CC11x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x12y9E) C1{ BC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x12y93efgEv");}
void  ccc::CC11x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x12y93pqrEv");}
ccc::CC11x12y9 ::~CC11x12y9(){ note_dtor("_ZN3ccc9CC11x12y9E", this);} // tgen
ccc::CC11x12y9 ::CC11x12y9(){ note_ctor("_ZN3ccc9CC11x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x12y9E, buf);
    ::ccc::CC11x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x12y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC11x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x12y9E);
    dp->::ccc::CC11x12y9::~CC11x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x12y9E(Test__ZN3ccc9CC11x12y9E, "_ZN3ccc9CC11x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x12y9C1Ev();
extern void _ZN3ccc9CC11x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x12y9E[] = {
  NSPAIR(_ZN3ccc9CC11x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC11x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y9E[];
extern void _ZN3ccc9CC11x12y93pqrEv();
extern void _ZN3ccc9CC11x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x12y9E[];
Class_Descriptor cd__ZN3ccc9CC11x12y9E = {  "_ZN3ccc9CC11x12y9E", // class name
  bases__ZN3ccc9CC11x12y9E, 2,
  &(vtc__ZN3ccc9CC11x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x12y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y10  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC11x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x12y103abcEv
  ~CC11x12y10(); // tgen
  CC11x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y10E) C1{ BC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x12y103pqrEv");}
void  ccc::CC11x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x12y103abcEv");}
ccc::CC11x12y10 ::~CC11x12y10(){ note_dtor("_ZN3ccc10CC11x12y10E", this);} // tgen
ccc::CC11x12y10 ::CC11x12y10(){ note_ctor("_ZN3ccc10CC11x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y10E, buf);
    ::ccc::CC11x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y10E);
    dp->::ccc::CC11x12y10::~CC11x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y10E(Test__ZN3ccc10CC11x12y10E, "_ZN3ccc10CC11x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y10C1Ev();
extern void _ZN3ccc10CC11x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y10E[] = {
  NSPAIR(_ZN3ccc10CC11x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y10E[];
extern void _ZN3ccc10CC11x12y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x12y103abcEv,_ZThn4_N3ccc10CC11x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x12y103abcEv,_ZThn4_N3ccc10CC11x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y10E[];
Class_Descriptor cd__ZN3ccc10CC11x12y10E = {  "_ZN3ccc10CC11x12y10E", // class name
  bases__ZN3ccc10CC11x12y10E, 2,
  &(vtc__ZN3ccc10CC11x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y11  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC11x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x12y113efgEv
  ~CC11x12y11(); // tgen
  CC11x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y11E) C1{ BC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC11x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x12y113pqrEv");}
void  ccc::CC11x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x12y113efgEv");}
ccc::CC11x12y11 ::~CC11x12y11(){ note_dtor("_ZN3ccc10CC11x12y11E", this);} // tgen
ccc::CC11x12y11 ::CC11x12y11(){ note_ctor("_ZN3ccc10CC11x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y11E, buf);
    ::ccc::CC11x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y11E);
    dp->::ccc::CC11x12y11::~CC11x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y11E(Test__ZN3ccc10CC11x12y11E, "_ZN3ccc10CC11x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y11C1Ev();
extern void _ZN3ccc10CC11x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y11E[] = {
  NSPAIR(_ZN3ccc10CC11x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y11E[];
extern void _ZN3ccc10CC11x12y113pqrEv();
extern void _ZN3ccc10CC11x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y11E[];
Class_Descriptor cd__ZN3ccc10CC11x12y11E = {  "_ZN3ccc10CC11x12y11E", // class name
  bases__ZN3ccc10CC11x12y11E, 2,
  &(vtc__ZN3ccc10CC11x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y12  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC11x12y123abcEv
  ~CC11x12y12(); // tgen
  CC11x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y12E) C1{ BC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC11x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x12y123abcEv");}
ccc::CC11x12y12 ::~CC11x12y12(){ note_dtor("_ZN3ccc10CC11x12y12E", this);} // tgen
ccc::CC11x12y12 ::CC11x12y12(){ note_ctor("_ZN3ccc10CC11x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y12E, buf);
    ::ccc::CC11x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y12E);
    dp->::ccc::CC11x12y12::~CC11x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y12E(Test__ZN3ccc10CC11x12y12E, "_ZN3ccc10CC11x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y12C1Ev();
extern void _ZN3ccc10CC11x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y12E[] = {
  NSPAIR(_ZN3ccc10CC11x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x12y123abcEv,_ZThn4_N3ccc10CC11x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x12y123abcEv,_ZThn4_N3ccc10CC11x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y12E[];
Class_Descriptor cd__ZN3ccc10CC11x12y12E = {  "_ZN3ccc10CC11x12y12E", // class name
  bases__ZN3ccc10CC11x12y12E, 2,
  &(vtc__ZN3ccc10CC11x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y13  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC11x12y133efgEv
  ~CC11x12y13(); // tgen
  CC11x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y13E) C1{ BC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC11x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x12y133efgEv");}
ccc::CC11x12y13 ::~CC11x12y13(){ note_dtor("_ZN3ccc10CC11x12y13E", this);} // tgen
ccc::CC11x12y13 ::CC11x12y13(){ note_ctor("_ZN3ccc10CC11x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y13E, buf);
    ::ccc::CC11x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y13E);
    dp->::ccc::CC11x12y13::~CC11x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y13E(Test__ZN3ccc10CC11x12y13E, "_ZN3ccc10CC11x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y13C1Ev();
extern void _ZN3ccc10CC11x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y13E[] = {
  NSPAIR(_ZN3ccc10CC11x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y13E[];
Class_Descriptor cd__ZN3ccc10CC11x12y13E = {  "_ZN3ccc10CC11x12y13E", // class name
  bases__ZN3ccc10CC11x12y13E, 2,
  &(vtc__ZN3ccc10CC11x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y14  : ::ccc::AA11 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC11x12y143pqrEv
  ~CC11x12y14(); // tgen
  CC11x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y14E) C1{ BC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC11x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x12y143pqrEv");}
ccc::CC11x12y14 ::~CC11x12y14(){ note_dtor("_ZN3ccc10CC11x12y14E", this);} // tgen
ccc::CC11x12y14 ::CC11x12y14(){ note_ctor("_ZN3ccc10CC11x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y14E, buf);
    ::ccc::CC11x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y14E);
    dp->::ccc::CC11x12y14::~CC11x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y14E(Test__ZN3ccc10CC11x12y14E, "_ZN3ccc10CC11x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y14C1Ev();
extern void _ZN3ccc10CC11x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y14E[] = {
  NSPAIR(_ZN3ccc10CC11x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y14E[];
extern void _ZN3ccc10CC11x12y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y14E[];
Class_Descriptor cd__ZN3ccc10CC11x12y14E = {  "_ZN3ccc10CC11x12y14E", // class name
  bases__ZN3ccc10CC11x12y14E, 2,
  &(vtc__ZN3ccc10CC11x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x12y15  : ::ccc::AA11 , ::ccc::BB12 {
  ~CC11x12y15(); // tgen
  CC11x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x12y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC11x12y15 ::~CC11x12y15(){ note_dtor("_ZN3ccc10CC11x12y15E", this);} // tgen
ccc::CC11x12y15 ::CC11x12y15(){ note_ctor("_ZN3ccc10CC11x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x12y15E, buf);
    ::ccc::CC11x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x12y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC11x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x12y15E);
    dp->::ccc::CC11x12y15::~CC11x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x12y15E(Test__ZN3ccc10CC11x12y15E, "_ZN3ccc10CC11x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x12y15C1Ev();
extern void _ZN3ccc10CC11x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x12y15E[] = {
  NSPAIR(_ZN3ccc10CC11x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC11x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x12y15E[];
Class_Descriptor cd__ZN3ccc10CC11x12y15E = {  "_ZN3ccc10CC11x12y15E", // class name
  bases__ZN3ccc10CC11x12y15E, 2,
  &(vtc__ZN3ccc10CC11x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x12y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y0  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC11x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y03pqrEv
  ~CC11x13y0(); // tgen
  CC11x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y0E) C1{ BC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y03abcEv");}
void  ccc::CC11x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y03efgEv");}
void  ccc::CC11x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y03pqrEv");}
ccc::CC11x13y0 ::~CC11x13y0(){ note_dtor("_ZN3ccc9CC11x13y0E", this);} // tgen
ccc::CC11x13y0 ::CC11x13y0(){ note_ctor("_ZN3ccc9CC11x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y0E, buf);
    ::ccc::CC11x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y0E);
    dp->::ccc::CC11x13y0::~CC11x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y0E(Test__ZN3ccc9CC11x13y0E, "_ZN3ccc9CC11x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y0C1Ev();
extern void _ZN3ccc9CC11x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y0E[] = {
  NSPAIR(_ZN3ccc9CC11x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y0E[];
extern void _ZN3ccc9CC11x13y03pqrEv();
extern void _ZN3ccc9CC11x13y03efgEv();
extern void _ZN3ccc9CC11x13y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y03efgEv,_ZThn4_N3ccc9CC11x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y03efgEv,_ZThn4_N3ccc9CC11x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y0E[];
Class_Descriptor cd__ZN3ccc9CC11x13y0E = {  "_ZN3ccc9CC11x13y0E", // class name
  bases__ZN3ccc9CC11x13y0E, 2,
  &(vtc__ZN3ccc9CC11x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y1  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC11x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x13y13efgEv
  ~CC11x13y1(); // tgen
  CC11x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y1E) C1{ BC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y13abcEv");}
void  ccc::CC11x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y13pqrEv");}
void  ccc::CC11x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y13efgEv");}
ccc::CC11x13y1 ::~CC11x13y1(){ note_dtor("_ZN3ccc9CC11x13y1E", this);} // tgen
ccc::CC11x13y1 ::CC11x13y1(){ note_ctor("_ZN3ccc9CC11x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y1E, buf);
    ::ccc::CC11x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y1E);
    dp->::ccc::CC11x13y1::~CC11x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y1E(Test__ZN3ccc9CC11x13y1E, "_ZN3ccc9CC11x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y1C1Ev();
extern void _ZN3ccc9CC11x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y1E[] = {
  NSPAIR(_ZN3ccc9CC11x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y1E[];
extern void _ZN3ccc9CC11x13y13pqrEv();
extern void _ZN3ccc9CC11x13y13efgEv();
extern void _ZN3ccc9CC11x13y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y13efgEv,_ZThn4_N3ccc9CC11x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y13efgEv,_ZThn4_N3ccc9CC11x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y1E[];
Class_Descriptor cd__ZN3ccc9CC11x13y1E = {  "_ZN3ccc9CC11x13y1E", // class name
  bases__ZN3ccc9CC11x13y1E, 2,
  &(vtc__ZN3ccc9CC11x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y2  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC11x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y23pqrEv
  ~CC11x13y2(); // tgen
  CC11x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y2E) C1{ BC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y23efgEv");}
void  ccc::CC11x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y23abcEv");}
void  ccc::CC11x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y23pqrEv");}
ccc::CC11x13y2 ::~CC11x13y2(){ note_dtor("_ZN3ccc9CC11x13y2E", this);} // tgen
ccc::CC11x13y2 ::CC11x13y2(){ note_ctor("_ZN3ccc9CC11x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y2E, buf);
    ::ccc::CC11x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y2E);
    dp->::ccc::CC11x13y2::~CC11x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y2E(Test__ZN3ccc9CC11x13y2E, "_ZN3ccc9CC11x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y2C1Ev();
extern void _ZN3ccc9CC11x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y2E[] = {
  NSPAIR(_ZN3ccc9CC11x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y2E[];
extern void _ZN3ccc9CC11x13y23pqrEv();
extern void _ZN3ccc9CC11x13y23efgEv();
extern void _ZN3ccc9CC11x13y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y23efgEv,_ZThn4_N3ccc9CC11x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y23efgEv,_ZThn4_N3ccc9CC11x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y2E[];
Class_Descriptor cd__ZN3ccc9CC11x13y2E = {  "_ZN3ccc9CC11x13y2E", // class name
  bases__ZN3ccc9CC11x13y2E, 2,
  &(vtc__ZN3ccc9CC11x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y3  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC11x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x13y33abcEv
  ~CC11x13y3(); // tgen
  CC11x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y3E) C1{ BC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y33efgEv");}
void  ccc::CC11x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y33pqrEv");}
void  ccc::CC11x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y33abcEv");}
ccc::CC11x13y3 ::~CC11x13y3(){ note_dtor("_ZN3ccc9CC11x13y3E", this);} // tgen
ccc::CC11x13y3 ::CC11x13y3(){ note_ctor("_ZN3ccc9CC11x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y3E, buf);
    ::ccc::CC11x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y3E);
    dp->::ccc::CC11x13y3::~CC11x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y3E(Test__ZN3ccc9CC11x13y3E, "_ZN3ccc9CC11x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y3C1Ev();
extern void _ZN3ccc9CC11x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y3E[] = {
  NSPAIR(_ZN3ccc9CC11x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y3E[];
extern void _ZN3ccc9CC11x13y33pqrEv();
extern void _ZN3ccc9CC11x13y33efgEv();
extern void _ZN3ccc9CC11x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y33efgEv,_ZThn4_N3ccc9CC11x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y33efgEv,_ZThn4_N3ccc9CC11x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y3E[];
Class_Descriptor cd__ZN3ccc9CC11x13y3E = {  "_ZN3ccc9CC11x13y3E", // class name
  bases__ZN3ccc9CC11x13y3E, 2,
  &(vtc__ZN3ccc9CC11x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y4  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC11x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x13y43efgEv
  ~CC11x13y4(); // tgen
  CC11x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y4E) C1{ BC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y43pqrEv");}
void  ccc::CC11x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y43abcEv");}
void  ccc::CC11x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y43efgEv");}
ccc::CC11x13y4 ::~CC11x13y4(){ note_dtor("_ZN3ccc9CC11x13y4E", this);} // tgen
ccc::CC11x13y4 ::CC11x13y4(){ note_ctor("_ZN3ccc9CC11x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y4E, buf);
    ::ccc::CC11x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y4E);
    dp->::ccc::CC11x13y4::~CC11x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y4E(Test__ZN3ccc9CC11x13y4E, "_ZN3ccc9CC11x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y4C1Ev();
extern void _ZN3ccc9CC11x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y4E[] = {
  NSPAIR(_ZN3ccc9CC11x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y4E[];
extern void _ZN3ccc9CC11x13y43pqrEv();
extern void _ZN3ccc9CC11x13y43efgEv();
extern void _ZN3ccc9CC11x13y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y43efgEv,_ZThn4_N3ccc9CC11x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y43efgEv,_ZThn4_N3ccc9CC11x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y4E[];
Class_Descriptor cd__ZN3ccc9CC11x13y4E = {  "_ZN3ccc9CC11x13y4E", // class name
  bases__ZN3ccc9CC11x13y4E, 2,
  &(vtc__ZN3ccc9CC11x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y5  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC11x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x13y53abcEv
  ~CC11x13y5(); // tgen
  CC11x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y5E) C1{ BC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y53pqrEv");}
void  ccc::CC11x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y53efgEv");}
void  ccc::CC11x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y53abcEv");}
ccc::CC11x13y5 ::~CC11x13y5(){ note_dtor("_ZN3ccc9CC11x13y5E", this);} // tgen
ccc::CC11x13y5 ::CC11x13y5(){ note_ctor("_ZN3ccc9CC11x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y5E, buf);
    ::ccc::CC11x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y5E);
    dp->::ccc::CC11x13y5::~CC11x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y5E(Test__ZN3ccc9CC11x13y5E, "_ZN3ccc9CC11x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y5C1Ev();
extern void _ZN3ccc9CC11x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y5E[] = {
  NSPAIR(_ZN3ccc9CC11x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y5E[];
extern void _ZN3ccc9CC11x13y53pqrEv();
extern void _ZN3ccc9CC11x13y53efgEv();
extern void _ZN3ccc9CC11x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y53efgEv,_ZThn4_N3ccc9CC11x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y53efgEv,_ZThn4_N3ccc9CC11x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y5E[];
Class_Descriptor cd__ZN3ccc9CC11x13y5E = {  "_ZN3ccc9CC11x13y5E", // class name
  bases__ZN3ccc9CC11x13y5E, 2,
  &(vtc__ZN3ccc9CC11x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y6  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC11x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x13y63efgEv
  ~CC11x13y6(); // tgen
  CC11x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y6E) C1{ BC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y63abcEv");}
void  ccc::CC11x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y63efgEv");}
ccc::CC11x13y6 ::~CC11x13y6(){ note_dtor("_ZN3ccc9CC11x13y6E", this);} // tgen
ccc::CC11x13y6 ::CC11x13y6(){ note_ctor("_ZN3ccc9CC11x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y6E, buf);
    ::ccc::CC11x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y6E);
    dp->::ccc::CC11x13y6::~CC11x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y6E(Test__ZN3ccc9CC11x13y6E, "_ZN3ccc9CC11x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y6C1Ev();
extern void _ZN3ccc9CC11x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y6E[] = {
  NSPAIR(_ZN3ccc9CC11x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x13y63efgEv();
extern void _ZN3ccc9CC11x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y63efgEv,_ZThn4_N3ccc9CC11x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y63efgEv,_ZThn4_N3ccc9CC11x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y6E[];
Class_Descriptor cd__ZN3ccc9CC11x13y6E = {  "_ZN3ccc9CC11x13y6E", // class name
  bases__ZN3ccc9CC11x13y6E, 2,
  &(vtc__ZN3ccc9CC11x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y7  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC11x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y73pqrEv
  ~CC11x13y7(); // tgen
  CC11x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y7E) C1{ BC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y73abcEv");}
void  ccc::CC11x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y73pqrEv");}
ccc::CC11x13y7 ::~CC11x13y7(){ note_dtor("_ZN3ccc9CC11x13y7E", this);} // tgen
ccc::CC11x13y7 ::CC11x13y7(){ note_ctor("_ZN3ccc9CC11x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y7E, buf);
    ::ccc::CC11x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y7E);
    dp->::ccc::CC11x13y7::~CC11x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y7E(Test__ZN3ccc9CC11x13y7E, "_ZN3ccc9CC11x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y7C1Ev();
extern void _ZN3ccc9CC11x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y7E[] = {
  NSPAIR(_ZN3ccc9CC11x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y7E[];
extern void _ZN3ccc9CC11x13y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y7E[];
Class_Descriptor cd__ZN3ccc9CC11x13y7E = {  "_ZN3ccc9CC11x13y7E", // class name
  bases__ZN3ccc9CC11x13y7E, 2,
  &(vtc__ZN3ccc9CC11x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y8  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC11x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x13y83abcEv
  ~CC11x13y8(); // tgen
  CC11x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y8E) C1{ BC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y83efgEv");}
void  ccc::CC11x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x13y83abcEv");}
ccc::CC11x13y8 ::~CC11x13y8(){ note_dtor("_ZN3ccc9CC11x13y8E", this);} // tgen
ccc::CC11x13y8 ::CC11x13y8(){ note_ctor("_ZN3ccc9CC11x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y8E, buf);
    ::ccc::CC11x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y8E);
    dp->::ccc::CC11x13y8::~CC11x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y8E(Test__ZN3ccc9CC11x13y8E, "_ZN3ccc9CC11x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y8C1Ev();
extern void _ZN3ccc9CC11x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y8E[] = {
  NSPAIR(_ZN3ccc9CC11x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x13y83efgEv();
extern void _ZN3ccc9CC11x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y83efgEv,_ZThn4_N3ccc9CC11x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y83efgEv,_ZThn4_N3ccc9CC11x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y8E[];
Class_Descriptor cd__ZN3ccc9CC11x13y8E = {  "_ZN3ccc9CC11x13y8E", // class name
  bases__ZN3ccc9CC11x13y8E, 2,
  &(vtc__ZN3ccc9CC11x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y9  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC11x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x13y93pqrEv
  ~CC11x13y9(); // tgen
  CC11x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x13y9E) C1{ BC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x13y93efgEv");}
void  ccc::CC11x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x13y93pqrEv");}
ccc::CC11x13y9 ::~CC11x13y9(){ note_dtor("_ZN3ccc9CC11x13y9E", this);} // tgen
ccc::CC11x13y9 ::CC11x13y9(){ note_ctor("_ZN3ccc9CC11x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x13y9E, buf);
    ::ccc::CC11x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x13y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC11x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x13y9E);
    dp->::ccc::CC11x13y9::~CC11x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x13y9E(Test__ZN3ccc9CC11x13y9E, "_ZN3ccc9CC11x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x13y9C1Ev();
extern void _ZN3ccc9CC11x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x13y9E[] = {
  NSPAIR(_ZN3ccc9CC11x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC11x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y9E[];
extern void _ZN3ccc9CC11x13y93pqrEv();
extern void _ZN3ccc9CC11x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x13y93efgEv,_ZThn4_N3ccc9CC11x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x13y93efgEv,_ZThn4_N3ccc9CC11x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x13y9E[];
Class_Descriptor cd__ZN3ccc9CC11x13y9E = {  "_ZN3ccc9CC11x13y9E", // class name
  bases__ZN3ccc9CC11x13y9E, 2,
  &(vtc__ZN3ccc9CC11x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x13y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y10  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC11x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x13y103abcEv
  ~CC11x13y10(); // tgen
  CC11x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y10E) C1{ BC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x13y103pqrEv");}
void  ccc::CC11x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x13y103abcEv");}
ccc::CC11x13y10 ::~CC11x13y10(){ note_dtor("_ZN3ccc10CC11x13y10E", this);} // tgen
ccc::CC11x13y10 ::CC11x13y10(){ note_ctor("_ZN3ccc10CC11x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y10E, buf);
    ::ccc::CC11x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y10E);
    dp->::ccc::CC11x13y10::~CC11x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y10E(Test__ZN3ccc10CC11x13y10E, "_ZN3ccc10CC11x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y10C1Ev();
extern void _ZN3ccc10CC11x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y10E[] = {
  NSPAIR(_ZN3ccc10CC11x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y10E[];
extern void _ZN3ccc10CC11x13y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y10E[];
Class_Descriptor cd__ZN3ccc10CC11x13y10E = {  "_ZN3ccc10CC11x13y10E", // class name
  bases__ZN3ccc10CC11x13y10E, 2,
  &(vtc__ZN3ccc10CC11x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y11  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC11x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x13y113efgEv
  ~CC11x13y11(); // tgen
  CC11x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y11E) C1{ BC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x13y113pqrEv");}
void  ccc::CC11x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x13y113efgEv");}
ccc::CC11x13y11 ::~CC11x13y11(){ note_dtor("_ZN3ccc10CC11x13y11E", this);} // tgen
ccc::CC11x13y11 ::CC11x13y11(){ note_ctor("_ZN3ccc10CC11x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y11E, buf);
    ::ccc::CC11x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y11E);
    dp->::ccc::CC11x13y11::~CC11x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y11E(Test__ZN3ccc10CC11x13y11E, "_ZN3ccc10CC11x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y11C1Ev();
extern void _ZN3ccc10CC11x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y11E[] = {
  NSPAIR(_ZN3ccc10CC11x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y11E[];
extern void _ZN3ccc10CC11x13y113pqrEv();
extern void _ZN3ccc10CC11x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x13y113efgEv,_ZThn4_N3ccc10CC11x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x13y113efgEv,_ZThn4_N3ccc10CC11x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y11E[];
Class_Descriptor cd__ZN3ccc10CC11x13y11E = {  "_ZN3ccc10CC11x13y11E", // class name
  bases__ZN3ccc10CC11x13y11E, 2,
  &(vtc__ZN3ccc10CC11x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y12  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC11x13y123abcEv
  ~CC11x13y12(); // tgen
  CC11x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y12E) C1{ BC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC11x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x13y123abcEv");}
ccc::CC11x13y12 ::~CC11x13y12(){ note_dtor("_ZN3ccc10CC11x13y12E", this);} // tgen
ccc::CC11x13y12 ::CC11x13y12(){ note_ctor("_ZN3ccc10CC11x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y12E, buf);
    ::ccc::CC11x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y12E);
    dp->::ccc::CC11x13y12::~CC11x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y12E(Test__ZN3ccc10CC11x13y12E, "_ZN3ccc10CC11x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y12C1Ev();
extern void _ZN3ccc10CC11x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y12E[] = {
  NSPAIR(_ZN3ccc10CC11x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y12E[];
Class_Descriptor cd__ZN3ccc10CC11x13y12E = {  "_ZN3ccc10CC11x13y12E", // class name
  bases__ZN3ccc10CC11x13y12E, 2,
  &(vtc__ZN3ccc10CC11x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y13  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC11x13y133efgEv
  ~CC11x13y13(); // tgen
  CC11x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y13E) C1{ BC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC11x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x13y133efgEv");}
ccc::CC11x13y13 ::~CC11x13y13(){ note_dtor("_ZN3ccc10CC11x13y13E", this);} // tgen
ccc::CC11x13y13 ::CC11x13y13(){ note_ctor("_ZN3ccc10CC11x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y13E, buf);
    ::ccc::CC11x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y13E);
    dp->::ccc::CC11x13y13::~CC11x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y13E(Test__ZN3ccc10CC11x13y13E, "_ZN3ccc10CC11x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y13C1Ev();
extern void _ZN3ccc10CC11x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y13E[] = {
  NSPAIR(_ZN3ccc10CC11x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x13y133efgEv,_ZThn4_N3ccc10CC11x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x13y133efgEv,_ZThn4_N3ccc10CC11x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y13E[];
Class_Descriptor cd__ZN3ccc10CC11x13y13E = {  "_ZN3ccc10CC11x13y13E", // class name
  bases__ZN3ccc10CC11x13y13E, 2,
  &(vtc__ZN3ccc10CC11x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y14  : ::ccc::AA11 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC11x13y143pqrEv
  ~CC11x13y14(); // tgen
  CC11x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y14E) C1{ BC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC11x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x13y143pqrEv");}
ccc::CC11x13y14 ::~CC11x13y14(){ note_dtor("_ZN3ccc10CC11x13y14E", this);} // tgen
ccc::CC11x13y14 ::CC11x13y14(){ note_ctor("_ZN3ccc10CC11x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y14E, buf);
    ::ccc::CC11x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y14E);
    dp->::ccc::CC11x13y14::~CC11x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y14E(Test__ZN3ccc10CC11x13y14E, "_ZN3ccc10CC11x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y14C1Ev();
extern void _ZN3ccc10CC11x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y14E[] = {
  NSPAIR(_ZN3ccc10CC11x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y14E[];
extern void _ZN3ccc10CC11x13y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y14E[];
Class_Descriptor cd__ZN3ccc10CC11x13y14E = {  "_ZN3ccc10CC11x13y14E", // class name
  bases__ZN3ccc10CC11x13y14E, 2,
  &(vtc__ZN3ccc10CC11x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x13y15  : ::ccc::AA11 , ::ccc::BB13 {
  ~CC11x13y15(); // tgen
  CC11x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x13y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC11x13y15 ::~CC11x13y15(){ note_dtor("_ZN3ccc10CC11x13y15E", this);} // tgen
ccc::CC11x13y15 ::CC11x13y15(){ note_ctor("_ZN3ccc10CC11x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x13y15E, buf);
    ::ccc::CC11x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x13y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC11x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x13y15E);
    dp->::ccc::CC11x13y15::~CC11x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x13y15E(Test__ZN3ccc10CC11x13y15E, "_ZN3ccc10CC11x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x13y15C1Ev();
extern void _ZN3ccc10CC11x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x13y15E[] = {
  NSPAIR(_ZN3ccc10CC11x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC11x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x13y15E[];
Class_Descriptor cd__ZN3ccc10CC11x13y15E = {  "_ZN3ccc10CC11x13y15E", // class name
  bases__ZN3ccc10CC11x13y15E, 2,
  &(vtc__ZN3ccc10CC11x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x13y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y0  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC11x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y03pqrEv
  ~CC11x14y0(); // tgen
  CC11x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y0E) C1{ BC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y03abcEv");}
void  ccc::CC11x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y03efgEv");}
void  ccc::CC11x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y03pqrEv");}
ccc::CC11x14y0 ::~CC11x14y0(){ note_dtor("_ZN3ccc9CC11x14y0E", this);} // tgen
ccc::CC11x14y0 ::CC11x14y0(){ note_ctor("_ZN3ccc9CC11x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y0E, buf);
    ::ccc::CC11x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y0E);
    dp->::ccc::CC11x14y0::~CC11x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y0E(Test__ZN3ccc9CC11x14y0E, "_ZN3ccc9CC11x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y0C1Ev();
extern void _ZN3ccc9CC11x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y0E[] = {
  NSPAIR(_ZN3ccc9CC11x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y0E[];
extern void _ZN3ccc9CC11x14y03pqrEv();
extern void _ZN3ccc9CC11x14y03efgEv();
extern void _ZN3ccc9CC11x14y03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y03pqrEv,_ZThn4_N3ccc9CC11x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y03abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y03pqrEv,_ZThn4_N3ccc9CC11x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y0E[];
Class_Descriptor cd__ZN3ccc9CC11x14y0E = {  "_ZN3ccc9CC11x14y0E", // class name
  bases__ZN3ccc9CC11x14y0E, 2,
  &(vtc__ZN3ccc9CC11x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y1  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC11x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x14y13efgEv
  ~CC11x14y1(); // tgen
  CC11x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y1E) C1{ BC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y13abcEv");}
void  ccc::CC11x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y13pqrEv");}
void  ccc::CC11x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y13efgEv");}
ccc::CC11x14y1 ::~CC11x14y1(){ note_dtor("_ZN3ccc9CC11x14y1E", this);} // tgen
ccc::CC11x14y1 ::CC11x14y1(){ note_ctor("_ZN3ccc9CC11x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y1E, buf);
    ::ccc::CC11x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y1E);
    dp->::ccc::CC11x14y1::~CC11x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y1E(Test__ZN3ccc9CC11x14y1E, "_ZN3ccc9CC11x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y1C1Ev();
extern void _ZN3ccc9CC11x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y1E[] = {
  NSPAIR(_ZN3ccc9CC11x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y1E[];
extern void _ZN3ccc9CC11x14y13pqrEv();
extern void _ZN3ccc9CC11x14y13efgEv();
extern void _ZN3ccc9CC11x14y13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y13pqrEv,_ZThn4_N3ccc9CC11x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y13abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y13pqrEv,_ZThn4_N3ccc9CC11x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y1E[];
Class_Descriptor cd__ZN3ccc9CC11x14y1E = {  "_ZN3ccc9CC11x14y1E", // class name
  bases__ZN3ccc9CC11x14y1E, 2,
  &(vtc__ZN3ccc9CC11x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y2  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC11x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y23pqrEv
  ~CC11x14y2(); // tgen
  CC11x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y2E) C1{ BC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y23efgEv");}
void  ccc::CC11x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y23abcEv");}
void  ccc::CC11x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y23pqrEv");}
ccc::CC11x14y2 ::~CC11x14y2(){ note_dtor("_ZN3ccc9CC11x14y2E", this);} // tgen
ccc::CC11x14y2 ::CC11x14y2(){ note_ctor("_ZN3ccc9CC11x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y2E, buf);
    ::ccc::CC11x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y2E);
    dp->::ccc::CC11x14y2::~CC11x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y2E(Test__ZN3ccc9CC11x14y2E, "_ZN3ccc9CC11x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y2C1Ev();
extern void _ZN3ccc9CC11x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y2E[] = {
  NSPAIR(_ZN3ccc9CC11x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y2E[];
extern void _ZN3ccc9CC11x14y23pqrEv();
extern void _ZN3ccc9CC11x14y23efgEv();
extern void _ZN3ccc9CC11x14y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y23pqrEv,_ZThn4_N3ccc9CC11x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y23pqrEv,_ZThn4_N3ccc9CC11x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y2E[];
Class_Descriptor cd__ZN3ccc9CC11x14y2E = {  "_ZN3ccc9CC11x14y2E", // class name
  bases__ZN3ccc9CC11x14y2E, 2,
  &(vtc__ZN3ccc9CC11x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y3  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC11x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x14y33abcEv
  ~CC11x14y3(); // tgen
  CC11x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y3E) C1{ BC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y33efgEv");}
void  ccc::CC11x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y33pqrEv");}
void  ccc::CC11x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y33abcEv");}
ccc::CC11x14y3 ::~CC11x14y3(){ note_dtor("_ZN3ccc9CC11x14y3E", this);} // tgen
ccc::CC11x14y3 ::CC11x14y3(){ note_ctor("_ZN3ccc9CC11x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y3E, buf);
    ::ccc::CC11x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y3E);
    dp->::ccc::CC11x14y3::~CC11x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y3E(Test__ZN3ccc9CC11x14y3E, "_ZN3ccc9CC11x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y3C1Ev();
extern void _ZN3ccc9CC11x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y3E[] = {
  NSPAIR(_ZN3ccc9CC11x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y3E[];
extern void _ZN3ccc9CC11x14y33pqrEv();
extern void _ZN3ccc9CC11x14y33efgEv();
extern void _ZN3ccc9CC11x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y33pqrEv,_ZThn4_N3ccc9CC11x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y33pqrEv,_ZThn4_N3ccc9CC11x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y3E[];
Class_Descriptor cd__ZN3ccc9CC11x14y3E = {  "_ZN3ccc9CC11x14y3E", // class name
  bases__ZN3ccc9CC11x14y3E, 2,
  &(vtc__ZN3ccc9CC11x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y4  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC11x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x14y43efgEv
  ~CC11x14y4(); // tgen
  CC11x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y4E) C1{ BC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y43pqrEv");}
void  ccc::CC11x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y43abcEv");}
void  ccc::CC11x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y43efgEv");}
ccc::CC11x14y4 ::~CC11x14y4(){ note_dtor("_ZN3ccc9CC11x14y4E", this);} // tgen
ccc::CC11x14y4 ::CC11x14y4(){ note_ctor("_ZN3ccc9CC11x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y4E, buf);
    ::ccc::CC11x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y4E);
    dp->::ccc::CC11x14y4::~CC11x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y4E(Test__ZN3ccc9CC11x14y4E, "_ZN3ccc9CC11x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y4C1Ev();
extern void _ZN3ccc9CC11x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y4E[] = {
  NSPAIR(_ZN3ccc9CC11x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y4E[];
extern void _ZN3ccc9CC11x14y43pqrEv();
extern void _ZN3ccc9CC11x14y43efgEv();
extern void _ZN3ccc9CC11x14y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y43pqrEv,_ZThn4_N3ccc9CC11x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y43pqrEv,_ZThn4_N3ccc9CC11x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y4E[];
Class_Descriptor cd__ZN3ccc9CC11x14y4E = {  "_ZN3ccc9CC11x14y4E", // class name
  bases__ZN3ccc9CC11x14y4E, 2,
  &(vtc__ZN3ccc9CC11x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y5  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC11x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x14y53abcEv
  ~CC11x14y5(); // tgen
  CC11x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y5E) C1{ BC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y53pqrEv");}
void  ccc::CC11x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y53efgEv");}
void  ccc::CC11x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y53abcEv");}
ccc::CC11x14y5 ::~CC11x14y5(){ note_dtor("_ZN3ccc9CC11x14y5E", this);} // tgen
ccc::CC11x14y5 ::CC11x14y5(){ note_ctor("_ZN3ccc9CC11x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y5E, buf);
    ::ccc::CC11x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y5E);
    dp->::ccc::CC11x14y5::~CC11x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y5E(Test__ZN3ccc9CC11x14y5E, "_ZN3ccc9CC11x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y5C1Ev();
extern void _ZN3ccc9CC11x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y5E[] = {
  NSPAIR(_ZN3ccc9CC11x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y5E[];
extern void _ZN3ccc9CC11x14y53pqrEv();
extern void _ZN3ccc9CC11x14y53efgEv();
extern void _ZN3ccc9CC11x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y53pqrEv,_ZThn4_N3ccc9CC11x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y53pqrEv,_ZThn4_N3ccc9CC11x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y5E[];
Class_Descriptor cd__ZN3ccc9CC11x14y5E = {  "_ZN3ccc9CC11x14y5E", // class name
  bases__ZN3ccc9CC11x14y5E, 2,
  &(vtc__ZN3ccc9CC11x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y6  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC11x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x14y63efgEv
  ~CC11x14y6(); // tgen
  CC11x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y6E) C1{ BC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y63abcEv");}
void  ccc::CC11x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y63efgEv");}
ccc::CC11x14y6 ::~CC11x14y6(){ note_dtor("_ZN3ccc9CC11x14y6E", this);} // tgen
ccc::CC11x14y6 ::CC11x14y6(){ note_ctor("_ZN3ccc9CC11x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y6E, buf);
    ::ccc::CC11x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y6E);
    dp->::ccc::CC11x14y6::~CC11x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y6E(Test__ZN3ccc9CC11x14y6E, "_ZN3ccc9CC11x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y6C1Ev();
extern void _ZN3ccc9CC11x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y6E[] = {
  NSPAIR(_ZN3ccc9CC11x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x14y63efgEv();
extern void _ZN3ccc9CC11x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y6E[];
Class_Descriptor cd__ZN3ccc9CC11x14y6E = {  "_ZN3ccc9CC11x14y6E", // class name
  bases__ZN3ccc9CC11x14y6E, 2,
  &(vtc__ZN3ccc9CC11x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y7  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC11x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y73pqrEv
  ~CC11x14y7(); // tgen
  CC11x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y7E) C1{ BC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y73abcEv");}
void  ccc::CC11x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y73pqrEv");}
ccc::CC11x14y7 ::~CC11x14y7(){ note_dtor("_ZN3ccc9CC11x14y7E", this);} // tgen
ccc::CC11x14y7 ::CC11x14y7(){ note_ctor("_ZN3ccc9CC11x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y7E, buf);
    ::ccc::CC11x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y7E);
    dp->::ccc::CC11x14y7::~CC11x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y7E(Test__ZN3ccc9CC11x14y7E, "_ZN3ccc9CC11x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y7C1Ev();
extern void _ZN3ccc9CC11x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y7E[] = {
  NSPAIR(_ZN3ccc9CC11x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y7E[];
extern void _ZN3ccc9CC11x14y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y73pqrEv,_ZThn4_N3ccc9CC11x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y73pqrEv,_ZThn4_N3ccc9CC11x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y7E[];
Class_Descriptor cd__ZN3ccc9CC11x14y7E = {  "_ZN3ccc9CC11x14y7E", // class name
  bases__ZN3ccc9CC11x14y7E, 2,
  &(vtc__ZN3ccc9CC11x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y8  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC11x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x14y83abcEv
  ~CC11x14y8(); // tgen
  CC11x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y8E) C1{ BC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y83efgEv");}
void  ccc::CC11x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x14y83abcEv");}
ccc::CC11x14y8 ::~CC11x14y8(){ note_dtor("_ZN3ccc9CC11x14y8E", this);} // tgen
ccc::CC11x14y8 ::CC11x14y8(){ note_ctor("_ZN3ccc9CC11x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y8E, buf);
    ::ccc::CC11x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y8E);
    dp->::ccc::CC11x14y8::~CC11x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y8E(Test__ZN3ccc9CC11x14y8E, "_ZN3ccc9CC11x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y8C1Ev();
extern void _ZN3ccc9CC11x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y8E[] = {
  NSPAIR(_ZN3ccc9CC11x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x14y83efgEv();
extern void _ZN3ccc9CC11x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y8E[];
Class_Descriptor cd__ZN3ccc9CC11x14y8E = {  "_ZN3ccc9CC11x14y8E", // class name
  bases__ZN3ccc9CC11x14y8E, 2,
  &(vtc__ZN3ccc9CC11x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y9  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC11x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x14y93pqrEv
  ~CC11x14y9(); // tgen
  CC11x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x14y9E) C1{ BC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x14y93efgEv");}
void  ccc::CC11x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x14y93pqrEv");}
ccc::CC11x14y9 ::~CC11x14y9(){ note_dtor("_ZN3ccc9CC11x14y9E", this);} // tgen
ccc::CC11x14y9 ::CC11x14y9(){ note_ctor("_ZN3ccc9CC11x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC11x14y9E, buf);
    ::ccc::CC11x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC11x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x14y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC11x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x14y9E);
    dp->::ccc::CC11x14y9::~CC11x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x14y9E(Test__ZN3ccc9CC11x14y9E, "_ZN3ccc9CC11x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC11x14y9C1Ev();
extern void _ZN3ccc9CC11x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x14y9E[] = {
  NSPAIR(_ZN3ccc9CC11x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC11x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y9E[];
extern void _ZN3ccc9CC11x14y93pqrEv();
extern void _ZN3ccc9CC11x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC11x14y93pqrEv,_ZThn4_N3ccc9CC11x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC11x14y93pqrEv,_ZThn4_N3ccc9CC11x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x14y9E[];
Class_Descriptor cd__ZN3ccc9CC11x14y9E = {  "_ZN3ccc9CC11x14y9E", // class name
  bases__ZN3ccc9CC11x14y9E, 2,
  &(vtc__ZN3ccc9CC11x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC11x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x14y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y10  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC11x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x14y103abcEv
  ~CC11x14y10(); // tgen
  CC11x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y10E) C1{ BC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x14y103pqrEv");}
void  ccc::CC11x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x14y103abcEv");}
ccc::CC11x14y10 ::~CC11x14y10(){ note_dtor("_ZN3ccc10CC11x14y10E", this);} // tgen
ccc::CC11x14y10 ::CC11x14y10(){ note_ctor("_ZN3ccc10CC11x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y10E, buf);
    ::ccc::CC11x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y10E);
    dp->::ccc::CC11x14y10::~CC11x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y10E(Test__ZN3ccc10CC11x14y10E, "_ZN3ccc10CC11x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y10C1Ev();
extern void _ZN3ccc10CC11x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y10E[] = {
  NSPAIR(_ZN3ccc10CC11x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y10E[];
extern void _ZN3ccc10CC11x14y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x14y103pqrEv,_ZThn4_N3ccc10CC11x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x14y103pqrEv,_ZThn4_N3ccc10CC11x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y10E[];
Class_Descriptor cd__ZN3ccc10CC11x14y10E = {  "_ZN3ccc10CC11x14y10E", // class name
  bases__ZN3ccc10CC11x14y10E, 2,
  &(vtc__ZN3ccc10CC11x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y11  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC11x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x14y113efgEv
  ~CC11x14y11(); // tgen
  CC11x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y11E) C1{ BC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC11x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x14y113pqrEv");}
void  ccc::CC11x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x14y113efgEv");}
ccc::CC11x14y11 ::~CC11x14y11(){ note_dtor("_ZN3ccc10CC11x14y11E", this);} // tgen
ccc::CC11x14y11 ::CC11x14y11(){ note_ctor("_ZN3ccc10CC11x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y11E, buf);
    ::ccc::CC11x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y11E);
    dp->::ccc::CC11x14y11::~CC11x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y11E(Test__ZN3ccc10CC11x14y11E, "_ZN3ccc10CC11x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y11C1Ev();
extern void _ZN3ccc10CC11x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y11E[] = {
  NSPAIR(_ZN3ccc10CC11x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y11E[];
extern void _ZN3ccc10CC11x14y113pqrEv();
extern void _ZN3ccc10CC11x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x14y113pqrEv,_ZThn4_N3ccc10CC11x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x14y113pqrEv,_ZThn4_N3ccc10CC11x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y11E[];
Class_Descriptor cd__ZN3ccc10CC11x14y11E = {  "_ZN3ccc10CC11x14y11E", // class name
  bases__ZN3ccc10CC11x14y11E, 2,
  &(vtc__ZN3ccc10CC11x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y12  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC11x14y123abcEv
  ~CC11x14y12(); // tgen
  CC11x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y12E) C1{ BC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC11x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x14y123abcEv");}
ccc::CC11x14y12 ::~CC11x14y12(){ note_dtor("_ZN3ccc10CC11x14y12E", this);} // tgen
ccc::CC11x14y12 ::CC11x14y12(){ note_ctor("_ZN3ccc10CC11x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y12E, buf);
    ::ccc::CC11x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y12E);
    dp->::ccc::CC11x14y12::~CC11x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y12E(Test__ZN3ccc10CC11x14y12E, "_ZN3ccc10CC11x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y12C1Ev();
extern void _ZN3ccc10CC11x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y12E[] = {
  NSPAIR(_ZN3ccc10CC11x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y12E[];
Class_Descriptor cd__ZN3ccc10CC11x14y12E = {  "_ZN3ccc10CC11x14y12E", // class name
  bases__ZN3ccc10CC11x14y12E, 2,
  &(vtc__ZN3ccc10CC11x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y13  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC11x14y133efgEv
  ~CC11x14y13(); // tgen
  CC11x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y13E) C1{ BC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC11x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x14y133efgEv");}
ccc::CC11x14y13 ::~CC11x14y13(){ note_dtor("_ZN3ccc10CC11x14y13E", this);} // tgen
ccc::CC11x14y13 ::CC11x14y13(){ note_ctor("_ZN3ccc10CC11x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y13E, buf);
    ::ccc::CC11x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y13E);
    dp->::ccc::CC11x14y13::~CC11x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y13E(Test__ZN3ccc10CC11x14y13E, "_ZN3ccc10CC11x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y13C1Ev();
extern void _ZN3ccc10CC11x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y13E[] = {
  NSPAIR(_ZN3ccc10CC11x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y13E[];
Class_Descriptor cd__ZN3ccc10CC11x14y13E = {  "_ZN3ccc10CC11x14y13E", // class name
  bases__ZN3ccc10CC11x14y13E, 2,
  &(vtc__ZN3ccc10CC11x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y14  : ::ccc::AA11 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC11x14y143pqrEv
  ~CC11x14y14(); // tgen
  CC11x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y14E) C1{ BC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC11x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x14y143pqrEv");}
ccc::CC11x14y14 ::~CC11x14y14(){ note_dtor("_ZN3ccc10CC11x14y14E", this);} // tgen
ccc::CC11x14y14 ::CC11x14y14(){ note_ctor("_ZN3ccc10CC11x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y14E, buf);
    ::ccc::CC11x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y14E);
    dp->::ccc::CC11x14y14::~CC11x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y14E(Test__ZN3ccc10CC11x14y14E, "_ZN3ccc10CC11x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y14C1Ev();
extern void _ZN3ccc10CC11x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y14E[] = {
  NSPAIR(_ZN3ccc10CC11x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y14E[];
extern void _ZN3ccc10CC11x14y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC11x14y143pqrEv,_ZThn4_N3ccc10CC11x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC11x14y143pqrEv,_ZThn4_N3ccc10CC11x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y14E[];
Class_Descriptor cd__ZN3ccc10CC11x14y14E = {  "_ZN3ccc10CC11x14y14E", // class name
  bases__ZN3ccc10CC11x14y14E, 2,
  &(vtc__ZN3ccc10CC11x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x14y15  : ::ccc::AA11 , ::ccc::BB14 {
  ~CC11x14y15(); // tgen
  CC11x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x14y15E) C1{ BC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC11x14y15 ::~CC11x14y15(){ note_dtor("_ZN3ccc10CC11x14y15E", this);} // tgen
ccc::CC11x14y15 ::CC11x14y15(){ note_ctor("_ZN3ccc10CC11x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC11x14y15E, buf);
    ::ccc::CC11x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC11x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x14y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC11x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x14y15E);
    dp->::ccc::CC11x14y15::~CC11x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x14y15E(Test__ZN3ccc10CC11x14y15E, "_ZN3ccc10CC11x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC11x14y15C1Ev();
extern void _ZN3ccc10CC11x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x14y15E[] = {
  NSPAIR(_ZN3ccc10CC11x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC11x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x14y15E[];
Class_Descriptor cd__ZN3ccc10CC11x14y15E = {  "_ZN3ccc10CC11x14y15E", // class name
  bases__ZN3ccc10CC11x14y15E, 2,
  &(vtc__ZN3ccc10CC11x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC11x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x14y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y0  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC11x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC11x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y03pqrEv
  ~CC11x15y0(); // tgen
  CC11x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y0E) C1{ BC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y03abcEv");}
void  ccc::CC11x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y03efgEv");}
void  ccc::CC11x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y03pqrEv");}
ccc::CC11x15y0 ::~CC11x15y0(){ note_dtor("_ZN3ccc9CC11x15y0E", this);} // tgen
ccc::CC11x15y0 ::CC11x15y0(){ note_ctor("_ZN3ccc9CC11x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y0E, buf);
    ::ccc::CC11x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y0E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y0E);
    dp->::ccc::CC11x15y0::~CC11x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y0E(Test__ZN3ccc9CC11x15y0E, "_ZN3ccc9CC11x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y0C1Ev();
extern void _ZN3ccc9CC11x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y0E[] = {
  NSPAIR(_ZN3ccc9CC11x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y0E[];
extern void _ZN3ccc9CC11x15y03pqrEv();
extern void _ZN3ccc9CC11x15y03efgEv();
extern void _ZN3ccc9CC11x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y0E[];
Class_Descriptor cd__ZN3ccc9CC11x15y0E = {  "_ZN3ccc9CC11x15y0E", // class name
  bases__ZN3ccc9CC11x15y0E, 2,
  &(vtc__ZN3ccc9CC11x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y1  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC11x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x15y13efgEv
  ~CC11x15y1(); // tgen
  CC11x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y1E) C1{ BC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y13abcEv");}
void  ccc::CC11x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y13pqrEv");}
void  ccc::CC11x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y13efgEv");}
ccc::CC11x15y1 ::~CC11x15y1(){ note_dtor("_ZN3ccc9CC11x15y1E", this);} // tgen
ccc::CC11x15y1 ::CC11x15y1(){ note_ctor("_ZN3ccc9CC11x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y1E, buf);
    ::ccc::CC11x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y1E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y1E);
    dp->::ccc::CC11x15y1::~CC11x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y1E(Test__ZN3ccc9CC11x15y1E, "_ZN3ccc9CC11x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y1C1Ev();
extern void _ZN3ccc9CC11x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y1E[] = {
  NSPAIR(_ZN3ccc9CC11x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y1E[];
extern void _ZN3ccc9CC11x15y13pqrEv();
extern void _ZN3ccc9CC11x15y13efgEv();
extern void _ZN3ccc9CC11x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y1E[];
Class_Descriptor cd__ZN3ccc9CC11x15y1E = {  "_ZN3ccc9CC11x15y1E", // class name
  bases__ZN3ccc9CC11x15y1E, 2,
  &(vtc__ZN3ccc9CC11x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y2  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC11x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC11x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y23pqrEv
  ~CC11x15y2(); // tgen
  CC11x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y2E) C1{ BC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y23efgEv");}
void  ccc::CC11x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y23abcEv");}
void  ccc::CC11x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y23pqrEv");}
ccc::CC11x15y2 ::~CC11x15y2(){ note_dtor("_ZN3ccc9CC11x15y2E", this);} // tgen
ccc::CC11x15y2 ::CC11x15y2(){ note_ctor("_ZN3ccc9CC11x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y2E, buf);
    ::ccc::CC11x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y2E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y2E);
    dp->::ccc::CC11x15y2::~CC11x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y2E(Test__ZN3ccc9CC11x15y2E, "_ZN3ccc9CC11x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y2C1Ev();
extern void _ZN3ccc9CC11x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y2E[] = {
  NSPAIR(_ZN3ccc9CC11x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y2E[];
extern void _ZN3ccc9CC11x15y23pqrEv();
extern void _ZN3ccc9CC11x15y23efgEv();
extern void _ZN3ccc9CC11x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y2E[];
Class_Descriptor cd__ZN3ccc9CC11x15y2E = {  "_ZN3ccc9CC11x15y2E", // class name
  bases__ZN3ccc9CC11x15y2E, 2,
  &(vtc__ZN3ccc9CC11x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y3  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC11x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x15y33abcEv
  ~CC11x15y3(); // tgen
  CC11x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y3E) C1{ BC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y33efgEv");}
void  ccc::CC11x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y33pqrEv");}
void  ccc::CC11x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y33abcEv");}
ccc::CC11x15y3 ::~CC11x15y3(){ note_dtor("_ZN3ccc9CC11x15y3E", this);} // tgen
ccc::CC11x15y3 ::CC11x15y3(){ note_ctor("_ZN3ccc9CC11x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y3E, buf);
    ::ccc::CC11x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y3E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y3E);
    dp->::ccc::CC11x15y3::~CC11x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y3E(Test__ZN3ccc9CC11x15y3E, "_ZN3ccc9CC11x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y3C1Ev();
extern void _ZN3ccc9CC11x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y3E[] = {
  NSPAIR(_ZN3ccc9CC11x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y3E[];
extern void _ZN3ccc9CC11x15y33pqrEv();
extern void _ZN3ccc9CC11x15y33efgEv();
extern void _ZN3ccc9CC11x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y3E[];
Class_Descriptor cd__ZN3ccc9CC11x15y3E = {  "_ZN3ccc9CC11x15y3E", // class name
  bases__ZN3ccc9CC11x15y3E, 2,
  &(vtc__ZN3ccc9CC11x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y4  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC11x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC11x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC11x15y43efgEv
  ~CC11x15y4(); // tgen
  CC11x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y4E) C1{ BC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y43pqrEv");}
void  ccc::CC11x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y43abcEv");}
void  ccc::CC11x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y43efgEv");}
ccc::CC11x15y4 ::~CC11x15y4(){ note_dtor("_ZN3ccc9CC11x15y4E", this);} // tgen
ccc::CC11x15y4 ::CC11x15y4(){ note_ctor("_ZN3ccc9CC11x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y4E, buf);
    ::ccc::CC11x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y4E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y4E);
    dp->::ccc::CC11x15y4::~CC11x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y4E(Test__ZN3ccc9CC11x15y4E, "_ZN3ccc9CC11x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y4C1Ev();
extern void _ZN3ccc9CC11x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y4E[] = {
  NSPAIR(_ZN3ccc9CC11x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y4E[];
extern void _ZN3ccc9CC11x15y43pqrEv();
extern void _ZN3ccc9CC11x15y43efgEv();
extern void _ZN3ccc9CC11x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y4E[];
Class_Descriptor cd__ZN3ccc9CC11x15y4E = {  "_ZN3ccc9CC11x15y4E", // class name
  bases__ZN3ccc9CC11x15y4E, 2,
  &(vtc__ZN3ccc9CC11x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y5  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC11x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC11x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC11x15y53abcEv
  ~CC11x15y5(); // tgen
  CC11x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y5E) C1{ BC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC11x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y53pqrEv");}
void  ccc::CC11x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y53efgEv");}
void  ccc::CC11x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y53abcEv");}
ccc::CC11x15y5 ::~CC11x15y5(){ note_dtor("_ZN3ccc9CC11x15y5E", this);} // tgen
ccc::CC11x15y5 ::CC11x15y5(){ note_ctor("_ZN3ccc9CC11x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y5E, buf);
    ::ccc::CC11x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y5E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y5E);
    dp->::ccc::CC11x15y5::~CC11x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y5E(Test__ZN3ccc9CC11x15y5E, "_ZN3ccc9CC11x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y5C1Ev();
extern void _ZN3ccc9CC11x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y5E[] = {
  NSPAIR(_ZN3ccc9CC11x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y5E[];
extern void _ZN3ccc9CC11x15y53pqrEv();
extern void _ZN3ccc9CC11x15y53efgEv();
extern void _ZN3ccc9CC11x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y5E[];
Class_Descriptor cd__ZN3ccc9CC11x15y5E = {  "_ZN3ccc9CC11x15y5E", // class name
  bases__ZN3ccc9CC11x15y5E, 2,
  &(vtc__ZN3ccc9CC11x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y6  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC11x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC11x15y63efgEv
  ~CC11x15y6(); // tgen
  CC11x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y6E) C1{ BC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y63abcEv");}
void  ccc::CC11x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y63efgEv");}
ccc::CC11x15y6 ::~CC11x15y6(){ note_dtor("_ZN3ccc9CC11x15y6E", this);} // tgen
ccc::CC11x15y6 ::CC11x15y6(){ note_ctor("_ZN3ccc9CC11x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y6E, buf);
    ::ccc::CC11x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y6E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y6E);
    dp->::ccc::CC11x15y6::~CC11x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y6E(Test__ZN3ccc9CC11x15y6E, "_ZN3ccc9CC11x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y6C1Ev();
extern void _ZN3ccc9CC11x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y6E[] = {
  NSPAIR(_ZN3ccc9CC11x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y6E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x15y63efgEv();
extern void _ZN3ccc9CC11x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y6E[];
Class_Descriptor cd__ZN3ccc9CC11x15y6E = {  "_ZN3ccc9CC11x15y6E", // class name
  bases__ZN3ccc9CC11x15y6E, 2,
  &(vtc__ZN3ccc9CC11x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y7  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC11x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y73pqrEv
  ~CC11x15y7(); // tgen
  CC11x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y7E) C1{ BC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y73abcEv");}
void  ccc::CC11x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y73pqrEv");}
ccc::CC11x15y7 ::~CC11x15y7(){ note_dtor("_ZN3ccc9CC11x15y7E", this);} // tgen
ccc::CC11x15y7 ::CC11x15y7(){ note_ctor("_ZN3ccc9CC11x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y7E, buf);
    ::ccc::CC11x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y7E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y7E);
    dp->::ccc::CC11x15y7::~CC11x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y7E(Test__ZN3ccc9CC11x15y7E, "_ZN3ccc9CC11x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y7C1Ev();
extern void _ZN3ccc9CC11x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y7E[] = {
  NSPAIR(_ZN3ccc9CC11x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y7E[];
extern void _ZN3ccc9CC11x15y73pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc9CC11x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y7E[];
Class_Descriptor cd__ZN3ccc9CC11x15y7E = {  "_ZN3ccc9CC11x15y7E", // class name
  bases__ZN3ccc9CC11x15y7E, 2,
  &(vtc__ZN3ccc9CC11x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y8  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC11x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC11x15y83abcEv
  ~CC11x15y8(); // tgen
  CC11x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y8E) C1{ BC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y83efgEv");}
void  ccc::CC11x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC11x15y83abcEv");}
ccc::CC11x15y8 ::~CC11x15y8(){ note_dtor("_ZN3ccc9CC11x15y8E", this);} // tgen
ccc::CC11x15y8 ::CC11x15y8(){ note_ctor("_ZN3ccc9CC11x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y8E, buf);
    ::ccc::CC11x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y8E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y8E);
    dp->::ccc::CC11x15y8::~CC11x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y8E(Test__ZN3ccc9CC11x15y8E, "_ZN3ccc9CC11x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y8C1Ev();
extern void _ZN3ccc9CC11x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y8E[] = {
  NSPAIR(_ZN3ccc9CC11x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y8E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc9CC11x15y83efgEv();
extern void _ZN3ccc9CC11x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y8E[];
Class_Descriptor cd__ZN3ccc9CC11x15y8E = {  "_ZN3ccc9CC11x15y8E", // class name
  bases__ZN3ccc9CC11x15y8E, 2,
  &(vtc__ZN3ccc9CC11x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y9  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC11x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC11x15y93pqrEv
  ~CC11x15y9(); // tgen
  CC11x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC11x15y9E) C1{ BC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC11x15y93efgEv");}
void  ccc::CC11x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC11x15y93pqrEv");}
ccc::CC11x15y9 ::~CC11x15y9(){ note_dtor("_ZN3ccc9CC11x15y9E", this);} // tgen
ccc::CC11x15y9 ::CC11x15y9(){ note_ctor("_ZN3ccc9CC11x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC11x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC11x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC11x15y9E, buf);
    ::ccc::CC11x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC11x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC11x15y9E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc9CC11x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC11x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC11x15y9E);
    dp->::ccc::CC11x15y9::~CC11x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC11x15y9E(Test__ZN3ccc9CC11x15y9E, "_ZN3ccc9CC11x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC11x15y9C1Ev();
extern void _ZN3ccc9CC11x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC11x15y9E[] = {
  NSPAIR(_ZN3ccc9CC11x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC11x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC11x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y9E[];
extern void _ZN3ccc9CC11x15y93pqrEv();
extern void _ZN3ccc9CC11x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC11x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC11x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC11x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC11x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC11x15y9E[];
Class_Descriptor cd__ZN3ccc9CC11x15y9E = {  "_ZN3ccc9CC11x15y9E", // class name
  bases__ZN3ccc9CC11x15y9E, 2,
  &(vtc__ZN3ccc9CC11x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC11x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC11x15y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y10  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC11x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC11x15y103abcEv
  ~CC11x15y10(); // tgen
  CC11x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y10E) C1{ BC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x15y103pqrEv");}
void  ccc::CC11x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x15y103abcEv");}
ccc::CC11x15y10 ::~CC11x15y10(){ note_dtor("_ZN3ccc10CC11x15y10E", this);} // tgen
ccc::CC11x15y10 ::CC11x15y10(){ note_ctor("_ZN3ccc10CC11x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y10E, buf);
    ::ccc::CC11x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y10E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y10E);
    dp->::ccc::CC11x15y10::~CC11x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y10E(Test__ZN3ccc10CC11x15y10E, "_ZN3ccc10CC11x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y10C1Ev();
extern void _ZN3ccc10CC11x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y10E[] = {
  NSPAIR(_ZN3ccc10CC11x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y10E[];
extern void _ZN3ccc10CC11x15y103pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y10E[];
Class_Descriptor cd__ZN3ccc10CC11x15y10E = {  "_ZN3ccc10CC11x15y10E", // class name
  bases__ZN3ccc10CC11x15y10E, 2,
  &(vtc__ZN3ccc10CC11x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y11  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC11x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC11x15y113efgEv
  ~CC11x15y11(); // tgen
  CC11x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y11E) C1{ BC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC11x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x15y113pqrEv");}
void  ccc::CC11x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x15y113efgEv");}
ccc::CC11x15y11 ::~CC11x15y11(){ note_dtor("_ZN3ccc10CC11x15y11E", this);} // tgen
ccc::CC11x15y11 ::CC11x15y11(){ note_ctor("_ZN3ccc10CC11x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y11E, buf);
    ::ccc::CC11x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y11E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y11E);
    dp->::ccc::CC11x15y11::~CC11x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y11E(Test__ZN3ccc10CC11x15y11E, "_ZN3ccc10CC11x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y11C1Ev();
extern void _ZN3ccc10CC11x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y11E[] = {
  NSPAIR(_ZN3ccc10CC11x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y11E[];
extern void _ZN3ccc10CC11x15y113pqrEv();
extern void _ZN3ccc10CC11x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y11E[];
Class_Descriptor cd__ZN3ccc10CC11x15y11E = {  "_ZN3ccc10CC11x15y11E", // class name
  bases__ZN3ccc10CC11x15y11E, 2,
  &(vtc__ZN3ccc10CC11x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y12  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC11x15y123abcEv
  ~CC11x15y12(); // tgen
  CC11x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y12E) C1{ BC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC11x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC11x15y123abcEv");}
ccc::CC11x15y12 ::~CC11x15y12(){ note_dtor("_ZN3ccc10CC11x15y12E", this);} // tgen
ccc::CC11x15y12 ::CC11x15y12(){ note_ctor("_ZN3ccc10CC11x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y12E, buf);
    ::ccc::CC11x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y12E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y12E);
    dp->::ccc::CC11x15y12::~CC11x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y12E(Test__ZN3ccc10CC11x15y12E, "_ZN3ccc10CC11x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y12C1Ev();
extern void _ZN3ccc10CC11x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y12E[] = {
  NSPAIR(_ZN3ccc10CC11x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y12E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
extern void _ZN3ccc10CC11x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y12E[];
Class_Descriptor cd__ZN3ccc10CC11x15y12E = {  "_ZN3ccc10CC11x15y12E", // class name
  bases__ZN3ccc10CC11x15y12E, 2,
  &(vtc__ZN3ccc10CC11x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y13  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC11x15y133efgEv
  ~CC11x15y13(); // tgen
  CC11x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y13E) C1{ BC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC11x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC11x15y133efgEv");}
ccc::CC11x15y13 ::~CC11x15y13(){ note_dtor("_ZN3ccc10CC11x15y13E", this);} // tgen
ccc::CC11x15y13 ::CC11x15y13(){ note_ctor("_ZN3ccc10CC11x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y13E, buf);
    ::ccc::CC11x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y13E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y13E);
    dp->::ccc::CC11x15y13::~CC11x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y13E(Test__ZN3ccc10CC11x15y13E, "_ZN3ccc10CC11x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y13C1Ev();
extern void _ZN3ccc10CC11x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y13E[] = {
  NSPAIR(_ZN3ccc10CC11x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y13E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc10CC11x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y13E[];
Class_Descriptor cd__ZN3ccc10CC11x15y13E = {  "_ZN3ccc10CC11x15y13E", // class name
  bases__ZN3ccc10CC11x15y13E, 2,
  &(vtc__ZN3ccc10CC11x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y14  : ::ccc::AA11 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC11x15y143pqrEv
  ~CC11x15y14(); // tgen
  CC11x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y14E) C1{ BC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC11x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC11x15y143pqrEv");}
ccc::CC11x15y14 ::~CC11x15y14(){ note_dtor("_ZN3ccc10CC11x15y14E", this);} // tgen
ccc::CC11x15y14 ::CC11x15y14(){ note_ctor("_ZN3ccc10CC11x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y14E, buf);
    ::ccc::CC11x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y14E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y14E);
    dp->::ccc::CC11x15y14::~CC11x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y14E(Test__ZN3ccc10CC11x15y14E, "_ZN3ccc10CC11x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y14C1Ev();
extern void _ZN3ccc10CC11x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y14E[] = {
  NSPAIR(_ZN3ccc10CC11x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y14E[];
extern void _ZN3ccc10CC11x15y143pqrEv();
extern void _ZN3ccc4AA113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC11x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y14E[];
Class_Descriptor cd__ZN3ccc10CC11x15y14E = {  "_ZN3ccc10CC11x15y14E", // class name
  bases__ZN3ccc10CC11x15y14E, 2,
  &(vtc__ZN3ccc10CC11x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC11x15y15  : ::ccc::AA11 , ::ccc::BB15 {
  ~CC11x15y15(); // tgen
  CC11x15y15(); // tgen
};
//SIG(1 _ZN3ccc10CC11x15y15E) C1{ BC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC11x15y15 ::~CC11x15y15(){ note_dtor("_ZN3ccc10CC11x15y15E", this);} // tgen
ccc::CC11x15y15 ::CC11x15y15(){ note_ctor("_ZN3ccc10CC11x15y15E", this);} // tgen
}
static void Test__ZN3ccc10CC11x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC11x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC11x15y15E, buf);
    ::ccc::CC11x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC11x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC11x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC11x15y15E)");
    check_base_class_offset(lv, (::ccc::AA11*), 0, "_ZN3ccc10CC11x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC11x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC11x15y15E);
    dp->::ccc::CC11x15y15::~CC11x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC11x15y15E(Test__ZN3ccc10CC11x15y15E, "_ZN3ccc10CC11x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC11x15y15C1Ev();
extern void _ZN3ccc10CC11x15y15D1Ev();
Name_Map name_map__ZN3ccc10CC11x15y15E[] = {
  NSPAIR(_ZN3ccc10CC11x15y15C1Ev),
  NSPAIR(_ZN3ccc10CC11x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA11E;
extern VTBL_ENTRY _ZTIN3ccc4AA11E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA11E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC11x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y15E[];
extern void _ZN3ccc4AA113pqrEv();
extern void _ZN3ccc4AA113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC11x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC11x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC11x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC11x15y15E[];
Class_Descriptor cd__ZN3ccc10CC11x15y15E = {  "_ZN3ccc10CC11x15y15E", // class name
  bases__ZN3ccc10CC11x15y15E, 2,
  &(vtc__ZN3ccc10CC11x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC11x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC11x15y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y0  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC12x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y03pqrEv
  ~CC12x0y0(); // tgen
  CC12x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y0E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y03abcEv");}
void  ccc::CC12x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y03efgEv");}
void  ccc::CC12x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y03pqrEv");}
ccc::CC12x0y0 ::~CC12x0y0(){ note_dtor("_ZN3ccc8CC12x0y0E", this);} // tgen
ccc::CC12x0y0 ::CC12x0y0(){ note_ctor("_ZN3ccc8CC12x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y0E, buf);
    ::ccc::CC12x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y0E);
    dp->::ccc::CC12x0y0::~CC12x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y0E(Test__ZN3ccc8CC12x0y0E, "_ZN3ccc8CC12x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y0C1Ev();
extern void _ZN3ccc8CC12x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y0E[] = {
  NSPAIR(_ZN3ccc8CC12x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y0E[];
extern void _ZN3ccc8CC12x0y03abcEv();
extern void _ZN3ccc8CC12x0y03efgEv();
extern void _ZN3ccc8CC12x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y03abcEv,_ZThn4_N3ccc8CC12x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y03efgEv,_ZThn4_N3ccc8CC12x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y03pqrEv,_ZThn4_N3ccc8CC12x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y03abcEv,_ZThn4_N3ccc8CC12x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y03efgEv,_ZThn4_N3ccc8CC12x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y03pqrEv,_ZThn4_N3ccc8CC12x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y0E[];
Class_Descriptor cd__ZN3ccc8CC12x0y0E = {  "_ZN3ccc8CC12x0y0E", // class name
  bases__ZN3ccc8CC12x0y0E, 2,
  &(vtc__ZN3ccc8CC12x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y1  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC12x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x0y13efgEv
  ~CC12x0y1(); // tgen
  CC12x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y1E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y13abcEv");}
void  ccc::CC12x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y13pqrEv");}
void  ccc::CC12x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y13efgEv");}
ccc::CC12x0y1 ::~CC12x0y1(){ note_dtor("_ZN3ccc8CC12x0y1E", this);} // tgen
ccc::CC12x0y1 ::CC12x0y1(){ note_ctor("_ZN3ccc8CC12x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y1E, buf);
    ::ccc::CC12x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y1E);
    dp->::ccc::CC12x0y1::~CC12x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y1E(Test__ZN3ccc8CC12x0y1E, "_ZN3ccc8CC12x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y1C1Ev();
extern void _ZN3ccc8CC12x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y1E[] = {
  NSPAIR(_ZN3ccc8CC12x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y1E[];
extern void _ZN3ccc8CC12x0y13abcEv();
extern void _ZN3ccc8CC12x0y13pqrEv();
extern void _ZN3ccc8CC12x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y13abcEv,_ZThn4_N3ccc8CC12x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y13efgEv,_ZThn4_N3ccc8CC12x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y13pqrEv,_ZThn4_N3ccc8CC12x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y13abcEv,_ZThn4_N3ccc8CC12x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y13efgEv,_ZThn4_N3ccc8CC12x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y13pqrEv,_ZThn4_N3ccc8CC12x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y1E[];
Class_Descriptor cd__ZN3ccc8CC12x0y1E = {  "_ZN3ccc8CC12x0y1E", // class name
  bases__ZN3ccc8CC12x0y1E, 2,
  &(vtc__ZN3ccc8CC12x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y2  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC12x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y23pqrEv
  ~CC12x0y2(); // tgen
  CC12x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y2E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y23efgEv");}
void  ccc::CC12x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y23abcEv");}
void  ccc::CC12x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y23pqrEv");}
ccc::CC12x0y2 ::~CC12x0y2(){ note_dtor("_ZN3ccc8CC12x0y2E", this);} // tgen
ccc::CC12x0y2 ::CC12x0y2(){ note_ctor("_ZN3ccc8CC12x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y2E, buf);
    ::ccc::CC12x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y2E);
    dp->::ccc::CC12x0y2::~CC12x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y2E(Test__ZN3ccc8CC12x0y2E, "_ZN3ccc8CC12x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y2C1Ev();
extern void _ZN3ccc8CC12x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y2E[] = {
  NSPAIR(_ZN3ccc8CC12x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y2E[];
extern void _ZN3ccc8CC12x0y23abcEv();
extern void _ZN3ccc8CC12x0y23efgEv();
extern void _ZN3ccc8CC12x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y23abcEv,_ZThn4_N3ccc8CC12x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y23efgEv,_ZThn4_N3ccc8CC12x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y23pqrEv,_ZThn4_N3ccc8CC12x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y23abcEv,_ZThn4_N3ccc8CC12x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y23efgEv,_ZThn4_N3ccc8CC12x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y23pqrEv,_ZThn4_N3ccc8CC12x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y2E[];
Class_Descriptor cd__ZN3ccc8CC12x0y2E = {  "_ZN3ccc8CC12x0y2E", // class name
  bases__ZN3ccc8CC12x0y2E, 2,
  &(vtc__ZN3ccc8CC12x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y3  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC12x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x0y33abcEv
  ~CC12x0y3(); // tgen
  CC12x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y3E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y33efgEv");}
void  ccc::CC12x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y33pqrEv");}
void  ccc::CC12x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y33abcEv");}
ccc::CC12x0y3 ::~CC12x0y3(){ note_dtor("_ZN3ccc8CC12x0y3E", this);} // tgen
ccc::CC12x0y3 ::CC12x0y3(){ note_ctor("_ZN3ccc8CC12x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y3E, buf);
    ::ccc::CC12x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y3E);
    dp->::ccc::CC12x0y3::~CC12x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y3E(Test__ZN3ccc8CC12x0y3E, "_ZN3ccc8CC12x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y3C1Ev();
extern void _ZN3ccc8CC12x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y3E[] = {
  NSPAIR(_ZN3ccc8CC12x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y3E[];
extern void _ZN3ccc8CC12x0y33abcEv();
extern void _ZN3ccc8CC12x0y33efgEv();
extern void _ZN3ccc8CC12x0y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y33abcEv,_ZThn4_N3ccc8CC12x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y33efgEv,_ZThn4_N3ccc8CC12x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y33pqrEv,_ZThn4_N3ccc8CC12x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y33abcEv,_ZThn4_N3ccc8CC12x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y33efgEv,_ZThn4_N3ccc8CC12x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y33pqrEv,_ZThn4_N3ccc8CC12x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y3E[];
Class_Descriptor cd__ZN3ccc8CC12x0y3E = {  "_ZN3ccc8CC12x0y3E", // class name
  bases__ZN3ccc8CC12x0y3E, 2,
  &(vtc__ZN3ccc8CC12x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y4  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC12x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x0y43efgEv
  ~CC12x0y4(); // tgen
  CC12x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y4E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y43pqrEv");}
void  ccc::CC12x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y43abcEv");}
void  ccc::CC12x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y43efgEv");}
ccc::CC12x0y4 ::~CC12x0y4(){ note_dtor("_ZN3ccc8CC12x0y4E", this);} // tgen
ccc::CC12x0y4 ::CC12x0y4(){ note_ctor("_ZN3ccc8CC12x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y4E, buf);
    ::ccc::CC12x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y4E);
    dp->::ccc::CC12x0y4::~CC12x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y4E(Test__ZN3ccc8CC12x0y4E, "_ZN3ccc8CC12x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y4C1Ev();
extern void _ZN3ccc8CC12x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y4E[] = {
  NSPAIR(_ZN3ccc8CC12x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y4E[];
extern void _ZN3ccc8CC12x0y43abcEv();
extern void _ZN3ccc8CC12x0y43pqrEv();
extern void _ZN3ccc8CC12x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y43abcEv,_ZThn4_N3ccc8CC12x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y43efgEv,_ZThn4_N3ccc8CC12x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y43pqrEv,_ZThn4_N3ccc8CC12x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y43abcEv,_ZThn4_N3ccc8CC12x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y43efgEv,_ZThn4_N3ccc8CC12x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y43pqrEv,_ZThn4_N3ccc8CC12x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y4E[];
Class_Descriptor cd__ZN3ccc8CC12x0y4E = {  "_ZN3ccc8CC12x0y4E", // class name
  bases__ZN3ccc8CC12x0y4E, 2,
  &(vtc__ZN3ccc8CC12x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y5  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC12x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x0y53abcEv
  ~CC12x0y5(); // tgen
  CC12x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y5E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y53pqrEv");}
void  ccc::CC12x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y53efgEv");}
void  ccc::CC12x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y53abcEv");}
ccc::CC12x0y5 ::~CC12x0y5(){ note_dtor("_ZN3ccc8CC12x0y5E", this);} // tgen
ccc::CC12x0y5 ::CC12x0y5(){ note_ctor("_ZN3ccc8CC12x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y5E, buf);
    ::ccc::CC12x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y5E);
    dp->::ccc::CC12x0y5::~CC12x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y5E(Test__ZN3ccc8CC12x0y5E, "_ZN3ccc8CC12x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y5C1Ev();
extern void _ZN3ccc8CC12x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y5E[] = {
  NSPAIR(_ZN3ccc8CC12x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y5E[];
extern void _ZN3ccc8CC12x0y53abcEv();
extern void _ZN3ccc8CC12x0y53pqrEv();
extern void _ZN3ccc8CC12x0y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y53abcEv,_ZThn4_N3ccc8CC12x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y53efgEv,_ZThn4_N3ccc8CC12x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y53pqrEv,_ZThn4_N3ccc8CC12x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y53abcEv,_ZThn4_N3ccc8CC12x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y53efgEv,_ZThn4_N3ccc8CC12x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y53pqrEv,_ZThn4_N3ccc8CC12x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y5E[];
Class_Descriptor cd__ZN3ccc8CC12x0y5E = {  "_ZN3ccc8CC12x0y5E", // class name
  bases__ZN3ccc8CC12x0y5E, 2,
  &(vtc__ZN3ccc8CC12x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y6  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC12x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x0y63efgEv
  ~CC12x0y6(); // tgen
  CC12x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y6E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y63abcEv");}
void  ccc::CC12x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y63efgEv");}
ccc::CC12x0y6 ::~CC12x0y6(){ note_dtor("_ZN3ccc8CC12x0y6E", this);} // tgen
ccc::CC12x0y6 ::CC12x0y6(){ note_ctor("_ZN3ccc8CC12x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y6E, buf);
    ::ccc::CC12x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y6E);
    dp->::ccc::CC12x0y6::~CC12x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y6E(Test__ZN3ccc8CC12x0y6E, "_ZN3ccc8CC12x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y6C1Ev();
extern void _ZN3ccc8CC12x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y6E[] = {
  NSPAIR(_ZN3ccc8CC12x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y6E[];
extern void _ZN3ccc8CC12x0y63abcEv();
extern void _ZN3ccc8CC12x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y63abcEv,_ZThn4_N3ccc8CC12x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y63efgEv,_ZThn4_N3ccc8CC12x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y63abcEv,_ZThn4_N3ccc8CC12x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y63efgEv,_ZThn4_N3ccc8CC12x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y6E[];
Class_Descriptor cd__ZN3ccc8CC12x0y6E = {  "_ZN3ccc8CC12x0y6E", // class name
  bases__ZN3ccc8CC12x0y6E, 2,
  &(vtc__ZN3ccc8CC12x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y7  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC12x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y73pqrEv
  ~CC12x0y7(); // tgen
  CC12x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y7E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y73abcEv");}
void  ccc::CC12x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y73pqrEv");}
ccc::CC12x0y7 ::~CC12x0y7(){ note_dtor("_ZN3ccc8CC12x0y7E", this);} // tgen
ccc::CC12x0y7 ::CC12x0y7(){ note_ctor("_ZN3ccc8CC12x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y7E, buf);
    ::ccc::CC12x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y7E);
    dp->::ccc::CC12x0y7::~CC12x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y7E(Test__ZN3ccc8CC12x0y7E, "_ZN3ccc8CC12x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y7C1Ev();
extern void _ZN3ccc8CC12x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y7E[] = {
  NSPAIR(_ZN3ccc8CC12x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y7E[];
extern void _ZN3ccc8CC12x0y73abcEv();
extern void _ZN3ccc8CC12x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y73abcEv,_ZThn4_N3ccc8CC12x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y73pqrEv,_ZThn4_N3ccc8CC12x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y73abcEv,_ZThn4_N3ccc8CC12x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y73pqrEv,_ZThn4_N3ccc8CC12x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y7E[];
Class_Descriptor cd__ZN3ccc8CC12x0y7E = {  "_ZN3ccc8CC12x0y7E", // class name
  bases__ZN3ccc8CC12x0y7E, 2,
  &(vtc__ZN3ccc8CC12x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y8  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC12x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x0y83abcEv
  ~CC12x0y8(); // tgen
  CC12x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y8E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y83efgEv");}
void  ccc::CC12x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x0y83abcEv");}
ccc::CC12x0y8 ::~CC12x0y8(){ note_dtor("_ZN3ccc8CC12x0y8E", this);} // tgen
ccc::CC12x0y8 ::CC12x0y8(){ note_ctor("_ZN3ccc8CC12x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y8E, buf);
    ::ccc::CC12x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y8E);
    dp->::ccc::CC12x0y8::~CC12x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y8E(Test__ZN3ccc8CC12x0y8E, "_ZN3ccc8CC12x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y8C1Ev();
extern void _ZN3ccc8CC12x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y8E[] = {
  NSPAIR(_ZN3ccc8CC12x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y8E[];
extern void _ZN3ccc8CC12x0y83abcEv();
extern void _ZN3ccc8CC12x0y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y83abcEv,_ZThn4_N3ccc8CC12x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y83efgEv,_ZThn4_N3ccc8CC12x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y83abcEv,_ZThn4_N3ccc8CC12x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y83efgEv,_ZThn4_N3ccc8CC12x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y8E[];
Class_Descriptor cd__ZN3ccc8CC12x0y8E = {  "_ZN3ccc8CC12x0y8E", // class name
  bases__ZN3ccc8CC12x0y8E, 2,
  &(vtc__ZN3ccc8CC12x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y9  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC12x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x0y93pqrEv
  ~CC12x0y9(); // tgen
  CC12x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x0y9E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x0y93efgEv");}
void  ccc::CC12x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x0y93pqrEv");}
ccc::CC12x0y9 ::~CC12x0y9(){ note_dtor("_ZN3ccc8CC12x0y9E", this);} // tgen
ccc::CC12x0y9 ::CC12x0y9(){ note_ctor("_ZN3ccc8CC12x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x0y9E, buf);
    ::ccc::CC12x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x0y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC12x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x0y9E);
    dp->::ccc::CC12x0y9::~CC12x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x0y9E(Test__ZN3ccc8CC12x0y9E, "_ZN3ccc8CC12x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x0y9C1Ev();
extern void _ZN3ccc8CC12x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x0y9E[] = {
  NSPAIR(_ZN3ccc8CC12x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC12x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x0y93efgEv();
extern void _ZN3ccc8CC12x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y93efgEv,_ZThn4_N3ccc8CC12x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x0y93pqrEv,_ZThn4_N3ccc8CC12x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y93efgEv,_ZThn4_N3ccc8CC12x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x0y93pqrEv,_ZThn4_N3ccc8CC12x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x0y9E[];
Class_Descriptor cd__ZN3ccc8CC12x0y9E = {  "_ZN3ccc8CC12x0y9E", // class name
  bases__ZN3ccc8CC12x0y9E, 2,
  &(vtc__ZN3ccc8CC12x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x0y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y10  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC12x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x0y103abcEv
  ~CC12x0y10(); // tgen
  CC12x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y10E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x0y103pqrEv");}
void  ccc::CC12x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x0y103abcEv");}
ccc::CC12x0y10 ::~CC12x0y10(){ note_dtor("_ZN3ccc9CC12x0y10E", this);} // tgen
ccc::CC12x0y10 ::CC12x0y10(){ note_ctor("_ZN3ccc9CC12x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y10E, buf);
    ::ccc::CC12x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y10E);
    dp->::ccc::CC12x0y10::~CC12x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y10E(Test__ZN3ccc9CC12x0y10E, "_ZN3ccc9CC12x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y10C1Ev();
extern void _ZN3ccc9CC12x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y10E[] = {
  NSPAIR(_ZN3ccc9CC12x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y10E[];
extern void _ZN3ccc9CC12x0y103abcEv();
extern void _ZN3ccc9CC12x0y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y103abcEv,_ZThn4_N3ccc9CC12x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y103pqrEv,_ZThn4_N3ccc9CC12x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y103abcEv,_ZThn4_N3ccc9CC12x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y103pqrEv,_ZThn4_N3ccc9CC12x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y10E[];
Class_Descriptor cd__ZN3ccc9CC12x0y10E = {  "_ZN3ccc9CC12x0y10E", // class name
  bases__ZN3ccc9CC12x0y10E, 2,
  &(vtc__ZN3ccc9CC12x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y11  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC12x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x0y113efgEv
  ~CC12x0y11(); // tgen
  CC12x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y11E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x0y113pqrEv");}
void  ccc::CC12x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x0y113efgEv");}
ccc::CC12x0y11 ::~CC12x0y11(){ note_dtor("_ZN3ccc9CC12x0y11E", this);} // tgen
ccc::CC12x0y11 ::CC12x0y11(){ note_ctor("_ZN3ccc9CC12x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y11E, buf);
    ::ccc::CC12x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y11E);
    dp->::ccc::CC12x0y11::~CC12x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y11E(Test__ZN3ccc9CC12x0y11E, "_ZN3ccc9CC12x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y11C1Ev();
extern void _ZN3ccc9CC12x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y11E[] = {
  NSPAIR(_ZN3ccc9CC12x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x0y113pqrEv();
extern void _ZN3ccc9CC12x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y113efgEv,_ZThn4_N3ccc9CC12x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y113pqrEv,_ZThn4_N3ccc9CC12x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y113efgEv,_ZThn4_N3ccc9CC12x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y113pqrEv,_ZThn4_N3ccc9CC12x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y11E[];
Class_Descriptor cd__ZN3ccc9CC12x0y11E = {  "_ZN3ccc9CC12x0y11E", // class name
  bases__ZN3ccc9CC12x0y11E, 2,
  &(vtc__ZN3ccc9CC12x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y12  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC12x0y123abcEv
  ~CC12x0y12(); // tgen
  CC12x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y12E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC12x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x0y123abcEv");}
ccc::CC12x0y12 ::~CC12x0y12(){ note_dtor("_ZN3ccc9CC12x0y12E", this);} // tgen
ccc::CC12x0y12 ::CC12x0y12(){ note_ctor("_ZN3ccc9CC12x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y12E, buf);
    ::ccc::CC12x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y12E);
    dp->::ccc::CC12x0y12::~CC12x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y12E(Test__ZN3ccc9CC12x0y12E, "_ZN3ccc9CC12x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y12C1Ev();
extern void _ZN3ccc9CC12x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y12E[] = {
  NSPAIR(_ZN3ccc9CC12x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y12E[];
extern void _ZN3ccc9CC12x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y123abcEv,_ZThn4_N3ccc9CC12x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y123abcEv,_ZThn4_N3ccc9CC12x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y12E[];
Class_Descriptor cd__ZN3ccc9CC12x0y12E = {  "_ZN3ccc9CC12x0y12E", // class name
  bases__ZN3ccc9CC12x0y12E, 2,
  &(vtc__ZN3ccc9CC12x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y13  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC12x0y133efgEv
  ~CC12x0y13(); // tgen
  CC12x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y13E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC12x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x0y133efgEv");}
ccc::CC12x0y13 ::~CC12x0y13(){ note_dtor("_ZN3ccc9CC12x0y13E", this);} // tgen
ccc::CC12x0y13 ::CC12x0y13(){ note_ctor("_ZN3ccc9CC12x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y13E, buf);
    ::ccc::CC12x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y13E);
    dp->::ccc::CC12x0y13::~CC12x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y13E(Test__ZN3ccc9CC12x0y13E, "_ZN3ccc9CC12x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y13C1Ev();
extern void _ZN3ccc9CC12x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y13E[] = {
  NSPAIR(_ZN3ccc9CC12x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y133efgEv,_ZThn4_N3ccc9CC12x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y133efgEv,_ZThn4_N3ccc9CC12x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y13E[];
Class_Descriptor cd__ZN3ccc9CC12x0y13E = {  "_ZN3ccc9CC12x0y13E", // class name
  bases__ZN3ccc9CC12x0y13E, 2,
  &(vtc__ZN3ccc9CC12x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y14  : ::ccc::AA12 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC12x0y143pqrEv
  ~CC12x0y14(); // tgen
  CC12x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y14E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC12x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x0y143pqrEv");}
ccc::CC12x0y14 ::~CC12x0y14(){ note_dtor("_ZN3ccc9CC12x0y14E", this);} // tgen
ccc::CC12x0y14 ::CC12x0y14(){ note_ctor("_ZN3ccc9CC12x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y14E, buf);
    ::ccc::CC12x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y14E);
    dp->::ccc::CC12x0y14::~CC12x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y14E(Test__ZN3ccc9CC12x0y14E, "_ZN3ccc9CC12x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y14C1Ev();
extern void _ZN3ccc9CC12x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y14E[] = {
  NSPAIR(_ZN3ccc9CC12x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x0y143pqrEv,_ZThn4_N3ccc9CC12x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x0y143pqrEv,_ZThn4_N3ccc9CC12x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y14E[];
Class_Descriptor cd__ZN3ccc9CC12x0y14E = {  "_ZN3ccc9CC12x0y14E", // class name
  bases__ZN3ccc9CC12x0y14E, 2,
  &(vtc__ZN3ccc9CC12x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x0y15  : ::ccc::AA12 , ::ccc::BB0 {
  ~CC12x0y15(); // tgen
  CC12x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x0y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x0y15 ::~CC12x0y15(){ note_dtor("_ZN3ccc9CC12x0y15E", this);} // tgen
ccc::CC12x0y15 ::CC12x0y15(){ note_ctor("_ZN3ccc9CC12x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x0y15E, buf);
    ::ccc::CC12x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x0y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC12x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x0y15E);
    dp->::ccc::CC12x0y15::~CC12x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x0y15E(Test__ZN3ccc9CC12x0y15E, "_ZN3ccc9CC12x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x0y15C1Ev();
extern void _ZN3ccc9CC12x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x0y15E[] = {
  NSPAIR(_ZN3ccc9CC12x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC12x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x0y15E[];
Class_Descriptor cd__ZN3ccc9CC12x0y15E = {  "_ZN3ccc9CC12x0y15E", // class name
  bases__ZN3ccc9CC12x0y15E, 2,
  &(vtc__ZN3ccc9CC12x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x0y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y0  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC12x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y03pqrEv
  ~CC12x1y0(); // tgen
  CC12x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y0E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y03abcEv");}
void  ccc::CC12x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y03efgEv");}
void  ccc::CC12x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y03pqrEv");}
ccc::CC12x1y0 ::~CC12x1y0(){ note_dtor("_ZN3ccc8CC12x1y0E", this);} // tgen
ccc::CC12x1y0 ::CC12x1y0(){ note_ctor("_ZN3ccc8CC12x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y0E, buf);
    ::ccc::CC12x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y0E);
    dp->::ccc::CC12x1y0::~CC12x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y0E(Test__ZN3ccc8CC12x1y0E, "_ZN3ccc8CC12x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y0C1Ev();
extern void _ZN3ccc8CC12x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y0E[] = {
  NSPAIR(_ZN3ccc8CC12x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y0E[];
extern void _ZN3ccc8CC12x1y03abcEv();
extern void _ZN3ccc8CC12x1y03efgEv();
extern void _ZN3ccc8CC12x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y03abcEv,_ZThn4_N3ccc8CC12x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y03pqrEv,_ZThn4_N3ccc8CC12x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y03efgEv,_ZThn4_N3ccc8CC12x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y03abcEv,_ZThn4_N3ccc8CC12x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y03pqrEv,_ZThn4_N3ccc8CC12x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y03efgEv,_ZThn4_N3ccc8CC12x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y0E[];
Class_Descriptor cd__ZN3ccc8CC12x1y0E = {  "_ZN3ccc8CC12x1y0E", // class name
  bases__ZN3ccc8CC12x1y0E, 2,
  &(vtc__ZN3ccc8CC12x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y1  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC12x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x1y13efgEv
  ~CC12x1y1(); // tgen
  CC12x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y1E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y13abcEv");}
void  ccc::CC12x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y13pqrEv");}
void  ccc::CC12x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y13efgEv");}
ccc::CC12x1y1 ::~CC12x1y1(){ note_dtor("_ZN3ccc8CC12x1y1E", this);} // tgen
ccc::CC12x1y1 ::CC12x1y1(){ note_ctor("_ZN3ccc8CC12x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y1E, buf);
    ::ccc::CC12x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y1E);
    dp->::ccc::CC12x1y1::~CC12x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y1E(Test__ZN3ccc8CC12x1y1E, "_ZN3ccc8CC12x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y1C1Ev();
extern void _ZN3ccc8CC12x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y1E[] = {
  NSPAIR(_ZN3ccc8CC12x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y1E[];
extern void _ZN3ccc8CC12x1y13abcEv();
extern void _ZN3ccc8CC12x1y13pqrEv();
extern void _ZN3ccc8CC12x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y13abcEv,_ZThn4_N3ccc8CC12x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y13pqrEv,_ZThn4_N3ccc8CC12x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y13efgEv,_ZThn4_N3ccc8CC12x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y13abcEv,_ZThn4_N3ccc8CC12x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y13pqrEv,_ZThn4_N3ccc8CC12x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y13efgEv,_ZThn4_N3ccc8CC12x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y1E[];
Class_Descriptor cd__ZN3ccc8CC12x1y1E = {  "_ZN3ccc8CC12x1y1E", // class name
  bases__ZN3ccc8CC12x1y1E, 2,
  &(vtc__ZN3ccc8CC12x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y2  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC12x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y23pqrEv
  ~CC12x1y2(); // tgen
  CC12x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y2E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y23efgEv");}
void  ccc::CC12x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y23abcEv");}
void  ccc::CC12x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y23pqrEv");}
ccc::CC12x1y2 ::~CC12x1y2(){ note_dtor("_ZN3ccc8CC12x1y2E", this);} // tgen
ccc::CC12x1y2 ::CC12x1y2(){ note_ctor("_ZN3ccc8CC12x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y2E, buf);
    ::ccc::CC12x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y2E);
    dp->::ccc::CC12x1y2::~CC12x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y2E(Test__ZN3ccc8CC12x1y2E, "_ZN3ccc8CC12x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y2C1Ev();
extern void _ZN3ccc8CC12x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y2E[] = {
  NSPAIR(_ZN3ccc8CC12x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y2E[];
extern void _ZN3ccc8CC12x1y23abcEv();
extern void _ZN3ccc8CC12x1y23efgEv();
extern void _ZN3ccc8CC12x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y23abcEv,_ZThn4_N3ccc8CC12x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y23pqrEv,_ZThn4_N3ccc8CC12x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y23efgEv,_ZThn4_N3ccc8CC12x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y23abcEv,_ZThn4_N3ccc8CC12x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y23pqrEv,_ZThn4_N3ccc8CC12x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y23efgEv,_ZThn4_N3ccc8CC12x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y2E[];
Class_Descriptor cd__ZN3ccc8CC12x1y2E = {  "_ZN3ccc8CC12x1y2E", // class name
  bases__ZN3ccc8CC12x1y2E, 2,
  &(vtc__ZN3ccc8CC12x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y3  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC12x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x1y33abcEv
  ~CC12x1y3(); // tgen
  CC12x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y3E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y33efgEv");}
void  ccc::CC12x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y33pqrEv");}
void  ccc::CC12x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y33abcEv");}
ccc::CC12x1y3 ::~CC12x1y3(){ note_dtor("_ZN3ccc8CC12x1y3E", this);} // tgen
ccc::CC12x1y3 ::CC12x1y3(){ note_ctor("_ZN3ccc8CC12x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y3E, buf);
    ::ccc::CC12x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y3E);
    dp->::ccc::CC12x1y3::~CC12x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y3E(Test__ZN3ccc8CC12x1y3E, "_ZN3ccc8CC12x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y3C1Ev();
extern void _ZN3ccc8CC12x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y3E[] = {
  NSPAIR(_ZN3ccc8CC12x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y3E[];
extern void _ZN3ccc8CC12x1y33abcEv();
extern void _ZN3ccc8CC12x1y33efgEv();
extern void _ZN3ccc8CC12x1y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y33abcEv,_ZThn4_N3ccc8CC12x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y33pqrEv,_ZThn4_N3ccc8CC12x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y33efgEv,_ZThn4_N3ccc8CC12x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y33abcEv,_ZThn4_N3ccc8CC12x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y33pqrEv,_ZThn4_N3ccc8CC12x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y33efgEv,_ZThn4_N3ccc8CC12x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y3E[];
Class_Descriptor cd__ZN3ccc8CC12x1y3E = {  "_ZN3ccc8CC12x1y3E", // class name
  bases__ZN3ccc8CC12x1y3E, 2,
  &(vtc__ZN3ccc8CC12x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y4  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC12x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x1y43efgEv
  ~CC12x1y4(); // tgen
  CC12x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y4E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y43pqrEv");}
void  ccc::CC12x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y43abcEv");}
void  ccc::CC12x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y43efgEv");}
ccc::CC12x1y4 ::~CC12x1y4(){ note_dtor("_ZN3ccc8CC12x1y4E", this);} // tgen
ccc::CC12x1y4 ::CC12x1y4(){ note_ctor("_ZN3ccc8CC12x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y4E, buf);
    ::ccc::CC12x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y4E);
    dp->::ccc::CC12x1y4::~CC12x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y4E(Test__ZN3ccc8CC12x1y4E, "_ZN3ccc8CC12x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y4C1Ev();
extern void _ZN3ccc8CC12x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y4E[] = {
  NSPAIR(_ZN3ccc8CC12x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y4E[];
extern void _ZN3ccc8CC12x1y43abcEv();
extern void _ZN3ccc8CC12x1y43pqrEv();
extern void _ZN3ccc8CC12x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y43abcEv,_ZThn4_N3ccc8CC12x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y43pqrEv,_ZThn4_N3ccc8CC12x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y43efgEv,_ZThn4_N3ccc8CC12x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y43abcEv,_ZThn4_N3ccc8CC12x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y43pqrEv,_ZThn4_N3ccc8CC12x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y43efgEv,_ZThn4_N3ccc8CC12x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y4E[];
Class_Descriptor cd__ZN3ccc8CC12x1y4E = {  "_ZN3ccc8CC12x1y4E", // class name
  bases__ZN3ccc8CC12x1y4E, 2,
  &(vtc__ZN3ccc8CC12x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y5  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC12x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x1y53abcEv
  ~CC12x1y5(); // tgen
  CC12x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y5E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y53pqrEv");}
void  ccc::CC12x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y53efgEv");}
void  ccc::CC12x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y53abcEv");}
ccc::CC12x1y5 ::~CC12x1y5(){ note_dtor("_ZN3ccc8CC12x1y5E", this);} // tgen
ccc::CC12x1y5 ::CC12x1y5(){ note_ctor("_ZN3ccc8CC12x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y5E, buf);
    ::ccc::CC12x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y5E);
    dp->::ccc::CC12x1y5::~CC12x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y5E(Test__ZN3ccc8CC12x1y5E, "_ZN3ccc8CC12x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y5C1Ev();
extern void _ZN3ccc8CC12x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y5E[] = {
  NSPAIR(_ZN3ccc8CC12x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y5E[];
extern void _ZN3ccc8CC12x1y53abcEv();
extern void _ZN3ccc8CC12x1y53pqrEv();
extern void _ZN3ccc8CC12x1y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y53abcEv,_ZThn4_N3ccc8CC12x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y53pqrEv,_ZThn4_N3ccc8CC12x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y53efgEv,_ZThn4_N3ccc8CC12x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y53abcEv,_ZThn4_N3ccc8CC12x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y53pqrEv,_ZThn4_N3ccc8CC12x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y53efgEv,_ZThn4_N3ccc8CC12x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y5E[];
Class_Descriptor cd__ZN3ccc8CC12x1y5E = {  "_ZN3ccc8CC12x1y5E", // class name
  bases__ZN3ccc8CC12x1y5E, 2,
  &(vtc__ZN3ccc8CC12x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y6  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC12x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x1y63efgEv
  ~CC12x1y6(); // tgen
  CC12x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y6E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y63abcEv");}
void  ccc::CC12x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y63efgEv");}
ccc::CC12x1y6 ::~CC12x1y6(){ note_dtor("_ZN3ccc8CC12x1y6E", this);} // tgen
ccc::CC12x1y6 ::CC12x1y6(){ note_ctor("_ZN3ccc8CC12x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y6E, buf);
    ::ccc::CC12x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y6E);
    dp->::ccc::CC12x1y6::~CC12x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y6E(Test__ZN3ccc8CC12x1y6E, "_ZN3ccc8CC12x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y6C1Ev();
extern void _ZN3ccc8CC12x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y6E[] = {
  NSPAIR(_ZN3ccc8CC12x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y6E[];
extern void _ZN3ccc8CC12x1y63abcEv();
extern void _ZN3ccc8CC12x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y63abcEv,_ZThn4_N3ccc8CC12x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y63efgEv,_ZThn4_N3ccc8CC12x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y63abcEv,_ZThn4_N3ccc8CC12x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y63efgEv,_ZThn4_N3ccc8CC12x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y6E[];
Class_Descriptor cd__ZN3ccc8CC12x1y6E = {  "_ZN3ccc8CC12x1y6E", // class name
  bases__ZN3ccc8CC12x1y6E, 2,
  &(vtc__ZN3ccc8CC12x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y7  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC12x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y73pqrEv
  ~CC12x1y7(); // tgen
  CC12x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y7E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y73abcEv");}
void  ccc::CC12x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y73pqrEv");}
ccc::CC12x1y7 ::~CC12x1y7(){ note_dtor("_ZN3ccc8CC12x1y7E", this);} // tgen
ccc::CC12x1y7 ::CC12x1y7(){ note_ctor("_ZN3ccc8CC12x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y7E, buf);
    ::ccc::CC12x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y7E);
    dp->::ccc::CC12x1y7::~CC12x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y7E(Test__ZN3ccc8CC12x1y7E, "_ZN3ccc8CC12x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y7C1Ev();
extern void _ZN3ccc8CC12x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y7E[] = {
  NSPAIR(_ZN3ccc8CC12x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y7E[];
extern void _ZN3ccc8CC12x1y73abcEv();
extern void _ZN3ccc8CC12x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y73abcEv,_ZThn4_N3ccc8CC12x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y73pqrEv,_ZThn4_N3ccc8CC12x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y73abcEv,_ZThn4_N3ccc8CC12x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y73pqrEv,_ZThn4_N3ccc8CC12x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y7E[];
Class_Descriptor cd__ZN3ccc8CC12x1y7E = {  "_ZN3ccc8CC12x1y7E", // class name
  bases__ZN3ccc8CC12x1y7E, 2,
  &(vtc__ZN3ccc8CC12x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y8  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC12x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x1y83abcEv
  ~CC12x1y8(); // tgen
  CC12x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y8E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y83efgEv");}
void  ccc::CC12x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x1y83abcEv");}
ccc::CC12x1y8 ::~CC12x1y8(){ note_dtor("_ZN3ccc8CC12x1y8E", this);} // tgen
ccc::CC12x1y8 ::CC12x1y8(){ note_ctor("_ZN3ccc8CC12x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y8E, buf);
    ::ccc::CC12x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y8E);
    dp->::ccc::CC12x1y8::~CC12x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y8E(Test__ZN3ccc8CC12x1y8E, "_ZN3ccc8CC12x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y8C1Ev();
extern void _ZN3ccc8CC12x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y8E[] = {
  NSPAIR(_ZN3ccc8CC12x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y8E[];
extern void _ZN3ccc8CC12x1y83abcEv();
extern void _ZN3ccc8CC12x1y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y83abcEv,_ZThn4_N3ccc8CC12x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y83efgEv,_ZThn4_N3ccc8CC12x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y83abcEv,_ZThn4_N3ccc8CC12x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y83efgEv,_ZThn4_N3ccc8CC12x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y8E[];
Class_Descriptor cd__ZN3ccc8CC12x1y8E = {  "_ZN3ccc8CC12x1y8E", // class name
  bases__ZN3ccc8CC12x1y8E, 2,
  &(vtc__ZN3ccc8CC12x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y9  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC12x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x1y93pqrEv
  ~CC12x1y9(); // tgen
  CC12x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x1y9E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x1y93efgEv");}
void  ccc::CC12x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x1y93pqrEv");}
ccc::CC12x1y9 ::~CC12x1y9(){ note_dtor("_ZN3ccc8CC12x1y9E", this);} // tgen
ccc::CC12x1y9 ::CC12x1y9(){ note_ctor("_ZN3ccc8CC12x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x1y9E, buf);
    ::ccc::CC12x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x1y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC12x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x1y9E);
    dp->::ccc::CC12x1y9::~CC12x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x1y9E(Test__ZN3ccc8CC12x1y9E, "_ZN3ccc8CC12x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x1y9C1Ev();
extern void _ZN3ccc8CC12x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x1y9E[] = {
  NSPAIR(_ZN3ccc8CC12x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC12x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x1y93efgEv();
extern void _ZN3ccc8CC12x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y93pqrEv,_ZThn4_N3ccc8CC12x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x1y93efgEv,_ZThn4_N3ccc8CC12x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y93pqrEv,_ZThn4_N3ccc8CC12x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x1y93efgEv,_ZThn4_N3ccc8CC12x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x1y9E[];
Class_Descriptor cd__ZN3ccc8CC12x1y9E = {  "_ZN3ccc8CC12x1y9E", // class name
  bases__ZN3ccc8CC12x1y9E, 2,
  &(vtc__ZN3ccc8CC12x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x1y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y10  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC12x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x1y103abcEv
  ~CC12x1y10(); // tgen
  CC12x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y10E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x1y103pqrEv");}
void  ccc::CC12x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x1y103abcEv");}
ccc::CC12x1y10 ::~CC12x1y10(){ note_dtor("_ZN3ccc9CC12x1y10E", this);} // tgen
ccc::CC12x1y10 ::CC12x1y10(){ note_ctor("_ZN3ccc9CC12x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y10E, buf);
    ::ccc::CC12x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y10E);
    dp->::ccc::CC12x1y10::~CC12x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y10E(Test__ZN3ccc9CC12x1y10E, "_ZN3ccc9CC12x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y10C1Ev();
extern void _ZN3ccc9CC12x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y10E[] = {
  NSPAIR(_ZN3ccc9CC12x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y10E[];
extern void _ZN3ccc9CC12x1y103abcEv();
extern void _ZN3ccc9CC12x1y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y103abcEv,_ZThn4_N3ccc9CC12x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y103pqrEv,_ZThn4_N3ccc9CC12x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y103abcEv,_ZThn4_N3ccc9CC12x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y103pqrEv,_ZThn4_N3ccc9CC12x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y10E[];
Class_Descriptor cd__ZN3ccc9CC12x1y10E = {  "_ZN3ccc9CC12x1y10E", // class name
  bases__ZN3ccc9CC12x1y10E, 2,
  &(vtc__ZN3ccc9CC12x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y11  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC12x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x1y113efgEv
  ~CC12x1y11(); // tgen
  CC12x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y11E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x1y113pqrEv");}
void  ccc::CC12x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x1y113efgEv");}
ccc::CC12x1y11 ::~CC12x1y11(){ note_dtor("_ZN3ccc9CC12x1y11E", this);} // tgen
ccc::CC12x1y11 ::CC12x1y11(){ note_ctor("_ZN3ccc9CC12x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y11E, buf);
    ::ccc::CC12x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y11E);
    dp->::ccc::CC12x1y11::~CC12x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y11E(Test__ZN3ccc9CC12x1y11E, "_ZN3ccc9CC12x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y11C1Ev();
extern void _ZN3ccc9CC12x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y11E[] = {
  NSPAIR(_ZN3ccc9CC12x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x1y113pqrEv();
extern void _ZN3ccc9CC12x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y113pqrEv,_ZThn4_N3ccc9CC12x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y113efgEv,_ZThn4_N3ccc9CC12x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y113pqrEv,_ZThn4_N3ccc9CC12x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y113efgEv,_ZThn4_N3ccc9CC12x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y11E[];
Class_Descriptor cd__ZN3ccc9CC12x1y11E = {  "_ZN3ccc9CC12x1y11E", // class name
  bases__ZN3ccc9CC12x1y11E, 2,
  &(vtc__ZN3ccc9CC12x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y12  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC12x1y123abcEv
  ~CC12x1y12(); // tgen
  CC12x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y12E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC12x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x1y123abcEv");}
ccc::CC12x1y12 ::~CC12x1y12(){ note_dtor("_ZN3ccc9CC12x1y12E", this);} // tgen
ccc::CC12x1y12 ::CC12x1y12(){ note_ctor("_ZN3ccc9CC12x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y12E, buf);
    ::ccc::CC12x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y12E);
    dp->::ccc::CC12x1y12::~CC12x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y12E(Test__ZN3ccc9CC12x1y12E, "_ZN3ccc9CC12x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y12C1Ev();
extern void _ZN3ccc9CC12x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y12E[] = {
  NSPAIR(_ZN3ccc9CC12x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y12E[];
extern void _ZN3ccc9CC12x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y123abcEv,_ZThn4_N3ccc9CC12x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y123abcEv,_ZThn4_N3ccc9CC12x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y12E[];
Class_Descriptor cd__ZN3ccc9CC12x1y12E = {  "_ZN3ccc9CC12x1y12E", // class name
  bases__ZN3ccc9CC12x1y12E, 2,
  &(vtc__ZN3ccc9CC12x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y13  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC12x1y133efgEv
  ~CC12x1y13(); // tgen
  CC12x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y13E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC12x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x1y133efgEv");}
ccc::CC12x1y13 ::~CC12x1y13(){ note_dtor("_ZN3ccc9CC12x1y13E", this);} // tgen
ccc::CC12x1y13 ::CC12x1y13(){ note_ctor("_ZN3ccc9CC12x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y13E, buf);
    ::ccc::CC12x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y13E);
    dp->::ccc::CC12x1y13::~CC12x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y13E(Test__ZN3ccc9CC12x1y13E, "_ZN3ccc9CC12x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y13C1Ev();
extern void _ZN3ccc9CC12x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y13E[] = {
  NSPAIR(_ZN3ccc9CC12x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y133efgEv,_ZThn4_N3ccc9CC12x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y133efgEv,_ZThn4_N3ccc9CC12x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y13E[];
Class_Descriptor cd__ZN3ccc9CC12x1y13E = {  "_ZN3ccc9CC12x1y13E", // class name
  bases__ZN3ccc9CC12x1y13E, 2,
  &(vtc__ZN3ccc9CC12x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y14  : ::ccc::AA12 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC12x1y143pqrEv
  ~CC12x1y14(); // tgen
  CC12x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y14E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC12x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x1y143pqrEv");}
ccc::CC12x1y14 ::~CC12x1y14(){ note_dtor("_ZN3ccc9CC12x1y14E", this);} // tgen
ccc::CC12x1y14 ::CC12x1y14(){ note_ctor("_ZN3ccc9CC12x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y14E, buf);
    ::ccc::CC12x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y14E);
    dp->::ccc::CC12x1y14::~CC12x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y14E(Test__ZN3ccc9CC12x1y14E, "_ZN3ccc9CC12x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y14C1Ev();
extern void _ZN3ccc9CC12x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y14E[] = {
  NSPAIR(_ZN3ccc9CC12x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x1y143pqrEv,_ZThn4_N3ccc9CC12x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x1y143pqrEv,_ZThn4_N3ccc9CC12x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y14E[];
Class_Descriptor cd__ZN3ccc9CC12x1y14E = {  "_ZN3ccc9CC12x1y14E", // class name
  bases__ZN3ccc9CC12x1y14E, 2,
  &(vtc__ZN3ccc9CC12x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x1y15  : ::ccc::AA12 , ::ccc::BB1 {
  ~CC12x1y15(); // tgen
  CC12x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x1y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x1y15 ::~CC12x1y15(){ note_dtor("_ZN3ccc9CC12x1y15E", this);} // tgen
ccc::CC12x1y15 ::CC12x1y15(){ note_ctor("_ZN3ccc9CC12x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x1y15E, buf);
    ::ccc::CC12x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x1y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC12x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x1y15E);
    dp->::ccc::CC12x1y15::~CC12x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x1y15E(Test__ZN3ccc9CC12x1y15E, "_ZN3ccc9CC12x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x1y15C1Ev();
extern void _ZN3ccc9CC12x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x1y15E[] = {
  NSPAIR(_ZN3ccc9CC12x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC12x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x1y15E[];
Class_Descriptor cd__ZN3ccc9CC12x1y15E = {  "_ZN3ccc9CC12x1y15E", // class name
  bases__ZN3ccc9CC12x1y15E, 2,
  &(vtc__ZN3ccc9CC12x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x1y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y0  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC12x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y03pqrEv
  ~CC12x2y0(); // tgen
  CC12x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y0E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y03abcEv");}
void  ccc::CC12x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y03efgEv");}
void  ccc::CC12x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y03pqrEv");}
ccc::CC12x2y0 ::~CC12x2y0(){ note_dtor("_ZN3ccc8CC12x2y0E", this);} // tgen
ccc::CC12x2y0 ::CC12x2y0(){ note_ctor("_ZN3ccc8CC12x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y0E, buf);
    ::ccc::CC12x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y0E);
    dp->::ccc::CC12x2y0::~CC12x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y0E(Test__ZN3ccc8CC12x2y0E, "_ZN3ccc8CC12x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y0C1Ev();
extern void _ZN3ccc8CC12x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y0E[] = {
  NSPAIR(_ZN3ccc8CC12x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y0E[];
extern void _ZN3ccc8CC12x2y03abcEv();
extern void _ZN3ccc8CC12x2y03efgEv();
extern void _ZN3ccc8CC12x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y03efgEv,_ZThn4_N3ccc8CC12x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y03abcEv,_ZThn4_N3ccc8CC12x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y03pqrEv,_ZThn4_N3ccc8CC12x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y03efgEv,_ZThn4_N3ccc8CC12x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y03abcEv,_ZThn4_N3ccc8CC12x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y03pqrEv,_ZThn4_N3ccc8CC12x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y0E[];
Class_Descriptor cd__ZN3ccc8CC12x2y0E = {  "_ZN3ccc8CC12x2y0E", // class name
  bases__ZN3ccc8CC12x2y0E, 2,
  &(vtc__ZN3ccc8CC12x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y1  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC12x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x2y13efgEv
  ~CC12x2y1(); // tgen
  CC12x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y1E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y13abcEv");}
void  ccc::CC12x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y13pqrEv");}
void  ccc::CC12x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y13efgEv");}
ccc::CC12x2y1 ::~CC12x2y1(){ note_dtor("_ZN3ccc8CC12x2y1E", this);} // tgen
ccc::CC12x2y1 ::CC12x2y1(){ note_ctor("_ZN3ccc8CC12x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y1E, buf);
    ::ccc::CC12x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y1E);
    dp->::ccc::CC12x2y1::~CC12x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y1E(Test__ZN3ccc8CC12x2y1E, "_ZN3ccc8CC12x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y1C1Ev();
extern void _ZN3ccc8CC12x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y1E[] = {
  NSPAIR(_ZN3ccc8CC12x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y1E[];
extern void _ZN3ccc8CC12x2y13abcEv();
extern void _ZN3ccc8CC12x2y13pqrEv();
extern void _ZN3ccc8CC12x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y13efgEv,_ZThn4_N3ccc8CC12x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y13abcEv,_ZThn4_N3ccc8CC12x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y13pqrEv,_ZThn4_N3ccc8CC12x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y13efgEv,_ZThn4_N3ccc8CC12x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y13abcEv,_ZThn4_N3ccc8CC12x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y13pqrEv,_ZThn4_N3ccc8CC12x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y1E[];
Class_Descriptor cd__ZN3ccc8CC12x2y1E = {  "_ZN3ccc8CC12x2y1E", // class name
  bases__ZN3ccc8CC12x2y1E, 2,
  &(vtc__ZN3ccc8CC12x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y2  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC12x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y23pqrEv
  ~CC12x2y2(); // tgen
  CC12x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y2E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y23efgEv");}
void  ccc::CC12x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y23abcEv");}
void  ccc::CC12x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y23pqrEv");}
ccc::CC12x2y2 ::~CC12x2y2(){ note_dtor("_ZN3ccc8CC12x2y2E", this);} // tgen
ccc::CC12x2y2 ::CC12x2y2(){ note_ctor("_ZN3ccc8CC12x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y2E, buf);
    ::ccc::CC12x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y2E);
    dp->::ccc::CC12x2y2::~CC12x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y2E(Test__ZN3ccc8CC12x2y2E, "_ZN3ccc8CC12x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y2C1Ev();
extern void _ZN3ccc8CC12x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y2E[] = {
  NSPAIR(_ZN3ccc8CC12x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y2E[];
extern void _ZN3ccc8CC12x2y23abcEv();
extern void _ZN3ccc8CC12x2y23efgEv();
extern void _ZN3ccc8CC12x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y23efgEv,_ZThn4_N3ccc8CC12x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y23abcEv,_ZThn4_N3ccc8CC12x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y23pqrEv,_ZThn4_N3ccc8CC12x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y23efgEv,_ZThn4_N3ccc8CC12x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y23abcEv,_ZThn4_N3ccc8CC12x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y23pqrEv,_ZThn4_N3ccc8CC12x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y2E[];
Class_Descriptor cd__ZN3ccc8CC12x2y2E = {  "_ZN3ccc8CC12x2y2E", // class name
  bases__ZN3ccc8CC12x2y2E, 2,
  &(vtc__ZN3ccc8CC12x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y3  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC12x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x2y33abcEv
  ~CC12x2y3(); // tgen
  CC12x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y3E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y33efgEv");}
void  ccc::CC12x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y33pqrEv");}
void  ccc::CC12x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y33abcEv");}
ccc::CC12x2y3 ::~CC12x2y3(){ note_dtor("_ZN3ccc8CC12x2y3E", this);} // tgen
ccc::CC12x2y3 ::CC12x2y3(){ note_ctor("_ZN3ccc8CC12x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y3E, buf);
    ::ccc::CC12x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y3E);
    dp->::ccc::CC12x2y3::~CC12x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y3E(Test__ZN3ccc8CC12x2y3E, "_ZN3ccc8CC12x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y3C1Ev();
extern void _ZN3ccc8CC12x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y3E[] = {
  NSPAIR(_ZN3ccc8CC12x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y3E[];
extern void _ZN3ccc8CC12x2y33abcEv();
extern void _ZN3ccc8CC12x2y33efgEv();
extern void _ZN3ccc8CC12x2y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y33efgEv,_ZThn4_N3ccc8CC12x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y33abcEv,_ZThn4_N3ccc8CC12x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y33pqrEv,_ZThn4_N3ccc8CC12x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y33efgEv,_ZThn4_N3ccc8CC12x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y33abcEv,_ZThn4_N3ccc8CC12x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y33pqrEv,_ZThn4_N3ccc8CC12x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y3E[];
Class_Descriptor cd__ZN3ccc8CC12x2y3E = {  "_ZN3ccc8CC12x2y3E", // class name
  bases__ZN3ccc8CC12x2y3E, 2,
  &(vtc__ZN3ccc8CC12x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y4  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC12x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x2y43efgEv
  ~CC12x2y4(); // tgen
  CC12x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y4E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y43pqrEv");}
void  ccc::CC12x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y43abcEv");}
void  ccc::CC12x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y43efgEv");}
ccc::CC12x2y4 ::~CC12x2y4(){ note_dtor("_ZN3ccc8CC12x2y4E", this);} // tgen
ccc::CC12x2y4 ::CC12x2y4(){ note_ctor("_ZN3ccc8CC12x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y4E, buf);
    ::ccc::CC12x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y4E);
    dp->::ccc::CC12x2y4::~CC12x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y4E(Test__ZN3ccc8CC12x2y4E, "_ZN3ccc8CC12x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y4C1Ev();
extern void _ZN3ccc8CC12x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y4E[] = {
  NSPAIR(_ZN3ccc8CC12x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y4E[];
extern void _ZN3ccc8CC12x2y43abcEv();
extern void _ZN3ccc8CC12x2y43pqrEv();
extern void _ZN3ccc8CC12x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y43efgEv,_ZThn4_N3ccc8CC12x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y43abcEv,_ZThn4_N3ccc8CC12x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y43pqrEv,_ZThn4_N3ccc8CC12x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y43efgEv,_ZThn4_N3ccc8CC12x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y43abcEv,_ZThn4_N3ccc8CC12x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y43pqrEv,_ZThn4_N3ccc8CC12x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y4E[];
Class_Descriptor cd__ZN3ccc8CC12x2y4E = {  "_ZN3ccc8CC12x2y4E", // class name
  bases__ZN3ccc8CC12x2y4E, 2,
  &(vtc__ZN3ccc8CC12x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y5  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC12x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x2y53abcEv
  ~CC12x2y5(); // tgen
  CC12x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y5E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y53pqrEv");}
void  ccc::CC12x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y53efgEv");}
void  ccc::CC12x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y53abcEv");}
ccc::CC12x2y5 ::~CC12x2y5(){ note_dtor("_ZN3ccc8CC12x2y5E", this);} // tgen
ccc::CC12x2y5 ::CC12x2y5(){ note_ctor("_ZN3ccc8CC12x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y5E, buf);
    ::ccc::CC12x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y5E);
    dp->::ccc::CC12x2y5::~CC12x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y5E(Test__ZN3ccc8CC12x2y5E, "_ZN3ccc8CC12x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y5C1Ev();
extern void _ZN3ccc8CC12x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y5E[] = {
  NSPAIR(_ZN3ccc8CC12x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y5E[];
extern void _ZN3ccc8CC12x2y53abcEv();
extern void _ZN3ccc8CC12x2y53pqrEv();
extern void _ZN3ccc8CC12x2y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y53efgEv,_ZThn4_N3ccc8CC12x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y53abcEv,_ZThn4_N3ccc8CC12x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y53pqrEv,_ZThn4_N3ccc8CC12x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y53efgEv,_ZThn4_N3ccc8CC12x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y53abcEv,_ZThn4_N3ccc8CC12x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y53pqrEv,_ZThn4_N3ccc8CC12x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y5E[];
Class_Descriptor cd__ZN3ccc8CC12x2y5E = {  "_ZN3ccc8CC12x2y5E", // class name
  bases__ZN3ccc8CC12x2y5E, 2,
  &(vtc__ZN3ccc8CC12x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y6  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC12x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x2y63efgEv
  ~CC12x2y6(); // tgen
  CC12x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y6E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y63abcEv");}
void  ccc::CC12x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y63efgEv");}
ccc::CC12x2y6 ::~CC12x2y6(){ note_dtor("_ZN3ccc8CC12x2y6E", this);} // tgen
ccc::CC12x2y6 ::CC12x2y6(){ note_ctor("_ZN3ccc8CC12x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y6E, buf);
    ::ccc::CC12x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y6E);
    dp->::ccc::CC12x2y6::~CC12x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y6E(Test__ZN3ccc8CC12x2y6E, "_ZN3ccc8CC12x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y6C1Ev();
extern void _ZN3ccc8CC12x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y6E[] = {
  NSPAIR(_ZN3ccc8CC12x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y6E[];
extern void _ZN3ccc8CC12x2y63abcEv();
extern void _ZN3ccc8CC12x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y63efgEv,_ZThn4_N3ccc8CC12x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y63abcEv,_ZThn4_N3ccc8CC12x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y63efgEv,_ZThn4_N3ccc8CC12x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y63abcEv,_ZThn4_N3ccc8CC12x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y6E[];
Class_Descriptor cd__ZN3ccc8CC12x2y6E = {  "_ZN3ccc8CC12x2y6E", // class name
  bases__ZN3ccc8CC12x2y6E, 2,
  &(vtc__ZN3ccc8CC12x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y7  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC12x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y73pqrEv
  ~CC12x2y7(); // tgen
  CC12x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y7E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y73abcEv");}
void  ccc::CC12x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y73pqrEv");}
ccc::CC12x2y7 ::~CC12x2y7(){ note_dtor("_ZN3ccc8CC12x2y7E", this);} // tgen
ccc::CC12x2y7 ::CC12x2y7(){ note_ctor("_ZN3ccc8CC12x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y7E, buf);
    ::ccc::CC12x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y7E);
    dp->::ccc::CC12x2y7::~CC12x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y7E(Test__ZN3ccc8CC12x2y7E, "_ZN3ccc8CC12x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y7C1Ev();
extern void _ZN3ccc8CC12x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y7E[] = {
  NSPAIR(_ZN3ccc8CC12x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y7E[];
extern void _ZN3ccc8CC12x2y73abcEv();
extern void _ZN3ccc8CC12x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y73abcEv,_ZThn4_N3ccc8CC12x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y73pqrEv,_ZThn4_N3ccc8CC12x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y73abcEv,_ZThn4_N3ccc8CC12x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y73pqrEv,_ZThn4_N3ccc8CC12x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y7E[];
Class_Descriptor cd__ZN3ccc8CC12x2y7E = {  "_ZN3ccc8CC12x2y7E", // class name
  bases__ZN3ccc8CC12x2y7E, 2,
  &(vtc__ZN3ccc8CC12x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y8  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC12x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x2y83abcEv
  ~CC12x2y8(); // tgen
  CC12x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y8E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y83efgEv");}
void  ccc::CC12x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x2y83abcEv");}
ccc::CC12x2y8 ::~CC12x2y8(){ note_dtor("_ZN3ccc8CC12x2y8E", this);} // tgen
ccc::CC12x2y8 ::CC12x2y8(){ note_ctor("_ZN3ccc8CC12x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y8E, buf);
    ::ccc::CC12x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y8E);
    dp->::ccc::CC12x2y8::~CC12x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y8E(Test__ZN3ccc8CC12x2y8E, "_ZN3ccc8CC12x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y8C1Ev();
extern void _ZN3ccc8CC12x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y8E[] = {
  NSPAIR(_ZN3ccc8CC12x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y8E[];
extern void _ZN3ccc8CC12x2y83abcEv();
extern void _ZN3ccc8CC12x2y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y83efgEv,_ZThn4_N3ccc8CC12x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y83abcEv,_ZThn4_N3ccc8CC12x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y83efgEv,_ZThn4_N3ccc8CC12x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y83abcEv,_ZThn4_N3ccc8CC12x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y8E[];
Class_Descriptor cd__ZN3ccc8CC12x2y8E = {  "_ZN3ccc8CC12x2y8E", // class name
  bases__ZN3ccc8CC12x2y8E, 2,
  &(vtc__ZN3ccc8CC12x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y9  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC12x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x2y93pqrEv
  ~CC12x2y9(); // tgen
  CC12x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x2y9E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x2y93efgEv");}
void  ccc::CC12x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x2y93pqrEv");}
ccc::CC12x2y9 ::~CC12x2y9(){ note_dtor("_ZN3ccc8CC12x2y9E", this);} // tgen
ccc::CC12x2y9 ::CC12x2y9(){ note_ctor("_ZN3ccc8CC12x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x2y9E, buf);
    ::ccc::CC12x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x2y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC12x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x2y9E);
    dp->::ccc::CC12x2y9::~CC12x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x2y9E(Test__ZN3ccc8CC12x2y9E, "_ZN3ccc8CC12x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x2y9C1Ev();
extern void _ZN3ccc8CC12x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x2y9E[] = {
  NSPAIR(_ZN3ccc8CC12x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC12x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x2y93efgEv();
extern void _ZN3ccc8CC12x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y93efgEv,_ZThn4_N3ccc8CC12x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x2y93pqrEv,_ZThn4_N3ccc8CC12x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y93efgEv,_ZThn4_N3ccc8CC12x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x2y93pqrEv,_ZThn4_N3ccc8CC12x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x2y9E[];
Class_Descriptor cd__ZN3ccc8CC12x2y9E = {  "_ZN3ccc8CC12x2y9E", // class name
  bases__ZN3ccc8CC12x2y9E, 2,
  &(vtc__ZN3ccc8CC12x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x2y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y10  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC12x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x2y103abcEv
  ~CC12x2y10(); // tgen
  CC12x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y10E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x2y103pqrEv");}
void  ccc::CC12x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x2y103abcEv");}
ccc::CC12x2y10 ::~CC12x2y10(){ note_dtor("_ZN3ccc9CC12x2y10E", this);} // tgen
ccc::CC12x2y10 ::CC12x2y10(){ note_ctor("_ZN3ccc9CC12x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y10E, buf);
    ::ccc::CC12x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y10E);
    dp->::ccc::CC12x2y10::~CC12x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y10E(Test__ZN3ccc9CC12x2y10E, "_ZN3ccc9CC12x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y10C1Ev();
extern void _ZN3ccc9CC12x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y10E[] = {
  NSPAIR(_ZN3ccc9CC12x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y10E[];
extern void _ZN3ccc9CC12x2y103abcEv();
extern void _ZN3ccc9CC12x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y103abcEv,_ZThn4_N3ccc9CC12x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y103pqrEv,_ZThn4_N3ccc9CC12x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y103abcEv,_ZThn4_N3ccc9CC12x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y103pqrEv,_ZThn4_N3ccc9CC12x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y10E[];
Class_Descriptor cd__ZN3ccc9CC12x2y10E = {  "_ZN3ccc9CC12x2y10E", // class name
  bases__ZN3ccc9CC12x2y10E, 2,
  &(vtc__ZN3ccc9CC12x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y11  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC12x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x2y113efgEv
  ~CC12x2y11(); // tgen
  CC12x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y11E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x2y113pqrEv");}
void  ccc::CC12x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x2y113efgEv");}
ccc::CC12x2y11 ::~CC12x2y11(){ note_dtor("_ZN3ccc9CC12x2y11E", this);} // tgen
ccc::CC12x2y11 ::CC12x2y11(){ note_ctor("_ZN3ccc9CC12x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y11E, buf);
    ::ccc::CC12x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y11E);
    dp->::ccc::CC12x2y11::~CC12x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y11E(Test__ZN3ccc9CC12x2y11E, "_ZN3ccc9CC12x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y11C1Ev();
extern void _ZN3ccc9CC12x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y11E[] = {
  NSPAIR(_ZN3ccc9CC12x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x2y113pqrEv();
extern void _ZN3ccc9CC12x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y113efgEv,_ZThn4_N3ccc9CC12x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y113pqrEv,_ZThn4_N3ccc9CC12x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y113efgEv,_ZThn4_N3ccc9CC12x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y113pqrEv,_ZThn4_N3ccc9CC12x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y11E[];
Class_Descriptor cd__ZN3ccc9CC12x2y11E = {  "_ZN3ccc9CC12x2y11E", // class name
  bases__ZN3ccc9CC12x2y11E, 2,
  &(vtc__ZN3ccc9CC12x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y12  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC12x2y123abcEv
  ~CC12x2y12(); // tgen
  CC12x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y12E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x2y123abcEv");}
ccc::CC12x2y12 ::~CC12x2y12(){ note_dtor("_ZN3ccc9CC12x2y12E", this);} // tgen
ccc::CC12x2y12 ::CC12x2y12(){ note_ctor("_ZN3ccc9CC12x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y12E, buf);
    ::ccc::CC12x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y12E);
    dp->::ccc::CC12x2y12::~CC12x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y12E(Test__ZN3ccc9CC12x2y12E, "_ZN3ccc9CC12x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y12C1Ev();
extern void _ZN3ccc9CC12x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y12E[] = {
  NSPAIR(_ZN3ccc9CC12x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y12E[];
extern void _ZN3ccc9CC12x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y123abcEv,_ZThn4_N3ccc9CC12x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y123abcEv,_ZThn4_N3ccc9CC12x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y12E[];
Class_Descriptor cd__ZN3ccc9CC12x2y12E = {  "_ZN3ccc9CC12x2y12E", // class name
  bases__ZN3ccc9CC12x2y12E, 2,
  &(vtc__ZN3ccc9CC12x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y13  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC12x2y133efgEv
  ~CC12x2y13(); // tgen
  CC12x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y13E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x2y133efgEv");}
ccc::CC12x2y13 ::~CC12x2y13(){ note_dtor("_ZN3ccc9CC12x2y13E", this);} // tgen
ccc::CC12x2y13 ::CC12x2y13(){ note_ctor("_ZN3ccc9CC12x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y13E, buf);
    ::ccc::CC12x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y13E);
    dp->::ccc::CC12x2y13::~CC12x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y13E(Test__ZN3ccc9CC12x2y13E, "_ZN3ccc9CC12x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y13C1Ev();
extern void _ZN3ccc9CC12x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y13E[] = {
  NSPAIR(_ZN3ccc9CC12x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y133efgEv,_ZThn4_N3ccc9CC12x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y133efgEv,_ZThn4_N3ccc9CC12x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y13E[];
Class_Descriptor cd__ZN3ccc9CC12x2y13E = {  "_ZN3ccc9CC12x2y13E", // class name
  bases__ZN3ccc9CC12x2y13E, 2,
  &(vtc__ZN3ccc9CC12x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y14  : ::ccc::AA12 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC12x2y143pqrEv
  ~CC12x2y14(); // tgen
  CC12x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y14E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC12x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x2y143pqrEv");}
ccc::CC12x2y14 ::~CC12x2y14(){ note_dtor("_ZN3ccc9CC12x2y14E", this);} // tgen
ccc::CC12x2y14 ::CC12x2y14(){ note_ctor("_ZN3ccc9CC12x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y14E, buf);
    ::ccc::CC12x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y14E);
    dp->::ccc::CC12x2y14::~CC12x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y14E(Test__ZN3ccc9CC12x2y14E, "_ZN3ccc9CC12x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y14C1Ev();
extern void _ZN3ccc9CC12x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y14E[] = {
  NSPAIR(_ZN3ccc9CC12x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x2y143pqrEv,_ZThn4_N3ccc9CC12x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x2y143pqrEv,_ZThn4_N3ccc9CC12x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y14E[];
Class_Descriptor cd__ZN3ccc9CC12x2y14E = {  "_ZN3ccc9CC12x2y14E", // class name
  bases__ZN3ccc9CC12x2y14E, 2,
  &(vtc__ZN3ccc9CC12x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x2y15  : ::ccc::AA12 , ::ccc::BB2 {
  ~CC12x2y15(); // tgen
  CC12x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x2y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x2y15 ::~CC12x2y15(){ note_dtor("_ZN3ccc9CC12x2y15E", this);} // tgen
ccc::CC12x2y15 ::CC12x2y15(){ note_ctor("_ZN3ccc9CC12x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x2y15E, buf);
    ::ccc::CC12x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x2y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC12x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x2y15E);
    dp->::ccc::CC12x2y15::~CC12x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x2y15E(Test__ZN3ccc9CC12x2y15E, "_ZN3ccc9CC12x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x2y15C1Ev();
extern void _ZN3ccc9CC12x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x2y15E[] = {
  NSPAIR(_ZN3ccc9CC12x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC12x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x2y15E[];
Class_Descriptor cd__ZN3ccc9CC12x2y15E = {  "_ZN3ccc9CC12x2y15E", // class name
  bases__ZN3ccc9CC12x2y15E, 2,
  &(vtc__ZN3ccc9CC12x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x2y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y0  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC12x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y03pqrEv
  ~CC12x3y0(); // tgen
  CC12x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y0E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y03abcEv");}
void  ccc::CC12x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y03efgEv");}
void  ccc::CC12x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y03pqrEv");}
ccc::CC12x3y0 ::~CC12x3y0(){ note_dtor("_ZN3ccc8CC12x3y0E", this);} // tgen
ccc::CC12x3y0 ::CC12x3y0(){ note_ctor("_ZN3ccc8CC12x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y0E, buf);
    ::ccc::CC12x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y0E);
    dp->::ccc::CC12x3y0::~CC12x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y0E(Test__ZN3ccc8CC12x3y0E, "_ZN3ccc8CC12x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y0C1Ev();
extern void _ZN3ccc8CC12x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y0E[] = {
  NSPAIR(_ZN3ccc8CC12x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y0E[];
extern void _ZN3ccc8CC12x3y03abcEv();
extern void _ZN3ccc8CC12x3y03efgEv();
extern void _ZN3ccc8CC12x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y03efgEv,_ZThn4_N3ccc8CC12x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y03pqrEv,_ZThn4_N3ccc8CC12x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y03abcEv,_ZThn4_N3ccc8CC12x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y03efgEv,_ZThn4_N3ccc8CC12x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y03pqrEv,_ZThn4_N3ccc8CC12x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y03abcEv,_ZThn4_N3ccc8CC12x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y0E[];
Class_Descriptor cd__ZN3ccc8CC12x3y0E = {  "_ZN3ccc8CC12x3y0E", // class name
  bases__ZN3ccc8CC12x3y0E, 2,
  &(vtc__ZN3ccc8CC12x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y1  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC12x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x3y13efgEv
  ~CC12x3y1(); // tgen
  CC12x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y1E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y13abcEv");}
void  ccc::CC12x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y13pqrEv");}
void  ccc::CC12x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y13efgEv");}
ccc::CC12x3y1 ::~CC12x3y1(){ note_dtor("_ZN3ccc8CC12x3y1E", this);} // tgen
ccc::CC12x3y1 ::CC12x3y1(){ note_ctor("_ZN3ccc8CC12x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y1E, buf);
    ::ccc::CC12x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y1E);
    dp->::ccc::CC12x3y1::~CC12x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y1E(Test__ZN3ccc8CC12x3y1E, "_ZN3ccc8CC12x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y1C1Ev();
extern void _ZN3ccc8CC12x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y1E[] = {
  NSPAIR(_ZN3ccc8CC12x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y1E[];
extern void _ZN3ccc8CC12x3y13abcEv();
extern void _ZN3ccc8CC12x3y13pqrEv();
extern void _ZN3ccc8CC12x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y13efgEv,_ZThn4_N3ccc8CC12x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y13pqrEv,_ZThn4_N3ccc8CC12x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y13abcEv,_ZThn4_N3ccc8CC12x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y13efgEv,_ZThn4_N3ccc8CC12x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y13pqrEv,_ZThn4_N3ccc8CC12x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y13abcEv,_ZThn4_N3ccc8CC12x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y1E[];
Class_Descriptor cd__ZN3ccc8CC12x3y1E = {  "_ZN3ccc8CC12x3y1E", // class name
  bases__ZN3ccc8CC12x3y1E, 2,
  &(vtc__ZN3ccc8CC12x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y2  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC12x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y23pqrEv
  ~CC12x3y2(); // tgen
  CC12x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y2E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y23efgEv");}
void  ccc::CC12x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y23abcEv");}
void  ccc::CC12x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y23pqrEv");}
ccc::CC12x3y2 ::~CC12x3y2(){ note_dtor("_ZN3ccc8CC12x3y2E", this);} // tgen
ccc::CC12x3y2 ::CC12x3y2(){ note_ctor("_ZN3ccc8CC12x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y2E, buf);
    ::ccc::CC12x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y2E);
    dp->::ccc::CC12x3y2::~CC12x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y2E(Test__ZN3ccc8CC12x3y2E, "_ZN3ccc8CC12x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y2C1Ev();
extern void _ZN3ccc8CC12x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y2E[] = {
  NSPAIR(_ZN3ccc8CC12x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y2E[];
extern void _ZN3ccc8CC12x3y23abcEv();
extern void _ZN3ccc8CC12x3y23efgEv();
extern void _ZN3ccc8CC12x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y23efgEv,_ZThn4_N3ccc8CC12x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y23pqrEv,_ZThn4_N3ccc8CC12x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y23abcEv,_ZThn4_N3ccc8CC12x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y23efgEv,_ZThn4_N3ccc8CC12x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y23pqrEv,_ZThn4_N3ccc8CC12x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y23abcEv,_ZThn4_N3ccc8CC12x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y2E[];
Class_Descriptor cd__ZN3ccc8CC12x3y2E = {  "_ZN3ccc8CC12x3y2E", // class name
  bases__ZN3ccc8CC12x3y2E, 2,
  &(vtc__ZN3ccc8CC12x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y3  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC12x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x3y33abcEv
  ~CC12x3y3(); // tgen
  CC12x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y3E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y33efgEv");}
void  ccc::CC12x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y33pqrEv");}
void  ccc::CC12x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y33abcEv");}
ccc::CC12x3y3 ::~CC12x3y3(){ note_dtor("_ZN3ccc8CC12x3y3E", this);} // tgen
ccc::CC12x3y3 ::CC12x3y3(){ note_ctor("_ZN3ccc8CC12x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y3E, buf);
    ::ccc::CC12x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y3E);
    dp->::ccc::CC12x3y3::~CC12x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y3E(Test__ZN3ccc8CC12x3y3E, "_ZN3ccc8CC12x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y3C1Ev();
extern void _ZN3ccc8CC12x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y3E[] = {
  NSPAIR(_ZN3ccc8CC12x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y3E[];
extern void _ZN3ccc8CC12x3y33abcEv();
extern void _ZN3ccc8CC12x3y33efgEv();
extern void _ZN3ccc8CC12x3y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y33efgEv,_ZThn4_N3ccc8CC12x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y33pqrEv,_ZThn4_N3ccc8CC12x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y33abcEv,_ZThn4_N3ccc8CC12x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y33efgEv,_ZThn4_N3ccc8CC12x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y33pqrEv,_ZThn4_N3ccc8CC12x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y33abcEv,_ZThn4_N3ccc8CC12x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y3E[];
Class_Descriptor cd__ZN3ccc8CC12x3y3E = {  "_ZN3ccc8CC12x3y3E", // class name
  bases__ZN3ccc8CC12x3y3E, 2,
  &(vtc__ZN3ccc8CC12x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y4  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC12x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x3y43efgEv
  ~CC12x3y4(); // tgen
  CC12x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y4E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y43pqrEv");}
void  ccc::CC12x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y43abcEv");}
void  ccc::CC12x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y43efgEv");}
ccc::CC12x3y4 ::~CC12x3y4(){ note_dtor("_ZN3ccc8CC12x3y4E", this);} // tgen
ccc::CC12x3y4 ::CC12x3y4(){ note_ctor("_ZN3ccc8CC12x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y4E, buf);
    ::ccc::CC12x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y4E);
    dp->::ccc::CC12x3y4::~CC12x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y4E(Test__ZN3ccc8CC12x3y4E, "_ZN3ccc8CC12x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y4C1Ev();
extern void _ZN3ccc8CC12x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y4E[] = {
  NSPAIR(_ZN3ccc8CC12x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y4E[];
extern void _ZN3ccc8CC12x3y43abcEv();
extern void _ZN3ccc8CC12x3y43pqrEv();
extern void _ZN3ccc8CC12x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y43efgEv,_ZThn4_N3ccc8CC12x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y43pqrEv,_ZThn4_N3ccc8CC12x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y43abcEv,_ZThn4_N3ccc8CC12x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y43efgEv,_ZThn4_N3ccc8CC12x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y43pqrEv,_ZThn4_N3ccc8CC12x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y43abcEv,_ZThn4_N3ccc8CC12x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y4E[];
Class_Descriptor cd__ZN3ccc8CC12x3y4E = {  "_ZN3ccc8CC12x3y4E", // class name
  bases__ZN3ccc8CC12x3y4E, 2,
  &(vtc__ZN3ccc8CC12x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y5  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC12x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x3y53abcEv
  ~CC12x3y5(); // tgen
  CC12x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y5E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y53pqrEv");}
void  ccc::CC12x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y53efgEv");}
void  ccc::CC12x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y53abcEv");}
ccc::CC12x3y5 ::~CC12x3y5(){ note_dtor("_ZN3ccc8CC12x3y5E", this);} // tgen
ccc::CC12x3y5 ::CC12x3y5(){ note_ctor("_ZN3ccc8CC12x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y5E, buf);
    ::ccc::CC12x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y5E);
    dp->::ccc::CC12x3y5::~CC12x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y5E(Test__ZN3ccc8CC12x3y5E, "_ZN3ccc8CC12x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y5C1Ev();
extern void _ZN3ccc8CC12x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y5E[] = {
  NSPAIR(_ZN3ccc8CC12x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y5E[];
extern void _ZN3ccc8CC12x3y53abcEv();
extern void _ZN3ccc8CC12x3y53pqrEv();
extern void _ZN3ccc8CC12x3y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y53efgEv,_ZThn4_N3ccc8CC12x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y53pqrEv,_ZThn4_N3ccc8CC12x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y53abcEv,_ZThn4_N3ccc8CC12x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y53efgEv,_ZThn4_N3ccc8CC12x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y53pqrEv,_ZThn4_N3ccc8CC12x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y53abcEv,_ZThn4_N3ccc8CC12x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y5E[];
Class_Descriptor cd__ZN3ccc8CC12x3y5E = {  "_ZN3ccc8CC12x3y5E", // class name
  bases__ZN3ccc8CC12x3y5E, 2,
  &(vtc__ZN3ccc8CC12x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y6  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC12x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x3y63efgEv
  ~CC12x3y6(); // tgen
  CC12x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y6E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y63abcEv");}
void  ccc::CC12x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y63efgEv");}
ccc::CC12x3y6 ::~CC12x3y6(){ note_dtor("_ZN3ccc8CC12x3y6E", this);} // tgen
ccc::CC12x3y6 ::CC12x3y6(){ note_ctor("_ZN3ccc8CC12x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y6E, buf);
    ::ccc::CC12x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y6E);
    dp->::ccc::CC12x3y6::~CC12x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y6E(Test__ZN3ccc8CC12x3y6E, "_ZN3ccc8CC12x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y6C1Ev();
extern void _ZN3ccc8CC12x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y6E[] = {
  NSPAIR(_ZN3ccc8CC12x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y6E[];
extern void _ZN3ccc8CC12x3y63abcEv();
extern void _ZN3ccc8CC12x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y63efgEv,_ZThn4_N3ccc8CC12x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y63abcEv,_ZThn4_N3ccc8CC12x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y63efgEv,_ZThn4_N3ccc8CC12x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y63abcEv,_ZThn4_N3ccc8CC12x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y6E[];
Class_Descriptor cd__ZN3ccc8CC12x3y6E = {  "_ZN3ccc8CC12x3y6E", // class name
  bases__ZN3ccc8CC12x3y6E, 2,
  &(vtc__ZN3ccc8CC12x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y7  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC12x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y73pqrEv
  ~CC12x3y7(); // tgen
  CC12x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y7E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y73abcEv");}
void  ccc::CC12x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y73pqrEv");}
ccc::CC12x3y7 ::~CC12x3y7(){ note_dtor("_ZN3ccc8CC12x3y7E", this);} // tgen
ccc::CC12x3y7 ::CC12x3y7(){ note_ctor("_ZN3ccc8CC12x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y7E, buf);
    ::ccc::CC12x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y7E);
    dp->::ccc::CC12x3y7::~CC12x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y7E(Test__ZN3ccc8CC12x3y7E, "_ZN3ccc8CC12x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y7C1Ev();
extern void _ZN3ccc8CC12x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y7E[] = {
  NSPAIR(_ZN3ccc8CC12x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y7E[];
extern void _ZN3ccc8CC12x3y73abcEv();
extern void _ZN3ccc8CC12x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y73pqrEv,_ZThn4_N3ccc8CC12x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y73abcEv,_ZThn4_N3ccc8CC12x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y73pqrEv,_ZThn4_N3ccc8CC12x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y73abcEv,_ZThn4_N3ccc8CC12x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y7E[];
Class_Descriptor cd__ZN3ccc8CC12x3y7E = {  "_ZN3ccc8CC12x3y7E", // class name
  bases__ZN3ccc8CC12x3y7E, 2,
  &(vtc__ZN3ccc8CC12x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y8  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC12x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x3y83abcEv
  ~CC12x3y8(); // tgen
  CC12x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y8E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y83efgEv");}
void  ccc::CC12x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x3y83abcEv");}
ccc::CC12x3y8 ::~CC12x3y8(){ note_dtor("_ZN3ccc8CC12x3y8E", this);} // tgen
ccc::CC12x3y8 ::CC12x3y8(){ note_ctor("_ZN3ccc8CC12x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y8E, buf);
    ::ccc::CC12x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y8E);
    dp->::ccc::CC12x3y8::~CC12x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y8E(Test__ZN3ccc8CC12x3y8E, "_ZN3ccc8CC12x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y8C1Ev();
extern void _ZN3ccc8CC12x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y8E[] = {
  NSPAIR(_ZN3ccc8CC12x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y8E[];
extern void _ZN3ccc8CC12x3y83abcEv();
extern void _ZN3ccc8CC12x3y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y83efgEv,_ZThn4_N3ccc8CC12x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y83abcEv,_ZThn4_N3ccc8CC12x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y83efgEv,_ZThn4_N3ccc8CC12x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y83abcEv,_ZThn4_N3ccc8CC12x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y8E[];
Class_Descriptor cd__ZN3ccc8CC12x3y8E = {  "_ZN3ccc8CC12x3y8E", // class name
  bases__ZN3ccc8CC12x3y8E, 2,
  &(vtc__ZN3ccc8CC12x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y9  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC12x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x3y93pqrEv
  ~CC12x3y9(); // tgen
  CC12x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x3y9E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x3y93efgEv");}
void  ccc::CC12x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x3y93pqrEv");}
ccc::CC12x3y9 ::~CC12x3y9(){ note_dtor("_ZN3ccc8CC12x3y9E", this);} // tgen
ccc::CC12x3y9 ::CC12x3y9(){ note_ctor("_ZN3ccc8CC12x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x3y9E, buf);
    ::ccc::CC12x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x3y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC12x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x3y9E);
    dp->::ccc::CC12x3y9::~CC12x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x3y9E(Test__ZN3ccc8CC12x3y9E, "_ZN3ccc8CC12x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x3y9C1Ev();
extern void _ZN3ccc8CC12x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x3y9E[] = {
  NSPAIR(_ZN3ccc8CC12x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC12x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x3y93efgEv();
extern void _ZN3ccc8CC12x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y93efgEv,_ZThn4_N3ccc8CC12x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x3y93pqrEv,_ZThn4_N3ccc8CC12x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y93efgEv,_ZThn4_N3ccc8CC12x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x3y93pqrEv,_ZThn4_N3ccc8CC12x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x3y9E[];
Class_Descriptor cd__ZN3ccc8CC12x3y9E = {  "_ZN3ccc8CC12x3y9E", // class name
  bases__ZN3ccc8CC12x3y9E, 2,
  &(vtc__ZN3ccc8CC12x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x3y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y10  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC12x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x3y103abcEv
  ~CC12x3y10(); // tgen
  CC12x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y10E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x3y103pqrEv");}
void  ccc::CC12x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x3y103abcEv");}
ccc::CC12x3y10 ::~CC12x3y10(){ note_dtor("_ZN3ccc9CC12x3y10E", this);} // tgen
ccc::CC12x3y10 ::CC12x3y10(){ note_ctor("_ZN3ccc9CC12x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y10E, buf);
    ::ccc::CC12x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y10E);
    dp->::ccc::CC12x3y10::~CC12x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y10E(Test__ZN3ccc9CC12x3y10E, "_ZN3ccc9CC12x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y10C1Ev();
extern void _ZN3ccc9CC12x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y10E[] = {
  NSPAIR(_ZN3ccc9CC12x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y10E[];
extern void _ZN3ccc9CC12x3y103abcEv();
extern void _ZN3ccc9CC12x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y103pqrEv,_ZThn4_N3ccc9CC12x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y103abcEv,_ZThn4_N3ccc9CC12x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y103pqrEv,_ZThn4_N3ccc9CC12x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y103abcEv,_ZThn4_N3ccc9CC12x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y10E[];
Class_Descriptor cd__ZN3ccc9CC12x3y10E = {  "_ZN3ccc9CC12x3y10E", // class name
  bases__ZN3ccc9CC12x3y10E, 2,
  &(vtc__ZN3ccc9CC12x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y11  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC12x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x3y113efgEv
  ~CC12x3y11(); // tgen
  CC12x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y11E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x3y113pqrEv");}
void  ccc::CC12x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x3y113efgEv");}
ccc::CC12x3y11 ::~CC12x3y11(){ note_dtor("_ZN3ccc9CC12x3y11E", this);} // tgen
ccc::CC12x3y11 ::CC12x3y11(){ note_ctor("_ZN3ccc9CC12x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y11E, buf);
    ::ccc::CC12x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y11E);
    dp->::ccc::CC12x3y11::~CC12x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y11E(Test__ZN3ccc9CC12x3y11E, "_ZN3ccc9CC12x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y11C1Ev();
extern void _ZN3ccc9CC12x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y11E[] = {
  NSPAIR(_ZN3ccc9CC12x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x3y113pqrEv();
extern void _ZN3ccc9CC12x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y113efgEv,_ZThn4_N3ccc9CC12x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y113pqrEv,_ZThn4_N3ccc9CC12x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y113efgEv,_ZThn4_N3ccc9CC12x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y113pqrEv,_ZThn4_N3ccc9CC12x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y11E[];
Class_Descriptor cd__ZN3ccc9CC12x3y11E = {  "_ZN3ccc9CC12x3y11E", // class name
  bases__ZN3ccc9CC12x3y11E, 2,
  &(vtc__ZN3ccc9CC12x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y12  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC12x3y123abcEv
  ~CC12x3y12(); // tgen
  CC12x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y12E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x3y123abcEv");}
ccc::CC12x3y12 ::~CC12x3y12(){ note_dtor("_ZN3ccc9CC12x3y12E", this);} // tgen
ccc::CC12x3y12 ::CC12x3y12(){ note_ctor("_ZN3ccc9CC12x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y12E, buf);
    ::ccc::CC12x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y12E);
    dp->::ccc::CC12x3y12::~CC12x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y12E(Test__ZN3ccc9CC12x3y12E, "_ZN3ccc9CC12x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y12C1Ev();
extern void _ZN3ccc9CC12x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y12E[] = {
  NSPAIR(_ZN3ccc9CC12x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y12E[];
extern void _ZN3ccc9CC12x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y123abcEv,_ZThn4_N3ccc9CC12x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y123abcEv,_ZThn4_N3ccc9CC12x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y12E[];
Class_Descriptor cd__ZN3ccc9CC12x3y12E = {  "_ZN3ccc9CC12x3y12E", // class name
  bases__ZN3ccc9CC12x3y12E, 2,
  &(vtc__ZN3ccc9CC12x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y13  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC12x3y133efgEv
  ~CC12x3y13(); // tgen
  CC12x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y13E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x3y133efgEv");}
ccc::CC12x3y13 ::~CC12x3y13(){ note_dtor("_ZN3ccc9CC12x3y13E", this);} // tgen
ccc::CC12x3y13 ::CC12x3y13(){ note_ctor("_ZN3ccc9CC12x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y13E, buf);
    ::ccc::CC12x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y13E);
    dp->::ccc::CC12x3y13::~CC12x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y13E(Test__ZN3ccc9CC12x3y13E, "_ZN3ccc9CC12x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y13C1Ev();
extern void _ZN3ccc9CC12x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y13E[] = {
  NSPAIR(_ZN3ccc9CC12x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y133efgEv,_ZThn4_N3ccc9CC12x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y133efgEv,_ZThn4_N3ccc9CC12x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y13E[];
Class_Descriptor cd__ZN3ccc9CC12x3y13E = {  "_ZN3ccc9CC12x3y13E", // class name
  bases__ZN3ccc9CC12x3y13E, 2,
  &(vtc__ZN3ccc9CC12x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y14  : ::ccc::AA12 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC12x3y143pqrEv
  ~CC12x3y14(); // tgen
  CC12x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y14E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC12x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x3y143pqrEv");}
ccc::CC12x3y14 ::~CC12x3y14(){ note_dtor("_ZN3ccc9CC12x3y14E", this);} // tgen
ccc::CC12x3y14 ::CC12x3y14(){ note_ctor("_ZN3ccc9CC12x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y14E, buf);
    ::ccc::CC12x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y14E);
    dp->::ccc::CC12x3y14::~CC12x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y14E(Test__ZN3ccc9CC12x3y14E, "_ZN3ccc9CC12x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y14C1Ev();
extern void _ZN3ccc9CC12x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y14E[] = {
  NSPAIR(_ZN3ccc9CC12x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x3y143pqrEv,_ZThn4_N3ccc9CC12x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x3y143pqrEv,_ZThn4_N3ccc9CC12x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y14E[];
Class_Descriptor cd__ZN3ccc9CC12x3y14E = {  "_ZN3ccc9CC12x3y14E", // class name
  bases__ZN3ccc9CC12x3y14E, 2,
  &(vtc__ZN3ccc9CC12x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x3y15  : ::ccc::AA12 , ::ccc::BB3 {
  ~CC12x3y15(); // tgen
  CC12x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x3y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x3y15 ::~CC12x3y15(){ note_dtor("_ZN3ccc9CC12x3y15E", this);} // tgen
ccc::CC12x3y15 ::CC12x3y15(){ note_ctor("_ZN3ccc9CC12x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x3y15E, buf);
    ::ccc::CC12x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x3y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC12x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x3y15E);
    dp->::ccc::CC12x3y15::~CC12x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x3y15E(Test__ZN3ccc9CC12x3y15E, "_ZN3ccc9CC12x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x3y15C1Ev();
extern void _ZN3ccc9CC12x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x3y15E[] = {
  NSPAIR(_ZN3ccc9CC12x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC12x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x3y15E[];
Class_Descriptor cd__ZN3ccc9CC12x3y15E = {  "_ZN3ccc9CC12x3y15E", // class name
  bases__ZN3ccc9CC12x3y15E, 2,
  &(vtc__ZN3ccc9CC12x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x3y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y0  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC12x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y03pqrEv
  ~CC12x4y0(); // tgen
  CC12x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y0E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y03abcEv");}
void  ccc::CC12x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y03efgEv");}
void  ccc::CC12x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y03pqrEv");}
ccc::CC12x4y0 ::~CC12x4y0(){ note_dtor("_ZN3ccc8CC12x4y0E", this);} // tgen
ccc::CC12x4y0 ::CC12x4y0(){ note_ctor("_ZN3ccc8CC12x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y0E, buf);
    ::ccc::CC12x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y0E);
    dp->::ccc::CC12x4y0::~CC12x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y0E(Test__ZN3ccc8CC12x4y0E, "_ZN3ccc8CC12x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y0C1Ev();
extern void _ZN3ccc8CC12x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y0E[] = {
  NSPAIR(_ZN3ccc8CC12x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y0E[];
extern void _ZN3ccc8CC12x4y03abcEv();
extern void _ZN3ccc8CC12x4y03efgEv();
extern void _ZN3ccc8CC12x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y03pqrEv,_ZThn4_N3ccc8CC12x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y03abcEv,_ZThn4_N3ccc8CC12x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y03efgEv,_ZThn4_N3ccc8CC12x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y03pqrEv,_ZThn4_N3ccc8CC12x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y03abcEv,_ZThn4_N3ccc8CC12x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y03efgEv,_ZThn4_N3ccc8CC12x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y0E[];
Class_Descriptor cd__ZN3ccc8CC12x4y0E = {  "_ZN3ccc8CC12x4y0E", // class name
  bases__ZN3ccc8CC12x4y0E, 2,
  &(vtc__ZN3ccc8CC12x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y1  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC12x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x4y13efgEv
  ~CC12x4y1(); // tgen
  CC12x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y1E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y13abcEv");}
void  ccc::CC12x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y13pqrEv");}
void  ccc::CC12x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y13efgEv");}
ccc::CC12x4y1 ::~CC12x4y1(){ note_dtor("_ZN3ccc8CC12x4y1E", this);} // tgen
ccc::CC12x4y1 ::CC12x4y1(){ note_ctor("_ZN3ccc8CC12x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y1E, buf);
    ::ccc::CC12x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y1E);
    dp->::ccc::CC12x4y1::~CC12x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y1E(Test__ZN3ccc8CC12x4y1E, "_ZN3ccc8CC12x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y1C1Ev();
extern void _ZN3ccc8CC12x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y1E[] = {
  NSPAIR(_ZN3ccc8CC12x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y1E[];
extern void _ZN3ccc8CC12x4y13abcEv();
extern void _ZN3ccc8CC12x4y13pqrEv();
extern void _ZN3ccc8CC12x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y13pqrEv,_ZThn4_N3ccc8CC12x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y13abcEv,_ZThn4_N3ccc8CC12x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y13efgEv,_ZThn4_N3ccc8CC12x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y13pqrEv,_ZThn4_N3ccc8CC12x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y13abcEv,_ZThn4_N3ccc8CC12x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y13efgEv,_ZThn4_N3ccc8CC12x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y1E[];
Class_Descriptor cd__ZN3ccc8CC12x4y1E = {  "_ZN3ccc8CC12x4y1E", // class name
  bases__ZN3ccc8CC12x4y1E, 2,
  &(vtc__ZN3ccc8CC12x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y2  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC12x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y23pqrEv
  ~CC12x4y2(); // tgen
  CC12x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y2E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y23efgEv");}
void  ccc::CC12x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y23abcEv");}
void  ccc::CC12x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y23pqrEv");}
ccc::CC12x4y2 ::~CC12x4y2(){ note_dtor("_ZN3ccc8CC12x4y2E", this);} // tgen
ccc::CC12x4y2 ::CC12x4y2(){ note_ctor("_ZN3ccc8CC12x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y2E, buf);
    ::ccc::CC12x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y2E);
    dp->::ccc::CC12x4y2::~CC12x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y2E(Test__ZN3ccc8CC12x4y2E, "_ZN3ccc8CC12x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y2C1Ev();
extern void _ZN3ccc8CC12x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y2E[] = {
  NSPAIR(_ZN3ccc8CC12x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y2E[];
extern void _ZN3ccc8CC12x4y23abcEv();
extern void _ZN3ccc8CC12x4y23efgEv();
extern void _ZN3ccc8CC12x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y23pqrEv,_ZThn4_N3ccc8CC12x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y23abcEv,_ZThn4_N3ccc8CC12x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y23efgEv,_ZThn4_N3ccc8CC12x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y23pqrEv,_ZThn4_N3ccc8CC12x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y23abcEv,_ZThn4_N3ccc8CC12x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y23efgEv,_ZThn4_N3ccc8CC12x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y2E[];
Class_Descriptor cd__ZN3ccc8CC12x4y2E = {  "_ZN3ccc8CC12x4y2E", // class name
  bases__ZN3ccc8CC12x4y2E, 2,
  &(vtc__ZN3ccc8CC12x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y3  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC12x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x4y33abcEv
  ~CC12x4y3(); // tgen
  CC12x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y3E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y33efgEv");}
void  ccc::CC12x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y33pqrEv");}
void  ccc::CC12x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y33abcEv");}
ccc::CC12x4y3 ::~CC12x4y3(){ note_dtor("_ZN3ccc8CC12x4y3E", this);} // tgen
ccc::CC12x4y3 ::CC12x4y3(){ note_ctor("_ZN3ccc8CC12x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y3E, buf);
    ::ccc::CC12x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y3E);
    dp->::ccc::CC12x4y3::~CC12x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y3E(Test__ZN3ccc8CC12x4y3E, "_ZN3ccc8CC12x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y3C1Ev();
extern void _ZN3ccc8CC12x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y3E[] = {
  NSPAIR(_ZN3ccc8CC12x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y3E[];
extern void _ZN3ccc8CC12x4y33abcEv();
extern void _ZN3ccc8CC12x4y33efgEv();
extern void _ZN3ccc8CC12x4y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y33pqrEv,_ZThn4_N3ccc8CC12x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y33abcEv,_ZThn4_N3ccc8CC12x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y33efgEv,_ZThn4_N3ccc8CC12x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y33pqrEv,_ZThn4_N3ccc8CC12x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y33abcEv,_ZThn4_N3ccc8CC12x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y33efgEv,_ZThn4_N3ccc8CC12x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y3E[];
Class_Descriptor cd__ZN3ccc8CC12x4y3E = {  "_ZN3ccc8CC12x4y3E", // class name
  bases__ZN3ccc8CC12x4y3E, 2,
  &(vtc__ZN3ccc8CC12x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y4  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC12x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x4y43efgEv
  ~CC12x4y4(); // tgen
  CC12x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y4E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y43pqrEv");}
void  ccc::CC12x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y43abcEv");}
void  ccc::CC12x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y43efgEv");}
ccc::CC12x4y4 ::~CC12x4y4(){ note_dtor("_ZN3ccc8CC12x4y4E", this);} // tgen
ccc::CC12x4y4 ::CC12x4y4(){ note_ctor("_ZN3ccc8CC12x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y4E, buf);
    ::ccc::CC12x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y4E);
    dp->::ccc::CC12x4y4::~CC12x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y4E(Test__ZN3ccc8CC12x4y4E, "_ZN3ccc8CC12x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y4C1Ev();
extern void _ZN3ccc8CC12x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y4E[] = {
  NSPAIR(_ZN3ccc8CC12x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y4E[];
extern void _ZN3ccc8CC12x4y43abcEv();
extern void _ZN3ccc8CC12x4y43pqrEv();
extern void _ZN3ccc8CC12x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y43pqrEv,_ZThn4_N3ccc8CC12x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y43abcEv,_ZThn4_N3ccc8CC12x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y43efgEv,_ZThn4_N3ccc8CC12x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y43pqrEv,_ZThn4_N3ccc8CC12x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y43abcEv,_ZThn4_N3ccc8CC12x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y43efgEv,_ZThn4_N3ccc8CC12x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y4E[];
Class_Descriptor cd__ZN3ccc8CC12x4y4E = {  "_ZN3ccc8CC12x4y4E", // class name
  bases__ZN3ccc8CC12x4y4E, 2,
  &(vtc__ZN3ccc8CC12x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y5  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC12x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x4y53abcEv
  ~CC12x4y5(); // tgen
  CC12x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y5E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y53pqrEv");}
void  ccc::CC12x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y53efgEv");}
void  ccc::CC12x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y53abcEv");}
ccc::CC12x4y5 ::~CC12x4y5(){ note_dtor("_ZN3ccc8CC12x4y5E", this);} // tgen
ccc::CC12x4y5 ::CC12x4y5(){ note_ctor("_ZN3ccc8CC12x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y5E, buf);
    ::ccc::CC12x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y5E);
    dp->::ccc::CC12x4y5::~CC12x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y5E(Test__ZN3ccc8CC12x4y5E, "_ZN3ccc8CC12x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y5C1Ev();
extern void _ZN3ccc8CC12x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y5E[] = {
  NSPAIR(_ZN3ccc8CC12x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y5E[];
extern void _ZN3ccc8CC12x4y53abcEv();
extern void _ZN3ccc8CC12x4y53pqrEv();
extern void _ZN3ccc8CC12x4y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y53pqrEv,_ZThn4_N3ccc8CC12x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y53abcEv,_ZThn4_N3ccc8CC12x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y53efgEv,_ZThn4_N3ccc8CC12x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y53pqrEv,_ZThn4_N3ccc8CC12x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y53abcEv,_ZThn4_N3ccc8CC12x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y53efgEv,_ZThn4_N3ccc8CC12x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y5E[];
Class_Descriptor cd__ZN3ccc8CC12x4y5E = {  "_ZN3ccc8CC12x4y5E", // class name
  bases__ZN3ccc8CC12x4y5E, 2,
  &(vtc__ZN3ccc8CC12x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y6  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC12x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x4y63efgEv
  ~CC12x4y6(); // tgen
  CC12x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y6E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y63abcEv");}
void  ccc::CC12x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y63efgEv");}
ccc::CC12x4y6 ::~CC12x4y6(){ note_dtor("_ZN3ccc8CC12x4y6E", this);} // tgen
ccc::CC12x4y6 ::CC12x4y6(){ note_ctor("_ZN3ccc8CC12x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y6E, buf);
    ::ccc::CC12x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y6E);
    dp->::ccc::CC12x4y6::~CC12x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y6E(Test__ZN3ccc8CC12x4y6E, "_ZN3ccc8CC12x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y6C1Ev();
extern void _ZN3ccc8CC12x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y6E[] = {
  NSPAIR(_ZN3ccc8CC12x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y6E[];
extern void _ZN3ccc8CC12x4y63abcEv();
extern void _ZN3ccc8CC12x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y63abcEv,_ZThn4_N3ccc8CC12x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y63efgEv,_ZThn4_N3ccc8CC12x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y63abcEv,_ZThn4_N3ccc8CC12x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y63efgEv,_ZThn4_N3ccc8CC12x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y6E[];
Class_Descriptor cd__ZN3ccc8CC12x4y6E = {  "_ZN3ccc8CC12x4y6E", // class name
  bases__ZN3ccc8CC12x4y6E, 2,
  &(vtc__ZN3ccc8CC12x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y7  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC12x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y73pqrEv
  ~CC12x4y7(); // tgen
  CC12x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y7E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y73abcEv");}
void  ccc::CC12x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y73pqrEv");}
ccc::CC12x4y7 ::~CC12x4y7(){ note_dtor("_ZN3ccc8CC12x4y7E", this);} // tgen
ccc::CC12x4y7 ::CC12x4y7(){ note_ctor("_ZN3ccc8CC12x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y7E, buf);
    ::ccc::CC12x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y7E);
    dp->::ccc::CC12x4y7::~CC12x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y7E(Test__ZN3ccc8CC12x4y7E, "_ZN3ccc8CC12x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y7C1Ev();
extern void _ZN3ccc8CC12x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y7E[] = {
  NSPAIR(_ZN3ccc8CC12x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y7E[];
extern void _ZN3ccc8CC12x4y73abcEv();
extern void _ZN3ccc8CC12x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y73pqrEv,_ZThn4_N3ccc8CC12x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y73abcEv,_ZThn4_N3ccc8CC12x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y73pqrEv,_ZThn4_N3ccc8CC12x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y73abcEv,_ZThn4_N3ccc8CC12x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y7E[];
Class_Descriptor cd__ZN3ccc8CC12x4y7E = {  "_ZN3ccc8CC12x4y7E", // class name
  bases__ZN3ccc8CC12x4y7E, 2,
  &(vtc__ZN3ccc8CC12x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y8  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC12x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x4y83abcEv
  ~CC12x4y8(); // tgen
  CC12x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y8E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y83efgEv");}
void  ccc::CC12x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x4y83abcEv");}
ccc::CC12x4y8 ::~CC12x4y8(){ note_dtor("_ZN3ccc8CC12x4y8E", this);} // tgen
ccc::CC12x4y8 ::CC12x4y8(){ note_ctor("_ZN3ccc8CC12x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y8E, buf);
    ::ccc::CC12x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y8E);
    dp->::ccc::CC12x4y8::~CC12x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y8E(Test__ZN3ccc8CC12x4y8E, "_ZN3ccc8CC12x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y8C1Ev();
extern void _ZN3ccc8CC12x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y8E[] = {
  NSPAIR(_ZN3ccc8CC12x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y8E[];
extern void _ZN3ccc8CC12x4y83abcEv();
extern void _ZN3ccc8CC12x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y83abcEv,_ZThn4_N3ccc8CC12x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y83efgEv,_ZThn4_N3ccc8CC12x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y83abcEv,_ZThn4_N3ccc8CC12x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y83efgEv,_ZThn4_N3ccc8CC12x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y8E[];
Class_Descriptor cd__ZN3ccc8CC12x4y8E = {  "_ZN3ccc8CC12x4y8E", // class name
  bases__ZN3ccc8CC12x4y8E, 2,
  &(vtc__ZN3ccc8CC12x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y9  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC12x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x4y93pqrEv
  ~CC12x4y9(); // tgen
  CC12x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x4y9E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x4y93efgEv");}
void  ccc::CC12x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x4y93pqrEv");}
ccc::CC12x4y9 ::~CC12x4y9(){ note_dtor("_ZN3ccc8CC12x4y9E", this);} // tgen
ccc::CC12x4y9 ::CC12x4y9(){ note_ctor("_ZN3ccc8CC12x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x4y9E, buf);
    ::ccc::CC12x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x4y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC12x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x4y9E);
    dp->::ccc::CC12x4y9::~CC12x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x4y9E(Test__ZN3ccc8CC12x4y9E, "_ZN3ccc8CC12x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x4y9C1Ev();
extern void _ZN3ccc8CC12x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x4y9E[] = {
  NSPAIR(_ZN3ccc8CC12x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC12x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x4y93efgEv();
extern void _ZN3ccc8CC12x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y93pqrEv,_ZThn4_N3ccc8CC12x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x4y93efgEv,_ZThn4_N3ccc8CC12x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y93pqrEv,_ZThn4_N3ccc8CC12x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x4y93efgEv,_ZThn4_N3ccc8CC12x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x4y9E[];
Class_Descriptor cd__ZN3ccc8CC12x4y9E = {  "_ZN3ccc8CC12x4y9E", // class name
  bases__ZN3ccc8CC12x4y9E, 2,
  &(vtc__ZN3ccc8CC12x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x4y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y10  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC12x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x4y103abcEv
  ~CC12x4y10(); // tgen
  CC12x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y10E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x4y103pqrEv");}
void  ccc::CC12x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x4y103abcEv");}
ccc::CC12x4y10 ::~CC12x4y10(){ note_dtor("_ZN3ccc9CC12x4y10E", this);} // tgen
ccc::CC12x4y10 ::CC12x4y10(){ note_ctor("_ZN3ccc9CC12x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y10E, buf);
    ::ccc::CC12x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y10E);
    dp->::ccc::CC12x4y10::~CC12x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y10E(Test__ZN3ccc9CC12x4y10E, "_ZN3ccc9CC12x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y10C1Ev();
extern void _ZN3ccc9CC12x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y10E[] = {
  NSPAIR(_ZN3ccc9CC12x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y10E[];
extern void _ZN3ccc9CC12x4y103abcEv();
extern void _ZN3ccc9CC12x4y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y103pqrEv,_ZThn4_N3ccc9CC12x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y103abcEv,_ZThn4_N3ccc9CC12x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y103pqrEv,_ZThn4_N3ccc9CC12x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y103abcEv,_ZThn4_N3ccc9CC12x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y10E[];
Class_Descriptor cd__ZN3ccc9CC12x4y10E = {  "_ZN3ccc9CC12x4y10E", // class name
  bases__ZN3ccc9CC12x4y10E, 2,
  &(vtc__ZN3ccc9CC12x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y11  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC12x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x4y113efgEv
  ~CC12x4y11(); // tgen
  CC12x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y11E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x4y113pqrEv");}
void  ccc::CC12x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x4y113efgEv");}
ccc::CC12x4y11 ::~CC12x4y11(){ note_dtor("_ZN3ccc9CC12x4y11E", this);} // tgen
ccc::CC12x4y11 ::CC12x4y11(){ note_ctor("_ZN3ccc9CC12x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y11E, buf);
    ::ccc::CC12x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y11E);
    dp->::ccc::CC12x4y11::~CC12x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y11E(Test__ZN3ccc9CC12x4y11E, "_ZN3ccc9CC12x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y11C1Ev();
extern void _ZN3ccc9CC12x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y11E[] = {
  NSPAIR(_ZN3ccc9CC12x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x4y113pqrEv();
extern void _ZN3ccc9CC12x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y113pqrEv,_ZThn4_N3ccc9CC12x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y113efgEv,_ZThn4_N3ccc9CC12x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y113pqrEv,_ZThn4_N3ccc9CC12x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y113efgEv,_ZThn4_N3ccc9CC12x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y11E[];
Class_Descriptor cd__ZN3ccc9CC12x4y11E = {  "_ZN3ccc9CC12x4y11E", // class name
  bases__ZN3ccc9CC12x4y11E, 2,
  &(vtc__ZN3ccc9CC12x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y12  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC12x4y123abcEv
  ~CC12x4y12(); // tgen
  CC12x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y12E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x4y123abcEv");}
ccc::CC12x4y12 ::~CC12x4y12(){ note_dtor("_ZN3ccc9CC12x4y12E", this);} // tgen
ccc::CC12x4y12 ::CC12x4y12(){ note_ctor("_ZN3ccc9CC12x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y12E, buf);
    ::ccc::CC12x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y12E);
    dp->::ccc::CC12x4y12::~CC12x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y12E(Test__ZN3ccc9CC12x4y12E, "_ZN3ccc9CC12x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y12C1Ev();
extern void _ZN3ccc9CC12x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y12E[] = {
  NSPAIR(_ZN3ccc9CC12x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y12E[];
extern void _ZN3ccc9CC12x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y123abcEv,_ZThn4_N3ccc9CC12x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y123abcEv,_ZThn4_N3ccc9CC12x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y12E[];
Class_Descriptor cd__ZN3ccc9CC12x4y12E = {  "_ZN3ccc9CC12x4y12E", // class name
  bases__ZN3ccc9CC12x4y12E, 2,
  &(vtc__ZN3ccc9CC12x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y13  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC12x4y133efgEv
  ~CC12x4y13(); // tgen
  CC12x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y13E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC12x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x4y133efgEv");}
ccc::CC12x4y13 ::~CC12x4y13(){ note_dtor("_ZN3ccc9CC12x4y13E", this);} // tgen
ccc::CC12x4y13 ::CC12x4y13(){ note_ctor("_ZN3ccc9CC12x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y13E, buf);
    ::ccc::CC12x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y13E);
    dp->::ccc::CC12x4y13::~CC12x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y13E(Test__ZN3ccc9CC12x4y13E, "_ZN3ccc9CC12x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y13C1Ev();
extern void _ZN3ccc9CC12x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y13E[] = {
  NSPAIR(_ZN3ccc9CC12x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y133efgEv,_ZThn4_N3ccc9CC12x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y133efgEv,_ZThn4_N3ccc9CC12x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y13E[];
Class_Descriptor cd__ZN3ccc9CC12x4y13E = {  "_ZN3ccc9CC12x4y13E", // class name
  bases__ZN3ccc9CC12x4y13E, 2,
  &(vtc__ZN3ccc9CC12x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y14  : ::ccc::AA12 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC12x4y143pqrEv
  ~CC12x4y14(); // tgen
  CC12x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y14E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x4y143pqrEv");}
ccc::CC12x4y14 ::~CC12x4y14(){ note_dtor("_ZN3ccc9CC12x4y14E", this);} // tgen
ccc::CC12x4y14 ::CC12x4y14(){ note_ctor("_ZN3ccc9CC12x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y14E, buf);
    ::ccc::CC12x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y14E);
    dp->::ccc::CC12x4y14::~CC12x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y14E(Test__ZN3ccc9CC12x4y14E, "_ZN3ccc9CC12x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y14C1Ev();
extern void _ZN3ccc9CC12x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y14E[] = {
  NSPAIR(_ZN3ccc9CC12x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x4y143pqrEv,_ZThn4_N3ccc9CC12x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x4y143pqrEv,_ZThn4_N3ccc9CC12x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y14E[];
Class_Descriptor cd__ZN3ccc9CC12x4y14E = {  "_ZN3ccc9CC12x4y14E", // class name
  bases__ZN3ccc9CC12x4y14E, 2,
  &(vtc__ZN3ccc9CC12x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x4y15  : ::ccc::AA12 , ::ccc::BB4 {
  ~CC12x4y15(); // tgen
  CC12x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x4y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x4y15 ::~CC12x4y15(){ note_dtor("_ZN3ccc9CC12x4y15E", this);} // tgen
ccc::CC12x4y15 ::CC12x4y15(){ note_ctor("_ZN3ccc9CC12x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x4y15E, buf);
    ::ccc::CC12x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x4y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC12x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x4y15E);
    dp->::ccc::CC12x4y15::~CC12x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x4y15E(Test__ZN3ccc9CC12x4y15E, "_ZN3ccc9CC12x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x4y15C1Ev();
extern void _ZN3ccc9CC12x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x4y15E[] = {
  NSPAIR(_ZN3ccc9CC12x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC12x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x4y15E[];
Class_Descriptor cd__ZN3ccc9CC12x4y15E = {  "_ZN3ccc9CC12x4y15E", // class name
  bases__ZN3ccc9CC12x4y15E, 2,
  &(vtc__ZN3ccc9CC12x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x4y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y0  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC12x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y03pqrEv
  ~CC12x5y0(); // tgen
  CC12x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y0E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y03abcEv");}
void  ccc::CC12x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y03efgEv");}
void  ccc::CC12x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y03pqrEv");}
ccc::CC12x5y0 ::~CC12x5y0(){ note_dtor("_ZN3ccc8CC12x5y0E", this);} // tgen
ccc::CC12x5y0 ::CC12x5y0(){ note_ctor("_ZN3ccc8CC12x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y0E, buf);
    ::ccc::CC12x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y0E);
    dp->::ccc::CC12x5y0::~CC12x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y0E(Test__ZN3ccc8CC12x5y0E, "_ZN3ccc8CC12x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y0C1Ev();
extern void _ZN3ccc8CC12x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y0E[] = {
  NSPAIR(_ZN3ccc8CC12x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y0E[];
extern void _ZN3ccc8CC12x5y03abcEv();
extern void _ZN3ccc8CC12x5y03efgEv();
extern void _ZN3ccc8CC12x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y03pqrEv,_ZThn4_N3ccc8CC12x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y03efgEv,_ZThn4_N3ccc8CC12x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y03abcEv,_ZThn4_N3ccc8CC12x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y03pqrEv,_ZThn4_N3ccc8CC12x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y03efgEv,_ZThn4_N3ccc8CC12x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y03abcEv,_ZThn4_N3ccc8CC12x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y0E[];
Class_Descriptor cd__ZN3ccc8CC12x5y0E = {  "_ZN3ccc8CC12x5y0E", // class name
  bases__ZN3ccc8CC12x5y0E, 2,
  &(vtc__ZN3ccc8CC12x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y1  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC12x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x5y13efgEv
  ~CC12x5y1(); // tgen
  CC12x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y1E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y13abcEv");}
void  ccc::CC12x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y13pqrEv");}
void  ccc::CC12x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y13efgEv");}
ccc::CC12x5y1 ::~CC12x5y1(){ note_dtor("_ZN3ccc8CC12x5y1E", this);} // tgen
ccc::CC12x5y1 ::CC12x5y1(){ note_ctor("_ZN3ccc8CC12x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y1E, buf);
    ::ccc::CC12x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y1E);
    dp->::ccc::CC12x5y1::~CC12x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y1E(Test__ZN3ccc8CC12x5y1E, "_ZN3ccc8CC12x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y1C1Ev();
extern void _ZN3ccc8CC12x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y1E[] = {
  NSPAIR(_ZN3ccc8CC12x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y1E[];
extern void _ZN3ccc8CC12x5y13abcEv();
extern void _ZN3ccc8CC12x5y13pqrEv();
extern void _ZN3ccc8CC12x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y13pqrEv,_ZThn4_N3ccc8CC12x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y13efgEv,_ZThn4_N3ccc8CC12x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y13abcEv,_ZThn4_N3ccc8CC12x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y13pqrEv,_ZThn4_N3ccc8CC12x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y13efgEv,_ZThn4_N3ccc8CC12x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y13abcEv,_ZThn4_N3ccc8CC12x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y1E[];
Class_Descriptor cd__ZN3ccc8CC12x5y1E = {  "_ZN3ccc8CC12x5y1E", // class name
  bases__ZN3ccc8CC12x5y1E, 2,
  &(vtc__ZN3ccc8CC12x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y2  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC12x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y23pqrEv
  ~CC12x5y2(); // tgen
  CC12x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y2E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y23efgEv");}
void  ccc::CC12x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y23abcEv");}
void  ccc::CC12x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y23pqrEv");}
ccc::CC12x5y2 ::~CC12x5y2(){ note_dtor("_ZN3ccc8CC12x5y2E", this);} // tgen
ccc::CC12x5y2 ::CC12x5y2(){ note_ctor("_ZN3ccc8CC12x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y2E, buf);
    ::ccc::CC12x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y2E);
    dp->::ccc::CC12x5y2::~CC12x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y2E(Test__ZN3ccc8CC12x5y2E, "_ZN3ccc8CC12x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y2C1Ev();
extern void _ZN3ccc8CC12x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y2E[] = {
  NSPAIR(_ZN3ccc8CC12x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y2E[];
extern void _ZN3ccc8CC12x5y23abcEv();
extern void _ZN3ccc8CC12x5y23efgEv();
extern void _ZN3ccc8CC12x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y23pqrEv,_ZThn4_N3ccc8CC12x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y23efgEv,_ZThn4_N3ccc8CC12x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y23abcEv,_ZThn4_N3ccc8CC12x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y23pqrEv,_ZThn4_N3ccc8CC12x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y23efgEv,_ZThn4_N3ccc8CC12x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y23abcEv,_ZThn4_N3ccc8CC12x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y2E[];
Class_Descriptor cd__ZN3ccc8CC12x5y2E = {  "_ZN3ccc8CC12x5y2E", // class name
  bases__ZN3ccc8CC12x5y2E, 2,
  &(vtc__ZN3ccc8CC12x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y3  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC12x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x5y33abcEv
  ~CC12x5y3(); // tgen
  CC12x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y3E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y33efgEv");}
void  ccc::CC12x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y33pqrEv");}
void  ccc::CC12x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y33abcEv");}
ccc::CC12x5y3 ::~CC12x5y3(){ note_dtor("_ZN3ccc8CC12x5y3E", this);} // tgen
ccc::CC12x5y3 ::CC12x5y3(){ note_ctor("_ZN3ccc8CC12x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y3E, buf);
    ::ccc::CC12x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y3E);
    dp->::ccc::CC12x5y3::~CC12x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y3E(Test__ZN3ccc8CC12x5y3E, "_ZN3ccc8CC12x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y3C1Ev();
extern void _ZN3ccc8CC12x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y3E[] = {
  NSPAIR(_ZN3ccc8CC12x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y3E[];
extern void _ZN3ccc8CC12x5y33abcEv();
extern void _ZN3ccc8CC12x5y33efgEv();
extern void _ZN3ccc8CC12x5y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y33pqrEv,_ZThn4_N3ccc8CC12x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y33efgEv,_ZThn4_N3ccc8CC12x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y33abcEv,_ZThn4_N3ccc8CC12x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y33pqrEv,_ZThn4_N3ccc8CC12x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y33efgEv,_ZThn4_N3ccc8CC12x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y33abcEv,_ZThn4_N3ccc8CC12x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y3E[];
Class_Descriptor cd__ZN3ccc8CC12x5y3E = {  "_ZN3ccc8CC12x5y3E", // class name
  bases__ZN3ccc8CC12x5y3E, 2,
  &(vtc__ZN3ccc8CC12x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y4  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC12x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x5y43efgEv
  ~CC12x5y4(); // tgen
  CC12x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y4E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y43pqrEv");}
void  ccc::CC12x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y43abcEv");}
void  ccc::CC12x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y43efgEv");}
ccc::CC12x5y4 ::~CC12x5y4(){ note_dtor("_ZN3ccc8CC12x5y4E", this);} // tgen
ccc::CC12x5y4 ::CC12x5y4(){ note_ctor("_ZN3ccc8CC12x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y4E, buf);
    ::ccc::CC12x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y4E);
    dp->::ccc::CC12x5y4::~CC12x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y4E(Test__ZN3ccc8CC12x5y4E, "_ZN3ccc8CC12x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y4C1Ev();
extern void _ZN3ccc8CC12x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y4E[] = {
  NSPAIR(_ZN3ccc8CC12x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y4E[];
extern void _ZN3ccc8CC12x5y43abcEv();
extern void _ZN3ccc8CC12x5y43pqrEv();
extern void _ZN3ccc8CC12x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y43pqrEv,_ZThn4_N3ccc8CC12x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y43efgEv,_ZThn4_N3ccc8CC12x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y43abcEv,_ZThn4_N3ccc8CC12x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y43pqrEv,_ZThn4_N3ccc8CC12x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y43efgEv,_ZThn4_N3ccc8CC12x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y43abcEv,_ZThn4_N3ccc8CC12x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y4E[];
Class_Descriptor cd__ZN3ccc8CC12x5y4E = {  "_ZN3ccc8CC12x5y4E", // class name
  bases__ZN3ccc8CC12x5y4E, 2,
  &(vtc__ZN3ccc8CC12x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y5  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC12x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x5y53abcEv
  ~CC12x5y5(); // tgen
  CC12x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y5E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y53pqrEv");}
void  ccc::CC12x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y53efgEv");}
void  ccc::CC12x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y53abcEv");}
ccc::CC12x5y5 ::~CC12x5y5(){ note_dtor("_ZN3ccc8CC12x5y5E", this);} // tgen
ccc::CC12x5y5 ::CC12x5y5(){ note_ctor("_ZN3ccc8CC12x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y5E, buf);
    ::ccc::CC12x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y5E);
    dp->::ccc::CC12x5y5::~CC12x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y5E(Test__ZN3ccc8CC12x5y5E, "_ZN3ccc8CC12x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y5C1Ev();
extern void _ZN3ccc8CC12x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y5E[] = {
  NSPAIR(_ZN3ccc8CC12x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y5E[];
extern void _ZN3ccc8CC12x5y53abcEv();
extern void _ZN3ccc8CC12x5y53pqrEv();
extern void _ZN3ccc8CC12x5y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y53pqrEv,_ZThn4_N3ccc8CC12x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y53efgEv,_ZThn4_N3ccc8CC12x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y53abcEv,_ZThn4_N3ccc8CC12x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y53pqrEv,_ZThn4_N3ccc8CC12x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y53efgEv,_ZThn4_N3ccc8CC12x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y53abcEv,_ZThn4_N3ccc8CC12x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y5E[];
Class_Descriptor cd__ZN3ccc8CC12x5y5E = {  "_ZN3ccc8CC12x5y5E", // class name
  bases__ZN3ccc8CC12x5y5E, 2,
  &(vtc__ZN3ccc8CC12x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y6  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC12x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x5y63efgEv
  ~CC12x5y6(); // tgen
  CC12x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y6E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y63abcEv");}
void  ccc::CC12x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y63efgEv");}
ccc::CC12x5y6 ::~CC12x5y6(){ note_dtor("_ZN3ccc8CC12x5y6E", this);} // tgen
ccc::CC12x5y6 ::CC12x5y6(){ note_ctor("_ZN3ccc8CC12x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y6E, buf);
    ::ccc::CC12x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y6E);
    dp->::ccc::CC12x5y6::~CC12x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y6E(Test__ZN3ccc8CC12x5y6E, "_ZN3ccc8CC12x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y6C1Ev();
extern void _ZN3ccc8CC12x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y6E[] = {
  NSPAIR(_ZN3ccc8CC12x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y6E[];
extern void _ZN3ccc8CC12x5y63abcEv();
extern void _ZN3ccc8CC12x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y63efgEv,_ZThn4_N3ccc8CC12x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y63abcEv,_ZThn4_N3ccc8CC12x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y63efgEv,_ZThn4_N3ccc8CC12x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y63abcEv,_ZThn4_N3ccc8CC12x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y6E[];
Class_Descriptor cd__ZN3ccc8CC12x5y6E = {  "_ZN3ccc8CC12x5y6E", // class name
  bases__ZN3ccc8CC12x5y6E, 2,
  &(vtc__ZN3ccc8CC12x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y7  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC12x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y73pqrEv
  ~CC12x5y7(); // tgen
  CC12x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y7E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y73abcEv");}
void  ccc::CC12x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y73pqrEv");}
ccc::CC12x5y7 ::~CC12x5y7(){ note_dtor("_ZN3ccc8CC12x5y7E", this);} // tgen
ccc::CC12x5y7 ::CC12x5y7(){ note_ctor("_ZN3ccc8CC12x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y7E, buf);
    ::ccc::CC12x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y7E);
    dp->::ccc::CC12x5y7::~CC12x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y7E(Test__ZN3ccc8CC12x5y7E, "_ZN3ccc8CC12x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y7C1Ev();
extern void _ZN3ccc8CC12x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y7E[] = {
  NSPAIR(_ZN3ccc8CC12x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y7E[];
extern void _ZN3ccc8CC12x5y73abcEv();
extern void _ZN3ccc8CC12x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y73pqrEv,_ZThn4_N3ccc8CC12x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y73abcEv,_ZThn4_N3ccc8CC12x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y73pqrEv,_ZThn4_N3ccc8CC12x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y73abcEv,_ZThn4_N3ccc8CC12x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y7E[];
Class_Descriptor cd__ZN3ccc8CC12x5y7E = {  "_ZN3ccc8CC12x5y7E", // class name
  bases__ZN3ccc8CC12x5y7E, 2,
  &(vtc__ZN3ccc8CC12x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y8  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC12x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x5y83abcEv
  ~CC12x5y8(); // tgen
  CC12x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y8E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y83efgEv");}
void  ccc::CC12x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x5y83abcEv");}
ccc::CC12x5y8 ::~CC12x5y8(){ note_dtor("_ZN3ccc8CC12x5y8E", this);} // tgen
ccc::CC12x5y8 ::CC12x5y8(){ note_ctor("_ZN3ccc8CC12x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y8E, buf);
    ::ccc::CC12x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y8E);
    dp->::ccc::CC12x5y8::~CC12x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y8E(Test__ZN3ccc8CC12x5y8E, "_ZN3ccc8CC12x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y8C1Ev();
extern void _ZN3ccc8CC12x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y8E[] = {
  NSPAIR(_ZN3ccc8CC12x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y8E[];
extern void _ZN3ccc8CC12x5y83abcEv();
extern void _ZN3ccc8CC12x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y83efgEv,_ZThn4_N3ccc8CC12x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y83abcEv,_ZThn4_N3ccc8CC12x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y83efgEv,_ZThn4_N3ccc8CC12x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y83abcEv,_ZThn4_N3ccc8CC12x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y8E[];
Class_Descriptor cd__ZN3ccc8CC12x5y8E = {  "_ZN3ccc8CC12x5y8E", // class name
  bases__ZN3ccc8CC12x5y8E, 2,
  &(vtc__ZN3ccc8CC12x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y9  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC12x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x5y93pqrEv
  ~CC12x5y9(); // tgen
  CC12x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x5y9E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x5y93efgEv");}
void  ccc::CC12x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x5y93pqrEv");}
ccc::CC12x5y9 ::~CC12x5y9(){ note_dtor("_ZN3ccc8CC12x5y9E", this);} // tgen
ccc::CC12x5y9 ::CC12x5y9(){ note_ctor("_ZN3ccc8CC12x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x5y9E, buf);
    ::ccc::CC12x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x5y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC12x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x5y9E);
    dp->::ccc::CC12x5y9::~CC12x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x5y9E(Test__ZN3ccc8CC12x5y9E, "_ZN3ccc8CC12x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x5y9C1Ev();
extern void _ZN3ccc8CC12x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x5y9E[] = {
  NSPAIR(_ZN3ccc8CC12x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC12x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x5y93efgEv();
extern void _ZN3ccc8CC12x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y93pqrEv,_ZThn4_N3ccc8CC12x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x5y93efgEv,_ZThn4_N3ccc8CC12x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y93pqrEv,_ZThn4_N3ccc8CC12x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x5y93efgEv,_ZThn4_N3ccc8CC12x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x5y9E[];
Class_Descriptor cd__ZN3ccc8CC12x5y9E = {  "_ZN3ccc8CC12x5y9E", // class name
  bases__ZN3ccc8CC12x5y9E, 2,
  &(vtc__ZN3ccc8CC12x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x5y9E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y10  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC12x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x5y103abcEv
  ~CC12x5y10(); // tgen
  CC12x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y10E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x5y103pqrEv");}
void  ccc::CC12x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x5y103abcEv");}
ccc::CC12x5y10 ::~CC12x5y10(){ note_dtor("_ZN3ccc9CC12x5y10E", this);} // tgen
ccc::CC12x5y10 ::CC12x5y10(){ note_ctor("_ZN3ccc9CC12x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y10E, buf);
    ::ccc::CC12x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y10E);
    dp->::ccc::CC12x5y10::~CC12x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y10E(Test__ZN3ccc9CC12x5y10E, "_ZN3ccc9CC12x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y10C1Ev();
extern void _ZN3ccc9CC12x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y10E[] = {
  NSPAIR(_ZN3ccc9CC12x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y10E[];
extern void _ZN3ccc9CC12x5y103abcEv();
extern void _ZN3ccc9CC12x5y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y103pqrEv,_ZThn4_N3ccc9CC12x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y103abcEv,_ZThn4_N3ccc9CC12x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y103pqrEv,_ZThn4_N3ccc9CC12x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y103abcEv,_ZThn4_N3ccc9CC12x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y10E[];
Class_Descriptor cd__ZN3ccc9CC12x5y10E = {  "_ZN3ccc9CC12x5y10E", // class name
  bases__ZN3ccc9CC12x5y10E, 2,
  &(vtc__ZN3ccc9CC12x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y11  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC12x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x5y113efgEv
  ~CC12x5y11(); // tgen
  CC12x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y11E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x5y113pqrEv");}
void  ccc::CC12x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x5y113efgEv");}
ccc::CC12x5y11 ::~CC12x5y11(){ note_dtor("_ZN3ccc9CC12x5y11E", this);} // tgen
ccc::CC12x5y11 ::CC12x5y11(){ note_ctor("_ZN3ccc9CC12x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y11E, buf);
    ::ccc::CC12x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y11E);
    dp->::ccc::CC12x5y11::~CC12x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y11E(Test__ZN3ccc9CC12x5y11E, "_ZN3ccc9CC12x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y11C1Ev();
extern void _ZN3ccc9CC12x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y11E[] = {
  NSPAIR(_ZN3ccc9CC12x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x5y113pqrEv();
extern void _ZN3ccc9CC12x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y113pqrEv,_ZThn4_N3ccc9CC12x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y113efgEv,_ZThn4_N3ccc9CC12x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y113pqrEv,_ZThn4_N3ccc9CC12x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y113efgEv,_ZThn4_N3ccc9CC12x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y11E[];
Class_Descriptor cd__ZN3ccc9CC12x5y11E = {  "_ZN3ccc9CC12x5y11E", // class name
  bases__ZN3ccc9CC12x5y11E, 2,
  &(vtc__ZN3ccc9CC12x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y11E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y12  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC12x5y123abcEv
  ~CC12x5y12(); // tgen
  CC12x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y12E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x5y123abcEv");}
ccc::CC12x5y12 ::~CC12x5y12(){ note_dtor("_ZN3ccc9CC12x5y12E", this);} // tgen
ccc::CC12x5y12 ::CC12x5y12(){ note_ctor("_ZN3ccc9CC12x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y12E, buf);
    ::ccc::CC12x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y12E);
    dp->::ccc::CC12x5y12::~CC12x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y12E(Test__ZN3ccc9CC12x5y12E, "_ZN3ccc9CC12x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y12C1Ev();
extern void _ZN3ccc9CC12x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y12E[] = {
  NSPAIR(_ZN3ccc9CC12x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y12E[];
extern void _ZN3ccc9CC12x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y123abcEv,_ZThn4_N3ccc9CC12x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y123abcEv,_ZThn4_N3ccc9CC12x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y12E[];
Class_Descriptor cd__ZN3ccc9CC12x5y12E = {  "_ZN3ccc9CC12x5y12E", // class name
  bases__ZN3ccc9CC12x5y12E, 2,
  &(vtc__ZN3ccc9CC12x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y13  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC12x5y133efgEv
  ~CC12x5y13(); // tgen
  CC12x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y13E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC12x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x5y133efgEv");}
ccc::CC12x5y13 ::~CC12x5y13(){ note_dtor("_ZN3ccc9CC12x5y13E", this);} // tgen
ccc::CC12x5y13 ::CC12x5y13(){ note_ctor("_ZN3ccc9CC12x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y13E, buf);
    ::ccc::CC12x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y13E);
    dp->::ccc::CC12x5y13::~CC12x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y13E(Test__ZN3ccc9CC12x5y13E, "_ZN3ccc9CC12x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y13C1Ev();
extern void _ZN3ccc9CC12x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y13E[] = {
  NSPAIR(_ZN3ccc9CC12x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y133efgEv,_ZThn4_N3ccc9CC12x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y133efgEv,_ZThn4_N3ccc9CC12x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y13E[];
Class_Descriptor cd__ZN3ccc9CC12x5y13E = {  "_ZN3ccc9CC12x5y13E", // class name
  bases__ZN3ccc9CC12x5y13E, 2,
  &(vtc__ZN3ccc9CC12x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y14  : ::ccc::AA12 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC12x5y143pqrEv
  ~CC12x5y14(); // tgen
  CC12x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y14E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x5y143pqrEv");}
ccc::CC12x5y14 ::~CC12x5y14(){ note_dtor("_ZN3ccc9CC12x5y14E", this);} // tgen
ccc::CC12x5y14 ::CC12x5y14(){ note_ctor("_ZN3ccc9CC12x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y14E, buf);
    ::ccc::CC12x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y14E);
    dp->::ccc::CC12x5y14::~CC12x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y14E(Test__ZN3ccc9CC12x5y14E, "_ZN3ccc9CC12x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y14C1Ev();
extern void _ZN3ccc9CC12x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y14E[] = {
  NSPAIR(_ZN3ccc9CC12x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x5y143pqrEv,_ZThn4_N3ccc9CC12x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x5y143pqrEv,_ZThn4_N3ccc9CC12x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y14E[];
Class_Descriptor cd__ZN3ccc9CC12x5y14E = {  "_ZN3ccc9CC12x5y14E", // class name
  bases__ZN3ccc9CC12x5y14E, 2,
  &(vtc__ZN3ccc9CC12x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x5y15  : ::ccc::AA12 , ::ccc::BB5 {
  ~CC12x5y15(); // tgen
  CC12x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x5y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC12x5y15 ::~CC12x5y15(){ note_dtor("_ZN3ccc9CC12x5y15E", this);} // tgen
ccc::CC12x5y15 ::CC12x5y15(){ note_ctor("_ZN3ccc9CC12x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x5y15E, buf);
    ::ccc::CC12x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x5y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC12x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x5y15E);
    dp->::ccc::CC12x5y15::~CC12x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x5y15E(Test__ZN3ccc9CC12x5y15E, "_ZN3ccc9CC12x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x5y15C1Ev();
extern void _ZN3ccc9CC12x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x5y15E[] = {
  NSPAIR(_ZN3ccc9CC12x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC12x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x5y15E[];
Class_Descriptor cd__ZN3ccc9CC12x5y15E = {  "_ZN3ccc9CC12x5y15E", // class name
  bases__ZN3ccc9CC12x5y15E, 2,
  &(vtc__ZN3ccc9CC12x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x5y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y0  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC12x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y03pqrEv
  ~CC12x6y0(); // tgen
  CC12x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y0E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y03abcEv");}
void  ccc::CC12x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y03efgEv");}
void  ccc::CC12x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y03pqrEv");}
ccc::CC12x6y0 ::~CC12x6y0(){ note_dtor("_ZN3ccc8CC12x6y0E", this);} // tgen
ccc::CC12x6y0 ::CC12x6y0(){ note_ctor("_ZN3ccc8CC12x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y0E, buf);
    ::ccc::CC12x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y0E);
    dp->::ccc::CC12x6y0::~CC12x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y0E(Test__ZN3ccc8CC12x6y0E, "_ZN3ccc8CC12x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y0C1Ev();
extern void _ZN3ccc8CC12x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y0E[] = {
  NSPAIR(_ZN3ccc8CC12x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y0E[];
extern void _ZN3ccc8CC12x6y03abcEv();
extern void _ZN3ccc8CC12x6y03efgEv();
extern void _ZN3ccc8CC12x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y03abcEv,_ZThn4_N3ccc8CC12x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y03efgEv,_ZThn4_N3ccc8CC12x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y03abcEv,_ZThn4_N3ccc8CC12x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y03efgEv,_ZThn4_N3ccc8CC12x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y0E[];
Class_Descriptor cd__ZN3ccc8CC12x6y0E = {  "_ZN3ccc8CC12x6y0E", // class name
  bases__ZN3ccc8CC12x6y0E, 2,
  &(vtc__ZN3ccc8CC12x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y1  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC12x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x6y13efgEv
  ~CC12x6y1(); // tgen
  CC12x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y1E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y13abcEv");}
void  ccc::CC12x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y13pqrEv");}
void  ccc::CC12x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y13efgEv");}
ccc::CC12x6y1 ::~CC12x6y1(){ note_dtor("_ZN3ccc8CC12x6y1E", this);} // tgen
ccc::CC12x6y1 ::CC12x6y1(){ note_ctor("_ZN3ccc8CC12x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y1E, buf);
    ::ccc::CC12x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y1E);
    dp->::ccc::CC12x6y1::~CC12x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y1E(Test__ZN3ccc8CC12x6y1E, "_ZN3ccc8CC12x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y1C1Ev();
extern void _ZN3ccc8CC12x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y1E[] = {
  NSPAIR(_ZN3ccc8CC12x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y1E[];
extern void _ZN3ccc8CC12x6y13abcEv();
extern void _ZN3ccc8CC12x6y13pqrEv();
extern void _ZN3ccc8CC12x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y13abcEv,_ZThn4_N3ccc8CC12x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y13efgEv,_ZThn4_N3ccc8CC12x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y13abcEv,_ZThn4_N3ccc8CC12x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y13efgEv,_ZThn4_N3ccc8CC12x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y1E[];
Class_Descriptor cd__ZN3ccc8CC12x6y1E = {  "_ZN3ccc8CC12x6y1E", // class name
  bases__ZN3ccc8CC12x6y1E, 2,
  &(vtc__ZN3ccc8CC12x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y2  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC12x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y23pqrEv
  ~CC12x6y2(); // tgen
  CC12x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y2E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y23efgEv");}
void  ccc::CC12x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y23abcEv");}
void  ccc::CC12x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y23pqrEv");}
ccc::CC12x6y2 ::~CC12x6y2(){ note_dtor("_ZN3ccc8CC12x6y2E", this);} // tgen
ccc::CC12x6y2 ::CC12x6y2(){ note_ctor("_ZN3ccc8CC12x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y2E, buf);
    ::ccc::CC12x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y2E);
    dp->::ccc::CC12x6y2::~CC12x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y2E(Test__ZN3ccc8CC12x6y2E, "_ZN3ccc8CC12x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y2C1Ev();
extern void _ZN3ccc8CC12x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y2E[] = {
  NSPAIR(_ZN3ccc8CC12x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y2E[];
extern void _ZN3ccc8CC12x6y23abcEv();
extern void _ZN3ccc8CC12x6y23efgEv();
extern void _ZN3ccc8CC12x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y23abcEv,_ZThn4_N3ccc8CC12x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y23efgEv,_ZThn4_N3ccc8CC12x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y23abcEv,_ZThn4_N3ccc8CC12x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y23efgEv,_ZThn4_N3ccc8CC12x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y2E[];
Class_Descriptor cd__ZN3ccc8CC12x6y2E = {  "_ZN3ccc8CC12x6y2E", // class name
  bases__ZN3ccc8CC12x6y2E, 2,
  &(vtc__ZN3ccc8CC12x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y3  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC12x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x6y33abcEv
  ~CC12x6y3(); // tgen
  CC12x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y3E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y33efgEv");}
void  ccc::CC12x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y33pqrEv");}
void  ccc::CC12x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y33abcEv");}
ccc::CC12x6y3 ::~CC12x6y3(){ note_dtor("_ZN3ccc8CC12x6y3E", this);} // tgen
ccc::CC12x6y3 ::CC12x6y3(){ note_ctor("_ZN3ccc8CC12x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y3E, buf);
    ::ccc::CC12x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y3E);
    dp->::ccc::CC12x6y3::~CC12x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y3E(Test__ZN3ccc8CC12x6y3E, "_ZN3ccc8CC12x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y3C1Ev();
extern void _ZN3ccc8CC12x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y3E[] = {
  NSPAIR(_ZN3ccc8CC12x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y3E[];
extern void _ZN3ccc8CC12x6y33abcEv();
extern void _ZN3ccc8CC12x6y33efgEv();
extern void _ZN3ccc8CC12x6y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y33abcEv,_ZThn4_N3ccc8CC12x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y33efgEv,_ZThn4_N3ccc8CC12x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y33abcEv,_ZThn4_N3ccc8CC12x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y33efgEv,_ZThn4_N3ccc8CC12x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y3E[];
Class_Descriptor cd__ZN3ccc8CC12x6y3E = {  "_ZN3ccc8CC12x6y3E", // class name
  bases__ZN3ccc8CC12x6y3E, 2,
  &(vtc__ZN3ccc8CC12x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y4  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC12x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x6y43efgEv
  ~CC12x6y4(); // tgen
  CC12x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y4E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y43pqrEv");}
void  ccc::CC12x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y43abcEv");}
void  ccc::CC12x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y43efgEv");}
ccc::CC12x6y4 ::~CC12x6y4(){ note_dtor("_ZN3ccc8CC12x6y4E", this);} // tgen
ccc::CC12x6y4 ::CC12x6y4(){ note_ctor("_ZN3ccc8CC12x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y4E, buf);
    ::ccc::CC12x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y4E);
    dp->::ccc::CC12x6y4::~CC12x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y4E(Test__ZN3ccc8CC12x6y4E, "_ZN3ccc8CC12x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y4C1Ev();
extern void _ZN3ccc8CC12x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y4E[] = {
  NSPAIR(_ZN3ccc8CC12x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y4E[];
extern void _ZN3ccc8CC12x6y43abcEv();
extern void _ZN3ccc8CC12x6y43pqrEv();
extern void _ZN3ccc8CC12x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y43abcEv,_ZThn4_N3ccc8CC12x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y43efgEv,_ZThn4_N3ccc8CC12x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y43abcEv,_ZThn4_N3ccc8CC12x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y43efgEv,_ZThn4_N3ccc8CC12x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y4E[];
Class_Descriptor cd__ZN3ccc8CC12x6y4E = {  "_ZN3ccc8CC12x6y4E", // class name
  bases__ZN3ccc8CC12x6y4E, 2,
  &(vtc__ZN3ccc8CC12x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y5  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC12x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x6y53abcEv
  ~CC12x6y5(); // tgen
  CC12x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y5E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y53pqrEv");}
void  ccc::CC12x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y53efgEv");}
void  ccc::CC12x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y53abcEv");}
ccc::CC12x6y5 ::~CC12x6y5(){ note_dtor("_ZN3ccc8CC12x6y5E", this);} // tgen
ccc::CC12x6y5 ::CC12x6y5(){ note_ctor("_ZN3ccc8CC12x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y5E, buf);
    ::ccc::CC12x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y5E);
    dp->::ccc::CC12x6y5::~CC12x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y5E(Test__ZN3ccc8CC12x6y5E, "_ZN3ccc8CC12x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y5C1Ev();
extern void _ZN3ccc8CC12x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y5E[] = {
  NSPAIR(_ZN3ccc8CC12x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y5E[];
extern void _ZN3ccc8CC12x6y53abcEv();
extern void _ZN3ccc8CC12x6y53pqrEv();
extern void _ZN3ccc8CC12x6y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y53abcEv,_ZThn4_N3ccc8CC12x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y53efgEv,_ZThn4_N3ccc8CC12x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y53abcEv,_ZThn4_N3ccc8CC12x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y53efgEv,_ZThn4_N3ccc8CC12x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y5E[];
Class_Descriptor cd__ZN3ccc8CC12x6y5E = {  "_ZN3ccc8CC12x6y5E", // class name
  bases__ZN3ccc8CC12x6y5E, 2,
  &(vtc__ZN3ccc8CC12x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y6  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC12x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x6y63efgEv
  ~CC12x6y6(); // tgen
  CC12x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y6E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y63abcEv");}
void  ccc::CC12x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y63efgEv");}
ccc::CC12x6y6 ::~CC12x6y6(){ note_dtor("_ZN3ccc8CC12x6y6E", this);} // tgen
ccc::CC12x6y6 ::CC12x6y6(){ note_ctor("_ZN3ccc8CC12x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y6E, buf);
    ::ccc::CC12x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y6E);
    dp->::ccc::CC12x6y6::~CC12x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y6E(Test__ZN3ccc8CC12x6y6E, "_ZN3ccc8CC12x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y6C1Ev();
extern void _ZN3ccc8CC12x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y6E[] = {
  NSPAIR(_ZN3ccc8CC12x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y6E[];
extern void _ZN3ccc8CC12x6y63abcEv();
extern void _ZN3ccc8CC12x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y63abcEv,_ZThn4_N3ccc8CC12x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y63efgEv,_ZThn4_N3ccc8CC12x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y63abcEv,_ZThn4_N3ccc8CC12x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y63efgEv,_ZThn4_N3ccc8CC12x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y6E[];
Class_Descriptor cd__ZN3ccc8CC12x6y6E = {  "_ZN3ccc8CC12x6y6E", // class name
  bases__ZN3ccc8CC12x6y6E, 2,
  &(vtc__ZN3ccc8CC12x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y7  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC12x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y73pqrEv
  ~CC12x6y7(); // tgen
  CC12x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y7E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y73abcEv");}
void  ccc::CC12x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y73pqrEv");}
ccc::CC12x6y7 ::~CC12x6y7(){ note_dtor("_ZN3ccc8CC12x6y7E", this);} // tgen
ccc::CC12x6y7 ::CC12x6y7(){ note_ctor("_ZN3ccc8CC12x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y7E, buf);
    ::ccc::CC12x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y7E);
    dp->::ccc::CC12x6y7::~CC12x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y7E(Test__ZN3ccc8CC12x6y7E, "_ZN3ccc8CC12x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y7C1Ev();
extern void _ZN3ccc8CC12x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y7E[] = {
  NSPAIR(_ZN3ccc8CC12x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y7E[];
extern void _ZN3ccc8CC12x6y73abcEv();
extern void _ZN3ccc8CC12x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y73abcEv,_ZThn4_N3ccc8CC12x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y73abcEv,_ZThn4_N3ccc8CC12x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y7E[];
Class_Descriptor cd__ZN3ccc8CC12x6y7E = {  "_ZN3ccc8CC12x6y7E", // class name
  bases__ZN3ccc8CC12x6y7E, 2,
  &(vtc__ZN3ccc8CC12x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y8  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC12x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x6y83abcEv
  ~CC12x6y8(); // tgen
  CC12x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y8E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y83efgEv");}
void  ccc::CC12x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x6y83abcEv");}
ccc::CC12x6y8 ::~CC12x6y8(){ note_dtor("_ZN3ccc8CC12x6y8E", this);} // tgen
ccc::CC12x6y8 ::CC12x6y8(){ note_ctor("_ZN3ccc8CC12x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y8E, buf);
    ::ccc::CC12x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y8E);
    dp->::ccc::CC12x6y8::~CC12x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y8E(Test__ZN3ccc8CC12x6y8E, "_ZN3ccc8CC12x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y8C1Ev();
extern void _ZN3ccc8CC12x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y8E[] = {
  NSPAIR(_ZN3ccc8CC12x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y8E[];
extern void _ZN3ccc8CC12x6y83abcEv();
extern void _ZN3ccc8CC12x6y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y83abcEv,_ZThn4_N3ccc8CC12x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y83efgEv,_ZThn4_N3ccc8CC12x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y83abcEv,_ZThn4_N3ccc8CC12x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y83efgEv,_ZThn4_N3ccc8CC12x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y8E[];
Class_Descriptor cd__ZN3ccc8CC12x6y8E = {  "_ZN3ccc8CC12x6y8E", // class name
  bases__ZN3ccc8CC12x6y8E, 2,
  &(vtc__ZN3ccc8CC12x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y9  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC12x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x6y93pqrEv
  ~CC12x6y9(); // tgen
  CC12x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x6y9E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x6y93efgEv");}
void  ccc::CC12x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x6y93pqrEv");}
ccc::CC12x6y9 ::~CC12x6y9(){ note_dtor("_ZN3ccc8CC12x6y9E", this);} // tgen
ccc::CC12x6y9 ::CC12x6y9(){ note_ctor("_ZN3ccc8CC12x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x6y9E, buf);
    ::ccc::CC12x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x6y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC12x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x6y9E);
    dp->::ccc::CC12x6y9::~CC12x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x6y9E(Test__ZN3ccc8CC12x6y9E, "_ZN3ccc8CC12x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x6y9C1Ev();
extern void _ZN3ccc8CC12x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x6y9E[] = {
  NSPAIR(_ZN3ccc8CC12x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC12x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x6y93efgEv();
extern void _ZN3ccc8CC12x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x6y93efgEv,_ZThn4_N3ccc8CC12x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x6y93efgEv,_ZThn4_N3ccc8CC12x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x6y9E[];
Class_Descriptor cd__ZN3ccc8CC12x6y9E = {  "_ZN3ccc8CC12x6y9E", // class name
  bases__ZN3ccc8CC12x6y9E, 2,
  &(vtc__ZN3ccc8CC12x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x6y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y10  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC12x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x6y103abcEv
  ~CC12x6y10(); // tgen
  CC12x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y10E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x6y103pqrEv");}
void  ccc::CC12x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x6y103abcEv");}
ccc::CC12x6y10 ::~CC12x6y10(){ note_dtor("_ZN3ccc9CC12x6y10E", this);} // tgen
ccc::CC12x6y10 ::CC12x6y10(){ note_ctor("_ZN3ccc9CC12x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y10E, buf);
    ::ccc::CC12x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y10E);
    dp->::ccc::CC12x6y10::~CC12x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y10E(Test__ZN3ccc9CC12x6y10E, "_ZN3ccc9CC12x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y10C1Ev();
extern void _ZN3ccc9CC12x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y10E[] = {
  NSPAIR(_ZN3ccc9CC12x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y10E[];
extern void _ZN3ccc9CC12x6y103abcEv();
extern void _ZN3ccc9CC12x6y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x6y103abcEv,_ZThn4_N3ccc9CC12x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x6y103abcEv,_ZThn4_N3ccc9CC12x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y10E[];
Class_Descriptor cd__ZN3ccc9CC12x6y10E = {  "_ZN3ccc9CC12x6y10E", // class name
  bases__ZN3ccc9CC12x6y10E, 2,
  &(vtc__ZN3ccc9CC12x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y11  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC12x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x6y113efgEv
  ~CC12x6y11(); // tgen
  CC12x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y11E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x6y113pqrEv");}
void  ccc::CC12x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x6y113efgEv");}
ccc::CC12x6y11 ::~CC12x6y11(){ note_dtor("_ZN3ccc9CC12x6y11E", this);} // tgen
ccc::CC12x6y11 ::CC12x6y11(){ note_ctor("_ZN3ccc9CC12x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y11E, buf);
    ::ccc::CC12x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y11E);
    dp->::ccc::CC12x6y11::~CC12x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y11E(Test__ZN3ccc9CC12x6y11E, "_ZN3ccc9CC12x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y11C1Ev();
extern void _ZN3ccc9CC12x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y11E[] = {
  NSPAIR(_ZN3ccc9CC12x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x6y113pqrEv();
extern void _ZN3ccc9CC12x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x6y113efgEv,_ZThn4_N3ccc9CC12x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x6y113efgEv,_ZThn4_N3ccc9CC12x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y11E[];
Class_Descriptor cd__ZN3ccc9CC12x6y11E = {  "_ZN3ccc9CC12x6y11E", // class name
  bases__ZN3ccc9CC12x6y11E, 2,
  &(vtc__ZN3ccc9CC12x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y12  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC12x6y123abcEv
  ~CC12x6y12(); // tgen
  CC12x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y12E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC12x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x6y123abcEv");}
ccc::CC12x6y12 ::~CC12x6y12(){ note_dtor("_ZN3ccc9CC12x6y12E", this);} // tgen
ccc::CC12x6y12 ::CC12x6y12(){ note_ctor("_ZN3ccc9CC12x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y12E, buf);
    ::ccc::CC12x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y12E);
    dp->::ccc::CC12x6y12::~CC12x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y12E(Test__ZN3ccc9CC12x6y12E, "_ZN3ccc9CC12x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y12C1Ev();
extern void _ZN3ccc9CC12x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y12E[] = {
  NSPAIR(_ZN3ccc9CC12x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y12E[];
extern void _ZN3ccc9CC12x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x6y123abcEv,_ZThn4_N3ccc9CC12x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x6y123abcEv,_ZThn4_N3ccc9CC12x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y12E[];
Class_Descriptor cd__ZN3ccc9CC12x6y12E = {  "_ZN3ccc9CC12x6y12E", // class name
  bases__ZN3ccc9CC12x6y12E, 2,
  &(vtc__ZN3ccc9CC12x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y13  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC12x6y133efgEv
  ~CC12x6y13(); // tgen
  CC12x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y13E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x6y133efgEv");}
ccc::CC12x6y13 ::~CC12x6y13(){ note_dtor("_ZN3ccc9CC12x6y13E", this);} // tgen
ccc::CC12x6y13 ::CC12x6y13(){ note_ctor("_ZN3ccc9CC12x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y13E, buf);
    ::ccc::CC12x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y13E);
    dp->::ccc::CC12x6y13::~CC12x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y13E(Test__ZN3ccc9CC12x6y13E, "_ZN3ccc9CC12x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y13C1Ev();
extern void _ZN3ccc9CC12x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y13E[] = {
  NSPAIR(_ZN3ccc9CC12x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x6y133efgEv,_ZThn4_N3ccc9CC12x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x6y133efgEv,_ZThn4_N3ccc9CC12x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y13E[];
Class_Descriptor cd__ZN3ccc9CC12x6y13E = {  "_ZN3ccc9CC12x6y13E", // class name
  bases__ZN3ccc9CC12x6y13E, 2,
  &(vtc__ZN3ccc9CC12x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y14  : ::ccc::AA12 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC12x6y143pqrEv
  ~CC12x6y14(); // tgen
  CC12x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y14E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x6y143pqrEv");}
ccc::CC12x6y14 ::~CC12x6y14(){ note_dtor("_ZN3ccc9CC12x6y14E", this);} // tgen
ccc::CC12x6y14 ::CC12x6y14(){ note_ctor("_ZN3ccc9CC12x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y14E, buf);
    ::ccc::CC12x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y14E);
    dp->::ccc::CC12x6y14::~CC12x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y14E(Test__ZN3ccc9CC12x6y14E, "_ZN3ccc9CC12x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y14C1Ev();
extern void _ZN3ccc9CC12x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y14E[] = {
  NSPAIR(_ZN3ccc9CC12x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y14E[];
Class_Descriptor cd__ZN3ccc9CC12x6y14E = {  "_ZN3ccc9CC12x6y14E", // class name
  bases__ZN3ccc9CC12x6y14E, 2,
  &(vtc__ZN3ccc9CC12x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x6y15  : ::ccc::AA12 , ::ccc::BB6 {
  ~CC12x6y15(); // tgen
  CC12x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x6y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x6y15 ::~CC12x6y15(){ note_dtor("_ZN3ccc9CC12x6y15E", this);} // tgen
ccc::CC12x6y15 ::CC12x6y15(){ note_ctor("_ZN3ccc9CC12x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x6y15E, buf);
    ::ccc::CC12x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x6y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC12x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x6y15E);
    dp->::ccc::CC12x6y15::~CC12x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x6y15E(Test__ZN3ccc9CC12x6y15E, "_ZN3ccc9CC12x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x6y15C1Ev();
extern void _ZN3ccc9CC12x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x6y15E[] = {
  NSPAIR(_ZN3ccc9CC12x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC12x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x6y15E[];
Class_Descriptor cd__ZN3ccc9CC12x6y15E = {  "_ZN3ccc9CC12x6y15E", // class name
  bases__ZN3ccc9CC12x6y15E, 2,
  &(vtc__ZN3ccc9CC12x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x6y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y0  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC12x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y03pqrEv
  ~CC12x7y0(); // tgen
  CC12x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y0E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y03abcEv");}
void  ccc::CC12x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y03efgEv");}
void  ccc::CC12x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y03pqrEv");}
ccc::CC12x7y0 ::~CC12x7y0(){ note_dtor("_ZN3ccc8CC12x7y0E", this);} // tgen
ccc::CC12x7y0 ::CC12x7y0(){ note_ctor("_ZN3ccc8CC12x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y0E, buf);
    ::ccc::CC12x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y0E);
    dp->::ccc::CC12x7y0::~CC12x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y0E(Test__ZN3ccc8CC12x7y0E, "_ZN3ccc8CC12x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y0C1Ev();
extern void _ZN3ccc8CC12x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y0E[] = {
  NSPAIR(_ZN3ccc8CC12x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y0E[];
extern void _ZN3ccc8CC12x7y03abcEv();
extern void _ZN3ccc8CC12x7y03efgEv();
extern void _ZN3ccc8CC12x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y03abcEv,_ZThn4_N3ccc8CC12x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y03pqrEv,_ZThn4_N3ccc8CC12x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y03abcEv,_ZThn4_N3ccc8CC12x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y03pqrEv,_ZThn4_N3ccc8CC12x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y0E[];
Class_Descriptor cd__ZN3ccc8CC12x7y0E = {  "_ZN3ccc8CC12x7y0E", // class name
  bases__ZN3ccc8CC12x7y0E, 2,
  &(vtc__ZN3ccc8CC12x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y1  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC12x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x7y13efgEv
  ~CC12x7y1(); // tgen
  CC12x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y1E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y13abcEv");}
void  ccc::CC12x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y13pqrEv");}
void  ccc::CC12x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y13efgEv");}
ccc::CC12x7y1 ::~CC12x7y1(){ note_dtor("_ZN3ccc8CC12x7y1E", this);} // tgen
ccc::CC12x7y1 ::CC12x7y1(){ note_ctor("_ZN3ccc8CC12x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y1E, buf);
    ::ccc::CC12x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y1E);
    dp->::ccc::CC12x7y1::~CC12x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y1E(Test__ZN3ccc8CC12x7y1E, "_ZN3ccc8CC12x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y1C1Ev();
extern void _ZN3ccc8CC12x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y1E[] = {
  NSPAIR(_ZN3ccc8CC12x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y1E[];
extern void _ZN3ccc8CC12x7y13abcEv();
extern void _ZN3ccc8CC12x7y13pqrEv();
extern void _ZN3ccc8CC12x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y13abcEv,_ZThn4_N3ccc8CC12x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y13pqrEv,_ZThn4_N3ccc8CC12x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y13abcEv,_ZThn4_N3ccc8CC12x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y13pqrEv,_ZThn4_N3ccc8CC12x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y1E[];
Class_Descriptor cd__ZN3ccc8CC12x7y1E = {  "_ZN3ccc8CC12x7y1E", // class name
  bases__ZN3ccc8CC12x7y1E, 2,
  &(vtc__ZN3ccc8CC12x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y2  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC12x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y23pqrEv
  ~CC12x7y2(); // tgen
  CC12x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y2E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y23efgEv");}
void  ccc::CC12x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y23abcEv");}
void  ccc::CC12x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y23pqrEv");}
ccc::CC12x7y2 ::~CC12x7y2(){ note_dtor("_ZN3ccc8CC12x7y2E", this);} // tgen
ccc::CC12x7y2 ::CC12x7y2(){ note_ctor("_ZN3ccc8CC12x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y2E, buf);
    ::ccc::CC12x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y2E);
    dp->::ccc::CC12x7y2::~CC12x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y2E(Test__ZN3ccc8CC12x7y2E, "_ZN3ccc8CC12x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y2C1Ev();
extern void _ZN3ccc8CC12x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y2E[] = {
  NSPAIR(_ZN3ccc8CC12x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y2E[];
extern void _ZN3ccc8CC12x7y23abcEv();
extern void _ZN3ccc8CC12x7y23efgEv();
extern void _ZN3ccc8CC12x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y23abcEv,_ZThn4_N3ccc8CC12x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y23pqrEv,_ZThn4_N3ccc8CC12x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y23abcEv,_ZThn4_N3ccc8CC12x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y23pqrEv,_ZThn4_N3ccc8CC12x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y2E[];
Class_Descriptor cd__ZN3ccc8CC12x7y2E = {  "_ZN3ccc8CC12x7y2E", // class name
  bases__ZN3ccc8CC12x7y2E, 2,
  &(vtc__ZN3ccc8CC12x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y3  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC12x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x7y33abcEv
  ~CC12x7y3(); // tgen
  CC12x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y3E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y33efgEv");}
void  ccc::CC12x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y33pqrEv");}
void  ccc::CC12x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y33abcEv");}
ccc::CC12x7y3 ::~CC12x7y3(){ note_dtor("_ZN3ccc8CC12x7y3E", this);} // tgen
ccc::CC12x7y3 ::CC12x7y3(){ note_ctor("_ZN3ccc8CC12x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y3E, buf);
    ::ccc::CC12x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y3E);
    dp->::ccc::CC12x7y3::~CC12x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y3E(Test__ZN3ccc8CC12x7y3E, "_ZN3ccc8CC12x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y3C1Ev();
extern void _ZN3ccc8CC12x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y3E[] = {
  NSPAIR(_ZN3ccc8CC12x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y3E[];
extern void _ZN3ccc8CC12x7y33abcEv();
extern void _ZN3ccc8CC12x7y33efgEv();
extern void _ZN3ccc8CC12x7y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y33abcEv,_ZThn4_N3ccc8CC12x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y33pqrEv,_ZThn4_N3ccc8CC12x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y33abcEv,_ZThn4_N3ccc8CC12x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y33pqrEv,_ZThn4_N3ccc8CC12x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y3E[];
Class_Descriptor cd__ZN3ccc8CC12x7y3E = {  "_ZN3ccc8CC12x7y3E", // class name
  bases__ZN3ccc8CC12x7y3E, 2,
  &(vtc__ZN3ccc8CC12x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y4  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC12x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x7y43efgEv
  ~CC12x7y4(); // tgen
  CC12x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y4E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y43pqrEv");}
void  ccc::CC12x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y43abcEv");}
void  ccc::CC12x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y43efgEv");}
ccc::CC12x7y4 ::~CC12x7y4(){ note_dtor("_ZN3ccc8CC12x7y4E", this);} // tgen
ccc::CC12x7y4 ::CC12x7y4(){ note_ctor("_ZN3ccc8CC12x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y4E, buf);
    ::ccc::CC12x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y4E);
    dp->::ccc::CC12x7y4::~CC12x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y4E(Test__ZN3ccc8CC12x7y4E, "_ZN3ccc8CC12x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y4C1Ev();
extern void _ZN3ccc8CC12x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y4E[] = {
  NSPAIR(_ZN3ccc8CC12x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y4E[];
extern void _ZN3ccc8CC12x7y43abcEv();
extern void _ZN3ccc8CC12x7y43pqrEv();
extern void _ZN3ccc8CC12x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y43abcEv,_ZThn4_N3ccc8CC12x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y43pqrEv,_ZThn4_N3ccc8CC12x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y43abcEv,_ZThn4_N3ccc8CC12x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y43pqrEv,_ZThn4_N3ccc8CC12x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y4E[];
Class_Descriptor cd__ZN3ccc8CC12x7y4E = {  "_ZN3ccc8CC12x7y4E", // class name
  bases__ZN3ccc8CC12x7y4E, 2,
  &(vtc__ZN3ccc8CC12x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y5  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC12x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x7y53abcEv
  ~CC12x7y5(); // tgen
  CC12x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y5E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y53pqrEv");}
void  ccc::CC12x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y53efgEv");}
void  ccc::CC12x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y53abcEv");}
ccc::CC12x7y5 ::~CC12x7y5(){ note_dtor("_ZN3ccc8CC12x7y5E", this);} // tgen
ccc::CC12x7y5 ::CC12x7y5(){ note_ctor("_ZN3ccc8CC12x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y5E, buf);
    ::ccc::CC12x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y5E);
    dp->::ccc::CC12x7y5::~CC12x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y5E(Test__ZN3ccc8CC12x7y5E, "_ZN3ccc8CC12x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y5C1Ev();
extern void _ZN3ccc8CC12x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y5E[] = {
  NSPAIR(_ZN3ccc8CC12x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y5E[];
extern void _ZN3ccc8CC12x7y53abcEv();
extern void _ZN3ccc8CC12x7y53pqrEv();
extern void _ZN3ccc8CC12x7y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y53abcEv,_ZThn4_N3ccc8CC12x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y53pqrEv,_ZThn4_N3ccc8CC12x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y53abcEv,_ZThn4_N3ccc8CC12x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y53pqrEv,_ZThn4_N3ccc8CC12x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y5E[];
Class_Descriptor cd__ZN3ccc8CC12x7y5E = {  "_ZN3ccc8CC12x7y5E", // class name
  bases__ZN3ccc8CC12x7y5E, 2,
  &(vtc__ZN3ccc8CC12x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y6  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC12x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x7y63efgEv
  ~CC12x7y6(); // tgen
  CC12x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y6E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y63abcEv");}
void  ccc::CC12x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y63efgEv");}
ccc::CC12x7y6 ::~CC12x7y6(){ note_dtor("_ZN3ccc8CC12x7y6E", this);} // tgen
ccc::CC12x7y6 ::CC12x7y6(){ note_ctor("_ZN3ccc8CC12x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y6E, buf);
    ::ccc::CC12x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y6E);
    dp->::ccc::CC12x7y6::~CC12x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y6E(Test__ZN3ccc8CC12x7y6E, "_ZN3ccc8CC12x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y6C1Ev();
extern void _ZN3ccc8CC12x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y6E[] = {
  NSPAIR(_ZN3ccc8CC12x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y6E[];
extern void _ZN3ccc8CC12x7y63abcEv();
extern void _ZN3ccc8CC12x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y63abcEv,_ZThn4_N3ccc8CC12x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y63abcEv,_ZThn4_N3ccc8CC12x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y6E[];
Class_Descriptor cd__ZN3ccc8CC12x7y6E = {  "_ZN3ccc8CC12x7y6E", // class name
  bases__ZN3ccc8CC12x7y6E, 2,
  &(vtc__ZN3ccc8CC12x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y7  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC12x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y73pqrEv
  ~CC12x7y7(); // tgen
  CC12x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y7E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y73abcEv");}
void  ccc::CC12x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y73pqrEv");}
ccc::CC12x7y7 ::~CC12x7y7(){ note_dtor("_ZN3ccc8CC12x7y7E", this);} // tgen
ccc::CC12x7y7 ::CC12x7y7(){ note_ctor("_ZN3ccc8CC12x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y7E, buf);
    ::ccc::CC12x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y7E);
    dp->::ccc::CC12x7y7::~CC12x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y7E(Test__ZN3ccc8CC12x7y7E, "_ZN3ccc8CC12x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y7C1Ev();
extern void _ZN3ccc8CC12x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y7E[] = {
  NSPAIR(_ZN3ccc8CC12x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y7E[];
extern void _ZN3ccc8CC12x7y73abcEv();
extern void _ZN3ccc8CC12x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y73abcEv,_ZThn4_N3ccc8CC12x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y73pqrEv,_ZThn4_N3ccc8CC12x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y73abcEv,_ZThn4_N3ccc8CC12x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y73pqrEv,_ZThn4_N3ccc8CC12x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y7E[];
Class_Descriptor cd__ZN3ccc8CC12x7y7E = {  "_ZN3ccc8CC12x7y7E", // class name
  bases__ZN3ccc8CC12x7y7E, 2,
  &(vtc__ZN3ccc8CC12x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y8  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC12x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x7y83abcEv
  ~CC12x7y8(); // tgen
  CC12x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y8E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y83efgEv");}
void  ccc::CC12x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x7y83abcEv");}
ccc::CC12x7y8 ::~CC12x7y8(){ note_dtor("_ZN3ccc8CC12x7y8E", this);} // tgen
ccc::CC12x7y8 ::CC12x7y8(){ note_ctor("_ZN3ccc8CC12x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y8E, buf);
    ::ccc::CC12x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y8E);
    dp->::ccc::CC12x7y8::~CC12x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y8E(Test__ZN3ccc8CC12x7y8E, "_ZN3ccc8CC12x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y8C1Ev();
extern void _ZN3ccc8CC12x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y8E[] = {
  NSPAIR(_ZN3ccc8CC12x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y8E[];
extern void _ZN3ccc8CC12x7y83abcEv();
extern void _ZN3ccc8CC12x7y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y83abcEv,_ZThn4_N3ccc8CC12x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y83abcEv,_ZThn4_N3ccc8CC12x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y8E[];
Class_Descriptor cd__ZN3ccc8CC12x7y8E = {  "_ZN3ccc8CC12x7y8E", // class name
  bases__ZN3ccc8CC12x7y8E, 2,
  &(vtc__ZN3ccc8CC12x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y9  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC12x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x7y93pqrEv
  ~CC12x7y9(); // tgen
  CC12x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x7y9E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x7y93efgEv");}
void  ccc::CC12x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x7y93pqrEv");}
ccc::CC12x7y9 ::~CC12x7y9(){ note_dtor("_ZN3ccc8CC12x7y9E", this);} // tgen
ccc::CC12x7y9 ::CC12x7y9(){ note_ctor("_ZN3ccc8CC12x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x7y9E, buf);
    ::ccc::CC12x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x7y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC12x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x7y9E);
    dp->::ccc::CC12x7y9::~CC12x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x7y9E(Test__ZN3ccc8CC12x7y9E, "_ZN3ccc8CC12x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x7y9C1Ev();
extern void _ZN3ccc8CC12x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x7y9E[] = {
  NSPAIR(_ZN3ccc8CC12x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC12x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x7y93efgEv();
extern void _ZN3ccc8CC12x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x7y93pqrEv,_ZThn4_N3ccc8CC12x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x7y93pqrEv,_ZThn4_N3ccc8CC12x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x7y9E[];
Class_Descriptor cd__ZN3ccc8CC12x7y9E = {  "_ZN3ccc8CC12x7y9E", // class name
  bases__ZN3ccc8CC12x7y9E, 2,
  &(vtc__ZN3ccc8CC12x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x7y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y10  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC12x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x7y103abcEv
  ~CC12x7y10(); // tgen
  CC12x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y10E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x7y103pqrEv");}
void  ccc::CC12x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x7y103abcEv");}
ccc::CC12x7y10 ::~CC12x7y10(){ note_dtor("_ZN3ccc9CC12x7y10E", this);} // tgen
ccc::CC12x7y10 ::CC12x7y10(){ note_ctor("_ZN3ccc9CC12x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y10E, buf);
    ::ccc::CC12x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y10E);
    dp->::ccc::CC12x7y10::~CC12x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y10E(Test__ZN3ccc9CC12x7y10E, "_ZN3ccc9CC12x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y10C1Ev();
extern void _ZN3ccc9CC12x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y10E[] = {
  NSPAIR(_ZN3ccc9CC12x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y10E[];
extern void _ZN3ccc9CC12x7y103abcEv();
extern void _ZN3ccc9CC12x7y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x7y103abcEv,_ZThn4_N3ccc9CC12x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x7y103pqrEv,_ZThn4_N3ccc9CC12x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x7y103abcEv,_ZThn4_N3ccc9CC12x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x7y103pqrEv,_ZThn4_N3ccc9CC12x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y10E[];
Class_Descriptor cd__ZN3ccc9CC12x7y10E = {  "_ZN3ccc9CC12x7y10E", // class name
  bases__ZN3ccc9CC12x7y10E, 2,
  &(vtc__ZN3ccc9CC12x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y11  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC12x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x7y113efgEv
  ~CC12x7y11(); // tgen
  CC12x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y11E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x7y113pqrEv");}
void  ccc::CC12x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x7y113efgEv");}
ccc::CC12x7y11 ::~CC12x7y11(){ note_dtor("_ZN3ccc9CC12x7y11E", this);} // tgen
ccc::CC12x7y11 ::CC12x7y11(){ note_ctor("_ZN3ccc9CC12x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y11E, buf);
    ::ccc::CC12x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y11E);
    dp->::ccc::CC12x7y11::~CC12x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y11E(Test__ZN3ccc9CC12x7y11E, "_ZN3ccc9CC12x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y11C1Ev();
extern void _ZN3ccc9CC12x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y11E[] = {
  NSPAIR(_ZN3ccc9CC12x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x7y113pqrEv();
extern void _ZN3ccc9CC12x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x7y113pqrEv,_ZThn4_N3ccc9CC12x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x7y113pqrEv,_ZThn4_N3ccc9CC12x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y11E[];
Class_Descriptor cd__ZN3ccc9CC12x7y11E = {  "_ZN3ccc9CC12x7y11E", // class name
  bases__ZN3ccc9CC12x7y11E, 2,
  &(vtc__ZN3ccc9CC12x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y12  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC12x7y123abcEv
  ~CC12x7y12(); // tgen
  CC12x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y12E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC12x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x7y123abcEv");}
ccc::CC12x7y12 ::~CC12x7y12(){ note_dtor("_ZN3ccc9CC12x7y12E", this);} // tgen
ccc::CC12x7y12 ::CC12x7y12(){ note_ctor("_ZN3ccc9CC12x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y12E, buf);
    ::ccc::CC12x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y12E);
    dp->::ccc::CC12x7y12::~CC12x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y12E(Test__ZN3ccc9CC12x7y12E, "_ZN3ccc9CC12x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y12C1Ev();
extern void _ZN3ccc9CC12x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y12E[] = {
  NSPAIR(_ZN3ccc9CC12x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y12E[];
extern void _ZN3ccc9CC12x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x7y123abcEv,_ZThn4_N3ccc9CC12x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x7y123abcEv,_ZThn4_N3ccc9CC12x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y12E[];
Class_Descriptor cd__ZN3ccc9CC12x7y12E = {  "_ZN3ccc9CC12x7y12E", // class name
  bases__ZN3ccc9CC12x7y12E, 2,
  &(vtc__ZN3ccc9CC12x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y13  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC12x7y133efgEv
  ~CC12x7y13(); // tgen
  CC12x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y13E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x7y133efgEv");}
ccc::CC12x7y13 ::~CC12x7y13(){ note_dtor("_ZN3ccc9CC12x7y13E", this);} // tgen
ccc::CC12x7y13 ::CC12x7y13(){ note_ctor("_ZN3ccc9CC12x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y13E, buf);
    ::ccc::CC12x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y13E);
    dp->::ccc::CC12x7y13::~CC12x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y13E(Test__ZN3ccc9CC12x7y13E, "_ZN3ccc9CC12x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y13C1Ev();
extern void _ZN3ccc9CC12x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y13E[] = {
  NSPAIR(_ZN3ccc9CC12x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y13E[];
Class_Descriptor cd__ZN3ccc9CC12x7y13E = {  "_ZN3ccc9CC12x7y13E", // class name
  bases__ZN3ccc9CC12x7y13E, 2,
  &(vtc__ZN3ccc9CC12x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y14  : ::ccc::AA12 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC12x7y143pqrEv
  ~CC12x7y14(); // tgen
  CC12x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y14E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x7y143pqrEv");}
ccc::CC12x7y14 ::~CC12x7y14(){ note_dtor("_ZN3ccc9CC12x7y14E", this);} // tgen
ccc::CC12x7y14 ::CC12x7y14(){ note_ctor("_ZN3ccc9CC12x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y14E, buf);
    ::ccc::CC12x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y14E);
    dp->::ccc::CC12x7y14::~CC12x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y14E(Test__ZN3ccc9CC12x7y14E, "_ZN3ccc9CC12x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y14C1Ev();
extern void _ZN3ccc9CC12x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y14E[] = {
  NSPAIR(_ZN3ccc9CC12x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x7y143pqrEv,_ZThn4_N3ccc9CC12x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x7y143pqrEv,_ZThn4_N3ccc9CC12x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y14E[];
Class_Descriptor cd__ZN3ccc9CC12x7y14E = {  "_ZN3ccc9CC12x7y14E", // class name
  bases__ZN3ccc9CC12x7y14E, 2,
  &(vtc__ZN3ccc9CC12x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x7y15  : ::ccc::AA12 , ::ccc::BB7 {
  ~CC12x7y15(); // tgen
  CC12x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x7y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x7y15 ::~CC12x7y15(){ note_dtor("_ZN3ccc9CC12x7y15E", this);} // tgen
ccc::CC12x7y15 ::CC12x7y15(){ note_ctor("_ZN3ccc9CC12x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x7y15E, buf);
    ::ccc::CC12x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x7y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC12x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x7y15E);
    dp->::ccc::CC12x7y15::~CC12x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x7y15E(Test__ZN3ccc9CC12x7y15E, "_ZN3ccc9CC12x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x7y15C1Ev();
extern void _ZN3ccc9CC12x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x7y15E[] = {
  NSPAIR(_ZN3ccc9CC12x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC12x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x7y15E[];
Class_Descriptor cd__ZN3ccc9CC12x7y15E = {  "_ZN3ccc9CC12x7y15E", // class name
  bases__ZN3ccc9CC12x7y15E, 2,
  &(vtc__ZN3ccc9CC12x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x7y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y0  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC12x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y03pqrEv
  ~CC12x8y0(); // tgen
  CC12x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y0E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y03abcEv");}
void  ccc::CC12x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y03efgEv");}
void  ccc::CC12x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y03pqrEv");}
ccc::CC12x8y0 ::~CC12x8y0(){ note_dtor("_ZN3ccc8CC12x8y0E", this);} // tgen
ccc::CC12x8y0 ::CC12x8y0(){ note_ctor("_ZN3ccc8CC12x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y0E, buf);
    ::ccc::CC12x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y0E);
    dp->::ccc::CC12x8y0::~CC12x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y0E(Test__ZN3ccc8CC12x8y0E, "_ZN3ccc8CC12x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y0C1Ev();
extern void _ZN3ccc8CC12x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y0E[] = {
  NSPAIR(_ZN3ccc8CC12x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y0E[];
extern void _ZN3ccc8CC12x8y03abcEv();
extern void _ZN3ccc8CC12x8y03efgEv();
extern void _ZN3ccc8CC12x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y03efgEv,_ZThn4_N3ccc8CC12x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y03abcEv,_ZThn4_N3ccc8CC12x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y03efgEv,_ZThn4_N3ccc8CC12x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y03abcEv,_ZThn4_N3ccc8CC12x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y0E[];
Class_Descriptor cd__ZN3ccc8CC12x8y0E = {  "_ZN3ccc8CC12x8y0E", // class name
  bases__ZN3ccc8CC12x8y0E, 2,
  &(vtc__ZN3ccc8CC12x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y1  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC12x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x8y13efgEv
  ~CC12x8y1(); // tgen
  CC12x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y1E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y13abcEv");}
void  ccc::CC12x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y13pqrEv");}
void  ccc::CC12x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y13efgEv");}
ccc::CC12x8y1 ::~CC12x8y1(){ note_dtor("_ZN3ccc8CC12x8y1E", this);} // tgen
ccc::CC12x8y1 ::CC12x8y1(){ note_ctor("_ZN3ccc8CC12x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y1E, buf);
    ::ccc::CC12x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y1E);
    dp->::ccc::CC12x8y1::~CC12x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y1E(Test__ZN3ccc8CC12x8y1E, "_ZN3ccc8CC12x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y1C1Ev();
extern void _ZN3ccc8CC12x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y1E[] = {
  NSPAIR(_ZN3ccc8CC12x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y1E[];
extern void _ZN3ccc8CC12x8y13abcEv();
extern void _ZN3ccc8CC12x8y13pqrEv();
extern void _ZN3ccc8CC12x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y13efgEv,_ZThn4_N3ccc8CC12x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y13abcEv,_ZThn4_N3ccc8CC12x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y13efgEv,_ZThn4_N3ccc8CC12x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y13abcEv,_ZThn4_N3ccc8CC12x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y1E[];
Class_Descriptor cd__ZN3ccc8CC12x8y1E = {  "_ZN3ccc8CC12x8y1E", // class name
  bases__ZN3ccc8CC12x8y1E, 2,
  &(vtc__ZN3ccc8CC12x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y2  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC12x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y23pqrEv
  ~CC12x8y2(); // tgen
  CC12x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y2E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y23efgEv");}
void  ccc::CC12x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y23abcEv");}
void  ccc::CC12x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y23pqrEv");}
ccc::CC12x8y2 ::~CC12x8y2(){ note_dtor("_ZN3ccc8CC12x8y2E", this);} // tgen
ccc::CC12x8y2 ::CC12x8y2(){ note_ctor("_ZN3ccc8CC12x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y2E, buf);
    ::ccc::CC12x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y2E);
    dp->::ccc::CC12x8y2::~CC12x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y2E(Test__ZN3ccc8CC12x8y2E, "_ZN3ccc8CC12x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y2C1Ev();
extern void _ZN3ccc8CC12x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y2E[] = {
  NSPAIR(_ZN3ccc8CC12x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y2E[];
extern void _ZN3ccc8CC12x8y23abcEv();
extern void _ZN3ccc8CC12x8y23efgEv();
extern void _ZN3ccc8CC12x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y23efgEv,_ZThn4_N3ccc8CC12x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y23abcEv,_ZThn4_N3ccc8CC12x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y23efgEv,_ZThn4_N3ccc8CC12x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y23abcEv,_ZThn4_N3ccc8CC12x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y2E[];
Class_Descriptor cd__ZN3ccc8CC12x8y2E = {  "_ZN3ccc8CC12x8y2E", // class name
  bases__ZN3ccc8CC12x8y2E, 2,
  &(vtc__ZN3ccc8CC12x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y3  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC12x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x8y33abcEv
  ~CC12x8y3(); // tgen
  CC12x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y3E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y33efgEv");}
void  ccc::CC12x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y33pqrEv");}
void  ccc::CC12x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y33abcEv");}
ccc::CC12x8y3 ::~CC12x8y3(){ note_dtor("_ZN3ccc8CC12x8y3E", this);} // tgen
ccc::CC12x8y3 ::CC12x8y3(){ note_ctor("_ZN3ccc8CC12x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y3E, buf);
    ::ccc::CC12x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y3E);
    dp->::ccc::CC12x8y3::~CC12x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y3E(Test__ZN3ccc8CC12x8y3E, "_ZN3ccc8CC12x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y3C1Ev();
extern void _ZN3ccc8CC12x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y3E[] = {
  NSPAIR(_ZN3ccc8CC12x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y3E[];
extern void _ZN3ccc8CC12x8y33abcEv();
extern void _ZN3ccc8CC12x8y33efgEv();
extern void _ZN3ccc8CC12x8y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y33efgEv,_ZThn4_N3ccc8CC12x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y33abcEv,_ZThn4_N3ccc8CC12x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y33efgEv,_ZThn4_N3ccc8CC12x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y33abcEv,_ZThn4_N3ccc8CC12x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y3E[];
Class_Descriptor cd__ZN3ccc8CC12x8y3E = {  "_ZN3ccc8CC12x8y3E", // class name
  bases__ZN3ccc8CC12x8y3E, 2,
  &(vtc__ZN3ccc8CC12x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y4  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC12x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x8y43efgEv
  ~CC12x8y4(); // tgen
  CC12x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y4E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y43pqrEv");}
void  ccc::CC12x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y43abcEv");}
void  ccc::CC12x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y43efgEv");}
ccc::CC12x8y4 ::~CC12x8y4(){ note_dtor("_ZN3ccc8CC12x8y4E", this);} // tgen
ccc::CC12x8y4 ::CC12x8y4(){ note_ctor("_ZN3ccc8CC12x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y4E, buf);
    ::ccc::CC12x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y4E);
    dp->::ccc::CC12x8y4::~CC12x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y4E(Test__ZN3ccc8CC12x8y4E, "_ZN3ccc8CC12x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y4C1Ev();
extern void _ZN3ccc8CC12x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y4E[] = {
  NSPAIR(_ZN3ccc8CC12x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y4E[];
extern void _ZN3ccc8CC12x8y43abcEv();
extern void _ZN3ccc8CC12x8y43pqrEv();
extern void _ZN3ccc8CC12x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y43efgEv,_ZThn4_N3ccc8CC12x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y43abcEv,_ZThn4_N3ccc8CC12x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y43efgEv,_ZThn4_N3ccc8CC12x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y43abcEv,_ZThn4_N3ccc8CC12x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y4E[];
Class_Descriptor cd__ZN3ccc8CC12x8y4E = {  "_ZN3ccc8CC12x8y4E", // class name
  bases__ZN3ccc8CC12x8y4E, 2,
  &(vtc__ZN3ccc8CC12x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y5  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC12x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x8y53abcEv
  ~CC12x8y5(); // tgen
  CC12x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y5E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y53pqrEv");}
void  ccc::CC12x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y53efgEv");}
void  ccc::CC12x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y53abcEv");}
ccc::CC12x8y5 ::~CC12x8y5(){ note_dtor("_ZN3ccc8CC12x8y5E", this);} // tgen
ccc::CC12x8y5 ::CC12x8y5(){ note_ctor("_ZN3ccc8CC12x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y5E, buf);
    ::ccc::CC12x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y5E);
    dp->::ccc::CC12x8y5::~CC12x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y5E(Test__ZN3ccc8CC12x8y5E, "_ZN3ccc8CC12x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y5C1Ev();
extern void _ZN3ccc8CC12x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y5E[] = {
  NSPAIR(_ZN3ccc8CC12x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y5E[];
extern void _ZN3ccc8CC12x8y53abcEv();
extern void _ZN3ccc8CC12x8y53pqrEv();
extern void _ZN3ccc8CC12x8y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y53efgEv,_ZThn4_N3ccc8CC12x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y53abcEv,_ZThn4_N3ccc8CC12x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y53efgEv,_ZThn4_N3ccc8CC12x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y53abcEv,_ZThn4_N3ccc8CC12x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y5E[];
Class_Descriptor cd__ZN3ccc8CC12x8y5E = {  "_ZN3ccc8CC12x8y5E", // class name
  bases__ZN3ccc8CC12x8y5E, 2,
  &(vtc__ZN3ccc8CC12x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y6  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC12x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x8y63efgEv
  ~CC12x8y6(); // tgen
  CC12x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y6E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y63abcEv");}
void  ccc::CC12x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y63efgEv");}
ccc::CC12x8y6 ::~CC12x8y6(){ note_dtor("_ZN3ccc8CC12x8y6E", this);} // tgen
ccc::CC12x8y6 ::CC12x8y6(){ note_ctor("_ZN3ccc8CC12x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y6E, buf);
    ::ccc::CC12x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y6E);
    dp->::ccc::CC12x8y6::~CC12x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y6E(Test__ZN3ccc8CC12x8y6E, "_ZN3ccc8CC12x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y6C1Ev();
extern void _ZN3ccc8CC12x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y6E[] = {
  NSPAIR(_ZN3ccc8CC12x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y6E[];
extern void _ZN3ccc8CC12x8y63abcEv();
extern void _ZN3ccc8CC12x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y63efgEv,_ZThn4_N3ccc8CC12x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y63abcEv,_ZThn4_N3ccc8CC12x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y63efgEv,_ZThn4_N3ccc8CC12x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y63abcEv,_ZThn4_N3ccc8CC12x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y6E[];
Class_Descriptor cd__ZN3ccc8CC12x8y6E = {  "_ZN3ccc8CC12x8y6E", // class name
  bases__ZN3ccc8CC12x8y6E, 2,
  &(vtc__ZN3ccc8CC12x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y7  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC12x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y73pqrEv
  ~CC12x8y7(); // tgen
  CC12x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y7E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y73abcEv");}
void  ccc::CC12x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y73pqrEv");}
ccc::CC12x8y7 ::~CC12x8y7(){ note_dtor("_ZN3ccc8CC12x8y7E", this);} // tgen
ccc::CC12x8y7 ::CC12x8y7(){ note_ctor("_ZN3ccc8CC12x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y7E, buf);
    ::ccc::CC12x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y7E);
    dp->::ccc::CC12x8y7::~CC12x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y7E(Test__ZN3ccc8CC12x8y7E, "_ZN3ccc8CC12x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y7C1Ev();
extern void _ZN3ccc8CC12x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y7E[] = {
  NSPAIR(_ZN3ccc8CC12x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y7E[];
extern void _ZN3ccc8CC12x8y73abcEv();
extern void _ZN3ccc8CC12x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y73abcEv,_ZThn4_N3ccc8CC12x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y73abcEv,_ZThn4_N3ccc8CC12x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y7E[];
Class_Descriptor cd__ZN3ccc8CC12x8y7E = {  "_ZN3ccc8CC12x8y7E", // class name
  bases__ZN3ccc8CC12x8y7E, 2,
  &(vtc__ZN3ccc8CC12x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y8  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC12x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x8y83abcEv
  ~CC12x8y8(); // tgen
  CC12x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y8E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y83efgEv");}
void  ccc::CC12x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x8y83abcEv");}
ccc::CC12x8y8 ::~CC12x8y8(){ note_dtor("_ZN3ccc8CC12x8y8E", this);} // tgen
ccc::CC12x8y8 ::CC12x8y8(){ note_ctor("_ZN3ccc8CC12x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y8E, buf);
    ::ccc::CC12x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y8E);
    dp->::ccc::CC12x8y8::~CC12x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y8E(Test__ZN3ccc8CC12x8y8E, "_ZN3ccc8CC12x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y8C1Ev();
extern void _ZN3ccc8CC12x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y8E[] = {
  NSPAIR(_ZN3ccc8CC12x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y8E[];
extern void _ZN3ccc8CC12x8y83abcEv();
extern void _ZN3ccc8CC12x8y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y83efgEv,_ZThn4_N3ccc8CC12x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y83abcEv,_ZThn4_N3ccc8CC12x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y83efgEv,_ZThn4_N3ccc8CC12x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y83abcEv,_ZThn4_N3ccc8CC12x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y8E[];
Class_Descriptor cd__ZN3ccc8CC12x8y8E = {  "_ZN3ccc8CC12x8y8E", // class name
  bases__ZN3ccc8CC12x8y8E, 2,
  &(vtc__ZN3ccc8CC12x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y9  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC12x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x8y93pqrEv
  ~CC12x8y9(); // tgen
  CC12x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x8y9E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x8y93efgEv");}
void  ccc::CC12x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x8y93pqrEv");}
ccc::CC12x8y9 ::~CC12x8y9(){ note_dtor("_ZN3ccc8CC12x8y9E", this);} // tgen
ccc::CC12x8y9 ::CC12x8y9(){ note_ctor("_ZN3ccc8CC12x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x8y9E, buf);
    ::ccc::CC12x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x8y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC12x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x8y9E);
    dp->::ccc::CC12x8y9::~CC12x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x8y9E(Test__ZN3ccc8CC12x8y9E, "_ZN3ccc8CC12x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x8y9C1Ev();
extern void _ZN3ccc8CC12x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x8y9E[] = {
  NSPAIR(_ZN3ccc8CC12x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC12x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x8y93efgEv();
extern void _ZN3ccc8CC12x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x8y93efgEv,_ZThn4_N3ccc8CC12x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x8y93efgEv,_ZThn4_N3ccc8CC12x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x8y9E[];
Class_Descriptor cd__ZN3ccc8CC12x8y9E = {  "_ZN3ccc8CC12x8y9E", // class name
  bases__ZN3ccc8CC12x8y9E, 2,
  &(vtc__ZN3ccc8CC12x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x8y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y10  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC12x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x8y103abcEv
  ~CC12x8y10(); // tgen
  CC12x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y10E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x8y103pqrEv");}
void  ccc::CC12x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x8y103abcEv");}
ccc::CC12x8y10 ::~CC12x8y10(){ note_dtor("_ZN3ccc9CC12x8y10E", this);} // tgen
ccc::CC12x8y10 ::CC12x8y10(){ note_ctor("_ZN3ccc9CC12x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y10E, buf);
    ::ccc::CC12x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y10E);
    dp->::ccc::CC12x8y10::~CC12x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y10E(Test__ZN3ccc9CC12x8y10E, "_ZN3ccc9CC12x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y10C1Ev();
extern void _ZN3ccc9CC12x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y10E[] = {
  NSPAIR(_ZN3ccc9CC12x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y10E[];
extern void _ZN3ccc9CC12x8y103abcEv();
extern void _ZN3ccc9CC12x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x8y103abcEv,_ZThn4_N3ccc9CC12x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x8y103abcEv,_ZThn4_N3ccc9CC12x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y10E[];
Class_Descriptor cd__ZN3ccc9CC12x8y10E = {  "_ZN3ccc9CC12x8y10E", // class name
  bases__ZN3ccc9CC12x8y10E, 2,
  &(vtc__ZN3ccc9CC12x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y11  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC12x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x8y113efgEv
  ~CC12x8y11(); // tgen
  CC12x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y11E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x8y113pqrEv");}
void  ccc::CC12x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x8y113efgEv");}
ccc::CC12x8y11 ::~CC12x8y11(){ note_dtor("_ZN3ccc9CC12x8y11E", this);} // tgen
ccc::CC12x8y11 ::CC12x8y11(){ note_ctor("_ZN3ccc9CC12x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y11E, buf);
    ::ccc::CC12x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y11E);
    dp->::ccc::CC12x8y11::~CC12x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y11E(Test__ZN3ccc9CC12x8y11E, "_ZN3ccc9CC12x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y11C1Ev();
extern void _ZN3ccc9CC12x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y11E[] = {
  NSPAIR(_ZN3ccc9CC12x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x8y113pqrEv();
extern void _ZN3ccc9CC12x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x8y113efgEv,_ZThn4_N3ccc9CC12x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x8y113efgEv,_ZThn4_N3ccc9CC12x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y11E[];
Class_Descriptor cd__ZN3ccc9CC12x8y11E = {  "_ZN3ccc9CC12x8y11E", // class name
  bases__ZN3ccc9CC12x8y11E, 2,
  &(vtc__ZN3ccc9CC12x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y12  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC12x8y123abcEv
  ~CC12x8y12(); // tgen
  CC12x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y12E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC12x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x8y123abcEv");}
ccc::CC12x8y12 ::~CC12x8y12(){ note_dtor("_ZN3ccc9CC12x8y12E", this);} // tgen
ccc::CC12x8y12 ::CC12x8y12(){ note_ctor("_ZN3ccc9CC12x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y12E, buf);
    ::ccc::CC12x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y12E);
    dp->::ccc::CC12x8y12::~CC12x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y12E(Test__ZN3ccc9CC12x8y12E, "_ZN3ccc9CC12x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y12C1Ev();
extern void _ZN3ccc9CC12x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y12E[] = {
  NSPAIR(_ZN3ccc9CC12x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y12E[];
extern void _ZN3ccc9CC12x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x8y123abcEv,_ZThn4_N3ccc9CC12x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x8y123abcEv,_ZThn4_N3ccc9CC12x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y12E[];
Class_Descriptor cd__ZN3ccc9CC12x8y12E = {  "_ZN3ccc9CC12x8y12E", // class name
  bases__ZN3ccc9CC12x8y12E, 2,
  &(vtc__ZN3ccc9CC12x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y13  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC12x8y133efgEv
  ~CC12x8y13(); // tgen
  CC12x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y13E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x8y133efgEv");}
ccc::CC12x8y13 ::~CC12x8y13(){ note_dtor("_ZN3ccc9CC12x8y13E", this);} // tgen
ccc::CC12x8y13 ::CC12x8y13(){ note_ctor("_ZN3ccc9CC12x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y13E, buf);
    ::ccc::CC12x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y13E);
    dp->::ccc::CC12x8y13::~CC12x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y13E(Test__ZN3ccc9CC12x8y13E, "_ZN3ccc9CC12x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y13C1Ev();
extern void _ZN3ccc9CC12x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y13E[] = {
  NSPAIR(_ZN3ccc9CC12x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x8y133efgEv,_ZThn4_N3ccc9CC12x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x8y133efgEv,_ZThn4_N3ccc9CC12x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y13E[];
Class_Descriptor cd__ZN3ccc9CC12x8y13E = {  "_ZN3ccc9CC12x8y13E", // class name
  bases__ZN3ccc9CC12x8y13E, 2,
  &(vtc__ZN3ccc9CC12x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y14  : ::ccc::AA12 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC12x8y143pqrEv
  ~CC12x8y14(); // tgen
  CC12x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y14E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x8y143pqrEv");}
ccc::CC12x8y14 ::~CC12x8y14(){ note_dtor("_ZN3ccc9CC12x8y14E", this);} // tgen
ccc::CC12x8y14 ::CC12x8y14(){ note_ctor("_ZN3ccc9CC12x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y14E, buf);
    ::ccc::CC12x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y14E);
    dp->::ccc::CC12x8y14::~CC12x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y14E(Test__ZN3ccc9CC12x8y14E, "_ZN3ccc9CC12x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y14C1Ev();
extern void _ZN3ccc9CC12x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y14E[] = {
  NSPAIR(_ZN3ccc9CC12x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y14E[];
Class_Descriptor cd__ZN3ccc9CC12x8y14E = {  "_ZN3ccc9CC12x8y14E", // class name
  bases__ZN3ccc9CC12x8y14E, 2,
  &(vtc__ZN3ccc9CC12x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x8y15  : ::ccc::AA12 , ::ccc::BB8 {
  ~CC12x8y15(); // tgen
  CC12x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x8y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x8y15 ::~CC12x8y15(){ note_dtor("_ZN3ccc9CC12x8y15E", this);} // tgen
ccc::CC12x8y15 ::CC12x8y15(){ note_ctor("_ZN3ccc9CC12x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x8y15E, buf);
    ::ccc::CC12x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x8y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC12x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x8y15E);
    dp->::ccc::CC12x8y15::~CC12x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x8y15E(Test__ZN3ccc9CC12x8y15E, "_ZN3ccc9CC12x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x8y15C1Ev();
extern void _ZN3ccc9CC12x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x8y15E[] = {
  NSPAIR(_ZN3ccc9CC12x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC12x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x8y15E[];
Class_Descriptor cd__ZN3ccc9CC12x8y15E = {  "_ZN3ccc9CC12x8y15E", // class name
  bases__ZN3ccc9CC12x8y15E, 2,
  &(vtc__ZN3ccc9CC12x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x8y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y0  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC12x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC12x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y03pqrEv
  ~CC12x9y0(); // tgen
  CC12x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y0E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y03abcEv");}
void  ccc::CC12x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y03efgEv");}
void  ccc::CC12x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y03pqrEv");}
ccc::CC12x9y0 ::~CC12x9y0(){ note_dtor("_ZN3ccc8CC12x9y0E", this);} // tgen
ccc::CC12x9y0 ::CC12x9y0(){ note_ctor("_ZN3ccc8CC12x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y0E, buf);
    ::ccc::CC12x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y0E);
    dp->::ccc::CC12x9y0::~CC12x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y0E(Test__ZN3ccc8CC12x9y0E, "_ZN3ccc8CC12x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y0C1Ev();
extern void _ZN3ccc8CC12x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y0E[] = {
  NSPAIR(_ZN3ccc8CC12x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y0E[];
extern void _ZN3ccc8CC12x9y03abcEv();
extern void _ZN3ccc8CC12x9y03efgEv();
extern void _ZN3ccc8CC12x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y03efgEv,_ZThn4_N3ccc8CC12x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y03pqrEv,_ZThn4_N3ccc8CC12x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y03efgEv,_ZThn4_N3ccc8CC12x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y03pqrEv,_ZThn4_N3ccc8CC12x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y0E[];
Class_Descriptor cd__ZN3ccc8CC12x9y0E = {  "_ZN3ccc8CC12x9y0E", // class name
  bases__ZN3ccc8CC12x9y0E, 2,
  &(vtc__ZN3ccc8CC12x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y1  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC12x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x9y13efgEv
  ~CC12x9y1(); // tgen
  CC12x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y1E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y13abcEv");}
void  ccc::CC12x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y13pqrEv");}
void  ccc::CC12x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y13efgEv");}
ccc::CC12x9y1 ::~CC12x9y1(){ note_dtor("_ZN3ccc8CC12x9y1E", this);} // tgen
ccc::CC12x9y1 ::CC12x9y1(){ note_ctor("_ZN3ccc8CC12x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y1E, buf);
    ::ccc::CC12x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y1E);
    dp->::ccc::CC12x9y1::~CC12x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y1E(Test__ZN3ccc8CC12x9y1E, "_ZN3ccc8CC12x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y1C1Ev();
extern void _ZN3ccc8CC12x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y1E[] = {
  NSPAIR(_ZN3ccc8CC12x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y1E[];
extern void _ZN3ccc8CC12x9y13abcEv();
extern void _ZN3ccc8CC12x9y13pqrEv();
extern void _ZN3ccc8CC12x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y13efgEv,_ZThn4_N3ccc8CC12x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y13pqrEv,_ZThn4_N3ccc8CC12x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y13efgEv,_ZThn4_N3ccc8CC12x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y13pqrEv,_ZThn4_N3ccc8CC12x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y1E[];
Class_Descriptor cd__ZN3ccc8CC12x9y1E = {  "_ZN3ccc8CC12x9y1E", // class name
  bases__ZN3ccc8CC12x9y1E, 2,
  &(vtc__ZN3ccc8CC12x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y2  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC12x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC12x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y23pqrEv
  ~CC12x9y2(); // tgen
  CC12x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y2E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y23efgEv");}
void  ccc::CC12x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y23abcEv");}
void  ccc::CC12x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y23pqrEv");}
ccc::CC12x9y2 ::~CC12x9y2(){ note_dtor("_ZN3ccc8CC12x9y2E", this);} // tgen
ccc::CC12x9y2 ::CC12x9y2(){ note_ctor("_ZN3ccc8CC12x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y2E, buf);
    ::ccc::CC12x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y2E);
    dp->::ccc::CC12x9y2::~CC12x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y2E(Test__ZN3ccc8CC12x9y2E, "_ZN3ccc8CC12x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y2C1Ev();
extern void _ZN3ccc8CC12x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y2E[] = {
  NSPAIR(_ZN3ccc8CC12x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y2E[];
extern void _ZN3ccc8CC12x9y23abcEv();
extern void _ZN3ccc8CC12x9y23efgEv();
extern void _ZN3ccc8CC12x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y23efgEv,_ZThn4_N3ccc8CC12x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y23pqrEv,_ZThn4_N3ccc8CC12x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y23efgEv,_ZThn4_N3ccc8CC12x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y23pqrEv,_ZThn4_N3ccc8CC12x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y2E[];
Class_Descriptor cd__ZN3ccc8CC12x9y2E = {  "_ZN3ccc8CC12x9y2E", // class name
  bases__ZN3ccc8CC12x9y2E, 2,
  &(vtc__ZN3ccc8CC12x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y3  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC12x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x9y33abcEv
  ~CC12x9y3(); // tgen
  CC12x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y3E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y33efgEv");}
void  ccc::CC12x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y33pqrEv");}
void  ccc::CC12x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y33abcEv");}
ccc::CC12x9y3 ::~CC12x9y3(){ note_dtor("_ZN3ccc8CC12x9y3E", this);} // tgen
ccc::CC12x9y3 ::CC12x9y3(){ note_ctor("_ZN3ccc8CC12x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y3E, buf);
    ::ccc::CC12x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y3E);
    dp->::ccc::CC12x9y3::~CC12x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y3E(Test__ZN3ccc8CC12x9y3E, "_ZN3ccc8CC12x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y3C1Ev();
extern void _ZN3ccc8CC12x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y3E[] = {
  NSPAIR(_ZN3ccc8CC12x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y3E[];
extern void _ZN3ccc8CC12x9y33abcEv();
extern void _ZN3ccc8CC12x9y33efgEv();
extern void _ZN3ccc8CC12x9y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y33efgEv,_ZThn4_N3ccc8CC12x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y33pqrEv,_ZThn4_N3ccc8CC12x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y33efgEv,_ZThn4_N3ccc8CC12x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y33pqrEv,_ZThn4_N3ccc8CC12x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y3E[];
Class_Descriptor cd__ZN3ccc8CC12x9y3E = {  "_ZN3ccc8CC12x9y3E", // class name
  bases__ZN3ccc8CC12x9y3E, 2,
  &(vtc__ZN3ccc8CC12x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y4  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC12x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC12x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC12x9y43efgEv
  ~CC12x9y4(); // tgen
  CC12x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y4E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y43pqrEv");}
void  ccc::CC12x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y43abcEv");}
void  ccc::CC12x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y43efgEv");}
ccc::CC12x9y4 ::~CC12x9y4(){ note_dtor("_ZN3ccc8CC12x9y4E", this);} // tgen
ccc::CC12x9y4 ::CC12x9y4(){ note_ctor("_ZN3ccc8CC12x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y4E, buf);
    ::ccc::CC12x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y4E);
    dp->::ccc::CC12x9y4::~CC12x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y4E(Test__ZN3ccc8CC12x9y4E, "_ZN3ccc8CC12x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y4C1Ev();
extern void _ZN3ccc8CC12x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y4E[] = {
  NSPAIR(_ZN3ccc8CC12x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y4E[];
extern void _ZN3ccc8CC12x9y43abcEv();
extern void _ZN3ccc8CC12x9y43pqrEv();
extern void _ZN3ccc8CC12x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y43efgEv,_ZThn4_N3ccc8CC12x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y43pqrEv,_ZThn4_N3ccc8CC12x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y43efgEv,_ZThn4_N3ccc8CC12x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y43pqrEv,_ZThn4_N3ccc8CC12x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y4E[];
Class_Descriptor cd__ZN3ccc8CC12x9y4E = {  "_ZN3ccc8CC12x9y4E", // class name
  bases__ZN3ccc8CC12x9y4E, 2,
  &(vtc__ZN3ccc8CC12x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y5  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC12x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC12x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC12x9y53abcEv
  ~CC12x9y5(); // tgen
  CC12x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y5E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y53pqrEv");}
void  ccc::CC12x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y53efgEv");}
void  ccc::CC12x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y53abcEv");}
ccc::CC12x9y5 ::~CC12x9y5(){ note_dtor("_ZN3ccc8CC12x9y5E", this);} // tgen
ccc::CC12x9y5 ::CC12x9y5(){ note_ctor("_ZN3ccc8CC12x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y5E, buf);
    ::ccc::CC12x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y5E);
    dp->::ccc::CC12x9y5::~CC12x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y5E(Test__ZN3ccc8CC12x9y5E, "_ZN3ccc8CC12x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y5C1Ev();
extern void _ZN3ccc8CC12x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y5E[] = {
  NSPAIR(_ZN3ccc8CC12x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y5E[];
extern void _ZN3ccc8CC12x9y53abcEv();
extern void _ZN3ccc8CC12x9y53pqrEv();
extern void _ZN3ccc8CC12x9y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y53efgEv,_ZThn4_N3ccc8CC12x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y53pqrEv,_ZThn4_N3ccc8CC12x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y53efgEv,_ZThn4_N3ccc8CC12x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y53pqrEv,_ZThn4_N3ccc8CC12x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y5E[];
Class_Descriptor cd__ZN3ccc8CC12x9y5E = {  "_ZN3ccc8CC12x9y5E", // class name
  bases__ZN3ccc8CC12x9y5E, 2,
  &(vtc__ZN3ccc8CC12x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y6  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC12x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC12x9y63efgEv
  ~CC12x9y6(); // tgen
  CC12x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y6E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y63abcEv");}
void  ccc::CC12x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y63efgEv");}
ccc::CC12x9y6 ::~CC12x9y6(){ note_dtor("_ZN3ccc8CC12x9y6E", this);} // tgen
ccc::CC12x9y6 ::CC12x9y6(){ note_ctor("_ZN3ccc8CC12x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y6E, buf);
    ::ccc::CC12x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y6E);
    dp->::ccc::CC12x9y6::~CC12x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y6E(Test__ZN3ccc8CC12x9y6E, "_ZN3ccc8CC12x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y6C1Ev();
extern void _ZN3ccc8CC12x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y6E[] = {
  NSPAIR(_ZN3ccc8CC12x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y6E[];
extern void _ZN3ccc8CC12x9y63abcEv();
extern void _ZN3ccc8CC12x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y63efgEv,_ZThn4_N3ccc8CC12x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y63efgEv,_ZThn4_N3ccc8CC12x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y6E[];
Class_Descriptor cd__ZN3ccc8CC12x9y6E = {  "_ZN3ccc8CC12x9y6E", // class name
  bases__ZN3ccc8CC12x9y6E, 2,
  &(vtc__ZN3ccc8CC12x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y7  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC12x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y73pqrEv
  ~CC12x9y7(); // tgen
  CC12x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y7E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y73abcEv");}
void  ccc::CC12x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y73pqrEv");}
ccc::CC12x9y7 ::~CC12x9y7(){ note_dtor("_ZN3ccc8CC12x9y7E", this);} // tgen
ccc::CC12x9y7 ::CC12x9y7(){ note_ctor("_ZN3ccc8CC12x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y7E, buf);
    ::ccc::CC12x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y7E);
    dp->::ccc::CC12x9y7::~CC12x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y7E(Test__ZN3ccc8CC12x9y7E, "_ZN3ccc8CC12x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y7C1Ev();
extern void _ZN3ccc8CC12x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y7E[] = {
  NSPAIR(_ZN3ccc8CC12x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y7E[];
extern void _ZN3ccc8CC12x9y73abcEv();
extern void _ZN3ccc8CC12x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y73pqrEv,_ZThn4_N3ccc8CC12x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y73pqrEv,_ZThn4_N3ccc8CC12x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y7E[];
Class_Descriptor cd__ZN3ccc8CC12x9y7E = {  "_ZN3ccc8CC12x9y7E", // class name
  bases__ZN3ccc8CC12x9y7E, 2,
  &(vtc__ZN3ccc8CC12x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y8  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC12x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC12x9y83abcEv
  ~CC12x9y8(); // tgen
  CC12x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y8E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y83efgEv");}
void  ccc::CC12x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC12x9y83abcEv");}
ccc::CC12x9y8 ::~CC12x9y8(){ note_dtor("_ZN3ccc8CC12x9y8E", this);} // tgen
ccc::CC12x9y8 ::CC12x9y8(){ note_ctor("_ZN3ccc8CC12x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y8E, buf);
    ::ccc::CC12x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y8E);
    dp->::ccc::CC12x9y8::~CC12x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y8E(Test__ZN3ccc8CC12x9y8E, "_ZN3ccc8CC12x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y8C1Ev();
extern void _ZN3ccc8CC12x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y8E[] = {
  NSPAIR(_ZN3ccc8CC12x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y8E[];
extern void _ZN3ccc8CC12x9y83abcEv();
extern void _ZN3ccc8CC12x9y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y83efgEv,_ZThn4_N3ccc8CC12x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y83efgEv,_ZThn4_N3ccc8CC12x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y8E[];
Class_Descriptor cd__ZN3ccc8CC12x9y8E = {  "_ZN3ccc8CC12x9y8E", // class name
  bases__ZN3ccc8CC12x9y8E, 2,
  &(vtc__ZN3ccc8CC12x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y9  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC12x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC12x9y93pqrEv
  ~CC12x9y9(); // tgen
  CC12x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC12x9y9E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC12x9y93efgEv");}
void  ccc::CC12x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC12x9y93pqrEv");}
ccc::CC12x9y9 ::~CC12x9y9(){ note_dtor("_ZN3ccc8CC12x9y9E", this);} // tgen
ccc::CC12x9y9 ::CC12x9y9(){ note_ctor("_ZN3ccc8CC12x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC12x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC12x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC12x9y9E, buf);
    ::ccc::CC12x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC12x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC12x9y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc8CC12x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC12x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC12x9y9E);
    dp->::ccc::CC12x9y9::~CC12x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC12x9y9E(Test__ZN3ccc8CC12x9y9E, "_ZN3ccc8CC12x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC12x9y9C1Ev();
extern void _ZN3ccc8CC12x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC12x9y9E[] = {
  NSPAIR(_ZN3ccc8CC12x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC12x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC12x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc8CC12x9y93efgEv();
extern void _ZN3ccc8CC12x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y93efgEv,_ZThn4_N3ccc8CC12x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC12x9y93pqrEv,_ZThn4_N3ccc8CC12x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC12x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC12x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC12x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y93efgEv,_ZThn4_N3ccc8CC12x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC12x9y93pqrEv,_ZThn4_N3ccc8CC12x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC12x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC12x9y9E[];
Class_Descriptor cd__ZN3ccc8CC12x9y9E = {  "_ZN3ccc8CC12x9y9E", // class name
  bases__ZN3ccc8CC12x9y9E, 2,
  &(vtc__ZN3ccc8CC12x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC12x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC12x9y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y10  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC12x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x9y103abcEv
  ~CC12x9y10(); // tgen
  CC12x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y10E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x9y103pqrEv");}
void  ccc::CC12x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x9y103abcEv");}
ccc::CC12x9y10 ::~CC12x9y10(){ note_dtor("_ZN3ccc9CC12x9y10E", this);} // tgen
ccc::CC12x9y10 ::CC12x9y10(){ note_ctor("_ZN3ccc9CC12x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y10E, buf);
    ::ccc::CC12x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y10E);
    dp->::ccc::CC12x9y10::~CC12x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y10E(Test__ZN3ccc9CC12x9y10E, "_ZN3ccc9CC12x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y10C1Ev();
extern void _ZN3ccc9CC12x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y10E[] = {
  NSPAIR(_ZN3ccc9CC12x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y10E[];
extern void _ZN3ccc9CC12x9y103abcEv();
extern void _ZN3ccc9CC12x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x9y103pqrEv,_ZThn4_N3ccc9CC12x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x9y103pqrEv,_ZThn4_N3ccc9CC12x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y10E[];
Class_Descriptor cd__ZN3ccc9CC12x9y10E = {  "_ZN3ccc9CC12x9y10E", // class name
  bases__ZN3ccc9CC12x9y10E, 2,
  &(vtc__ZN3ccc9CC12x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y11  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC12x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x9y113efgEv
  ~CC12x9y11(); // tgen
  CC12x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y11E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x9y113pqrEv");}
void  ccc::CC12x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x9y113efgEv");}
ccc::CC12x9y11 ::~CC12x9y11(){ note_dtor("_ZN3ccc9CC12x9y11E", this);} // tgen
ccc::CC12x9y11 ::CC12x9y11(){ note_ctor("_ZN3ccc9CC12x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y11E, buf);
    ::ccc::CC12x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y11E);
    dp->::ccc::CC12x9y11::~CC12x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y11E(Test__ZN3ccc9CC12x9y11E, "_ZN3ccc9CC12x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y11C1Ev();
extern void _ZN3ccc9CC12x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y11E[] = {
  NSPAIR(_ZN3ccc9CC12x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x9y113pqrEv();
extern void _ZN3ccc9CC12x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x9y113efgEv,_ZThn4_N3ccc9CC12x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x9y113pqrEv,_ZThn4_N3ccc9CC12x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x9y113efgEv,_ZThn4_N3ccc9CC12x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x9y113pqrEv,_ZThn4_N3ccc9CC12x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y11E[];
Class_Descriptor cd__ZN3ccc9CC12x9y11E = {  "_ZN3ccc9CC12x9y11E", // class name
  bases__ZN3ccc9CC12x9y11E, 2,
  &(vtc__ZN3ccc9CC12x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y12  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC12x9y123abcEv
  ~CC12x9y12(); // tgen
  CC12x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y12E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC12x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x9y123abcEv");}
ccc::CC12x9y12 ::~CC12x9y12(){ note_dtor("_ZN3ccc9CC12x9y12E", this);} // tgen
ccc::CC12x9y12 ::CC12x9y12(){ note_ctor("_ZN3ccc9CC12x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y12E, buf);
    ::ccc::CC12x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y12E);
    dp->::ccc::CC12x9y12::~CC12x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y12E(Test__ZN3ccc9CC12x9y12E, "_ZN3ccc9CC12x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y12C1Ev();
extern void _ZN3ccc9CC12x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y12E[] = {
  NSPAIR(_ZN3ccc9CC12x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y12E[];
extern void _ZN3ccc9CC12x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y12E[];
Class_Descriptor cd__ZN3ccc9CC12x9y12E = {  "_ZN3ccc9CC12x9y12E", // class name
  bases__ZN3ccc9CC12x9y12E, 2,
  &(vtc__ZN3ccc9CC12x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y13  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC12x9y133efgEv
  ~CC12x9y13(); // tgen
  CC12x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y13E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x9y133efgEv");}
ccc::CC12x9y13 ::~CC12x9y13(){ note_dtor("_ZN3ccc9CC12x9y13E", this);} // tgen
ccc::CC12x9y13 ::CC12x9y13(){ note_ctor("_ZN3ccc9CC12x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y13E, buf);
    ::ccc::CC12x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y13E);
    dp->::ccc::CC12x9y13::~CC12x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y13E(Test__ZN3ccc9CC12x9y13E, "_ZN3ccc9CC12x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y13C1Ev();
extern void _ZN3ccc9CC12x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y13E[] = {
  NSPAIR(_ZN3ccc9CC12x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x9y133efgEv,_ZThn4_N3ccc9CC12x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x9y133efgEv,_ZThn4_N3ccc9CC12x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y13E[];
Class_Descriptor cd__ZN3ccc9CC12x9y13E = {  "_ZN3ccc9CC12x9y13E", // class name
  bases__ZN3ccc9CC12x9y13E, 2,
  &(vtc__ZN3ccc9CC12x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y14  : ::ccc::AA12 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC12x9y143pqrEv
  ~CC12x9y14(); // tgen
  CC12x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y14E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x9y143pqrEv");}
ccc::CC12x9y14 ::~CC12x9y14(){ note_dtor("_ZN3ccc9CC12x9y14E", this);} // tgen
ccc::CC12x9y14 ::CC12x9y14(){ note_ctor("_ZN3ccc9CC12x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y14E, buf);
    ::ccc::CC12x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y14E);
    dp->::ccc::CC12x9y14::~CC12x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y14E(Test__ZN3ccc9CC12x9y14E, "_ZN3ccc9CC12x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y14C1Ev();
extern void _ZN3ccc9CC12x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y14E[] = {
  NSPAIR(_ZN3ccc9CC12x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x9y143pqrEv,_ZThn4_N3ccc9CC12x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x9y143pqrEv,_ZThn4_N3ccc9CC12x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y14E[];
Class_Descriptor cd__ZN3ccc9CC12x9y14E = {  "_ZN3ccc9CC12x9y14E", // class name
  bases__ZN3ccc9CC12x9y14E, 2,
  &(vtc__ZN3ccc9CC12x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x9y15  : ::ccc::AA12 , ::ccc::BB9 {
  ~CC12x9y15(); // tgen
  CC12x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC12x9y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x9y15 ::~CC12x9y15(){ note_dtor("_ZN3ccc9CC12x9y15E", this);} // tgen
ccc::CC12x9y15 ::CC12x9y15(){ note_ctor("_ZN3ccc9CC12x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC12x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x9y15E, buf);
    ::ccc::CC12x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x9y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC12x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x9y15E);
    dp->::ccc::CC12x9y15::~CC12x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x9y15E(Test__ZN3ccc9CC12x9y15E, "_ZN3ccc9CC12x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x9y15C1Ev();
extern void _ZN3ccc9CC12x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC12x9y15E[] = {
  NSPAIR(_ZN3ccc9CC12x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC12x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC12x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x9y15E[];
Class_Descriptor cd__ZN3ccc9CC12x9y15E = {  "_ZN3ccc9CC12x9y15E", // class name
  bases__ZN3ccc9CC12x9y15E, 2,
  &(vtc__ZN3ccc9CC12x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x9y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y0  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC12x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y03pqrEv
  ~CC12x10y0(); // tgen
  CC12x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y0E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y03abcEv");}
void  ccc::CC12x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y03efgEv");}
void  ccc::CC12x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y03pqrEv");}
ccc::CC12x10y0 ::~CC12x10y0(){ note_dtor("_ZN3ccc9CC12x10y0E", this);} // tgen
ccc::CC12x10y0 ::CC12x10y0(){ note_ctor("_ZN3ccc9CC12x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y0E, buf);
    ::ccc::CC12x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y0E);
    dp->::ccc::CC12x10y0::~CC12x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y0E(Test__ZN3ccc9CC12x10y0E, "_ZN3ccc9CC12x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y0C1Ev();
extern void _ZN3ccc9CC12x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y0E[] = {
  NSPAIR(_ZN3ccc9CC12x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y0E[];
extern void _ZN3ccc9CC12x10y03abcEv();
extern void _ZN3ccc9CC12x10y03efgEv();
extern void _ZN3ccc9CC12x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y03pqrEv,_ZThn4_N3ccc9CC12x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y03abcEv,_ZThn4_N3ccc9CC12x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y03pqrEv,_ZThn4_N3ccc9CC12x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y03abcEv,_ZThn4_N3ccc9CC12x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y0E[];
Class_Descriptor cd__ZN3ccc9CC12x10y0E = {  "_ZN3ccc9CC12x10y0E", // class name
  bases__ZN3ccc9CC12x10y0E, 2,
  &(vtc__ZN3ccc9CC12x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y1  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC12x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x10y13efgEv
  ~CC12x10y1(); // tgen
  CC12x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y1E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y13abcEv");}
void  ccc::CC12x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y13pqrEv");}
void  ccc::CC12x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y13efgEv");}
ccc::CC12x10y1 ::~CC12x10y1(){ note_dtor("_ZN3ccc9CC12x10y1E", this);} // tgen
ccc::CC12x10y1 ::CC12x10y1(){ note_ctor("_ZN3ccc9CC12x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y1E, buf);
    ::ccc::CC12x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y1E);
    dp->::ccc::CC12x10y1::~CC12x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y1E(Test__ZN3ccc9CC12x10y1E, "_ZN3ccc9CC12x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y1C1Ev();
extern void _ZN3ccc9CC12x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y1E[] = {
  NSPAIR(_ZN3ccc9CC12x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y1E[];
extern void _ZN3ccc9CC12x10y13abcEv();
extern void _ZN3ccc9CC12x10y13pqrEv();
extern void _ZN3ccc9CC12x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y13pqrEv,_ZThn4_N3ccc9CC12x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y13abcEv,_ZThn4_N3ccc9CC12x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y13pqrEv,_ZThn4_N3ccc9CC12x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y13abcEv,_ZThn4_N3ccc9CC12x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y1E[];
Class_Descriptor cd__ZN3ccc9CC12x10y1E = {  "_ZN3ccc9CC12x10y1E", // class name
  bases__ZN3ccc9CC12x10y1E, 2,
  &(vtc__ZN3ccc9CC12x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y2  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC12x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y23pqrEv
  ~CC12x10y2(); // tgen
  CC12x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y2E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y23efgEv");}
void  ccc::CC12x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y23abcEv");}
void  ccc::CC12x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y23pqrEv");}
ccc::CC12x10y2 ::~CC12x10y2(){ note_dtor("_ZN3ccc9CC12x10y2E", this);} // tgen
ccc::CC12x10y2 ::CC12x10y2(){ note_ctor("_ZN3ccc9CC12x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y2E, buf);
    ::ccc::CC12x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y2E);
    dp->::ccc::CC12x10y2::~CC12x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y2E(Test__ZN3ccc9CC12x10y2E, "_ZN3ccc9CC12x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y2C1Ev();
extern void _ZN3ccc9CC12x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y2E[] = {
  NSPAIR(_ZN3ccc9CC12x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y2E[];
extern void _ZN3ccc9CC12x10y23abcEv();
extern void _ZN3ccc9CC12x10y23efgEv();
extern void _ZN3ccc9CC12x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y23pqrEv,_ZThn4_N3ccc9CC12x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y23abcEv,_ZThn4_N3ccc9CC12x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y23pqrEv,_ZThn4_N3ccc9CC12x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y23abcEv,_ZThn4_N3ccc9CC12x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y2E[];
Class_Descriptor cd__ZN3ccc9CC12x10y2E = {  "_ZN3ccc9CC12x10y2E", // class name
  bases__ZN3ccc9CC12x10y2E, 2,
  &(vtc__ZN3ccc9CC12x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y3  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC12x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x10y33abcEv
  ~CC12x10y3(); // tgen
  CC12x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y3E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y33efgEv");}
void  ccc::CC12x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y33pqrEv");}
void  ccc::CC12x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y33abcEv");}
ccc::CC12x10y3 ::~CC12x10y3(){ note_dtor("_ZN3ccc9CC12x10y3E", this);} // tgen
ccc::CC12x10y3 ::CC12x10y3(){ note_ctor("_ZN3ccc9CC12x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y3E, buf);
    ::ccc::CC12x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y3E);
    dp->::ccc::CC12x10y3::~CC12x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y3E(Test__ZN3ccc9CC12x10y3E, "_ZN3ccc9CC12x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y3C1Ev();
extern void _ZN3ccc9CC12x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y3E[] = {
  NSPAIR(_ZN3ccc9CC12x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y3E[];
extern void _ZN3ccc9CC12x10y33abcEv();
extern void _ZN3ccc9CC12x10y33efgEv();
extern void _ZN3ccc9CC12x10y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y33pqrEv,_ZThn4_N3ccc9CC12x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y33abcEv,_ZThn4_N3ccc9CC12x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y33pqrEv,_ZThn4_N3ccc9CC12x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y33abcEv,_ZThn4_N3ccc9CC12x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y3E[];
Class_Descriptor cd__ZN3ccc9CC12x10y3E = {  "_ZN3ccc9CC12x10y3E", // class name
  bases__ZN3ccc9CC12x10y3E, 2,
  &(vtc__ZN3ccc9CC12x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y4  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC12x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x10y43efgEv
  ~CC12x10y4(); // tgen
  CC12x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y4E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y43pqrEv");}
void  ccc::CC12x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y43abcEv");}
void  ccc::CC12x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y43efgEv");}
ccc::CC12x10y4 ::~CC12x10y4(){ note_dtor("_ZN3ccc9CC12x10y4E", this);} // tgen
ccc::CC12x10y4 ::CC12x10y4(){ note_ctor("_ZN3ccc9CC12x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y4E, buf);
    ::ccc::CC12x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y4E);
    dp->::ccc::CC12x10y4::~CC12x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y4E(Test__ZN3ccc9CC12x10y4E, "_ZN3ccc9CC12x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y4C1Ev();
extern void _ZN3ccc9CC12x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y4E[] = {
  NSPAIR(_ZN3ccc9CC12x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y4E[];
extern void _ZN3ccc9CC12x10y43abcEv();
extern void _ZN3ccc9CC12x10y43pqrEv();
extern void _ZN3ccc9CC12x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y43pqrEv,_ZThn4_N3ccc9CC12x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y43abcEv,_ZThn4_N3ccc9CC12x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y43pqrEv,_ZThn4_N3ccc9CC12x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y43abcEv,_ZThn4_N3ccc9CC12x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y4E[];
Class_Descriptor cd__ZN3ccc9CC12x10y4E = {  "_ZN3ccc9CC12x10y4E", // class name
  bases__ZN3ccc9CC12x10y4E, 2,
  &(vtc__ZN3ccc9CC12x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y5  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC12x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x10y53abcEv
  ~CC12x10y5(); // tgen
  CC12x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y5E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y53pqrEv");}
void  ccc::CC12x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y53efgEv");}
void  ccc::CC12x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y53abcEv");}
ccc::CC12x10y5 ::~CC12x10y5(){ note_dtor("_ZN3ccc9CC12x10y5E", this);} // tgen
ccc::CC12x10y5 ::CC12x10y5(){ note_ctor("_ZN3ccc9CC12x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y5E, buf);
    ::ccc::CC12x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y5E);
    dp->::ccc::CC12x10y5::~CC12x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y5E(Test__ZN3ccc9CC12x10y5E, "_ZN3ccc9CC12x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y5C1Ev();
extern void _ZN3ccc9CC12x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y5E[] = {
  NSPAIR(_ZN3ccc9CC12x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y5E[];
extern void _ZN3ccc9CC12x10y53abcEv();
extern void _ZN3ccc9CC12x10y53pqrEv();
extern void _ZN3ccc9CC12x10y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y53pqrEv,_ZThn4_N3ccc9CC12x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y53abcEv,_ZThn4_N3ccc9CC12x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y53pqrEv,_ZThn4_N3ccc9CC12x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y53abcEv,_ZThn4_N3ccc9CC12x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y5E[];
Class_Descriptor cd__ZN3ccc9CC12x10y5E = {  "_ZN3ccc9CC12x10y5E", // class name
  bases__ZN3ccc9CC12x10y5E, 2,
  &(vtc__ZN3ccc9CC12x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y6  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC12x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x10y63efgEv
  ~CC12x10y6(); // tgen
  CC12x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y6E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y63abcEv");}
void  ccc::CC12x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y63efgEv");}
ccc::CC12x10y6 ::~CC12x10y6(){ note_dtor("_ZN3ccc9CC12x10y6E", this);} // tgen
ccc::CC12x10y6 ::CC12x10y6(){ note_ctor("_ZN3ccc9CC12x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y6E, buf);
    ::ccc::CC12x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y6E);
    dp->::ccc::CC12x10y6::~CC12x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y6E(Test__ZN3ccc9CC12x10y6E, "_ZN3ccc9CC12x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y6C1Ev();
extern void _ZN3ccc9CC12x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y6E[] = {
  NSPAIR(_ZN3ccc9CC12x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y6E[];
extern void _ZN3ccc9CC12x10y63abcEv();
extern void _ZN3ccc9CC12x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y63abcEv,_ZThn4_N3ccc9CC12x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y63abcEv,_ZThn4_N3ccc9CC12x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y6E[];
Class_Descriptor cd__ZN3ccc9CC12x10y6E = {  "_ZN3ccc9CC12x10y6E", // class name
  bases__ZN3ccc9CC12x10y6E, 2,
  &(vtc__ZN3ccc9CC12x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y7  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC12x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y73pqrEv
  ~CC12x10y7(); // tgen
  CC12x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y7E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y73abcEv");}
void  ccc::CC12x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y73pqrEv");}
ccc::CC12x10y7 ::~CC12x10y7(){ note_dtor("_ZN3ccc9CC12x10y7E", this);} // tgen
ccc::CC12x10y7 ::CC12x10y7(){ note_ctor("_ZN3ccc9CC12x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y7E, buf);
    ::ccc::CC12x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y7E);
    dp->::ccc::CC12x10y7::~CC12x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y7E(Test__ZN3ccc9CC12x10y7E, "_ZN3ccc9CC12x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y7C1Ev();
extern void _ZN3ccc9CC12x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y7E[] = {
  NSPAIR(_ZN3ccc9CC12x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y7E[];
extern void _ZN3ccc9CC12x10y73abcEv();
extern void _ZN3ccc9CC12x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y73pqrEv,_ZThn4_N3ccc9CC12x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y73abcEv,_ZThn4_N3ccc9CC12x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y73pqrEv,_ZThn4_N3ccc9CC12x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y73abcEv,_ZThn4_N3ccc9CC12x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y7E[];
Class_Descriptor cd__ZN3ccc9CC12x10y7E = {  "_ZN3ccc9CC12x10y7E", // class name
  bases__ZN3ccc9CC12x10y7E, 2,
  &(vtc__ZN3ccc9CC12x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y8  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC12x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x10y83abcEv
  ~CC12x10y8(); // tgen
  CC12x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y8E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y83efgEv");}
void  ccc::CC12x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x10y83abcEv");}
ccc::CC12x10y8 ::~CC12x10y8(){ note_dtor("_ZN3ccc9CC12x10y8E", this);} // tgen
ccc::CC12x10y8 ::CC12x10y8(){ note_ctor("_ZN3ccc9CC12x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y8E, buf);
    ::ccc::CC12x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y8E);
    dp->::ccc::CC12x10y8::~CC12x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y8E(Test__ZN3ccc9CC12x10y8E, "_ZN3ccc9CC12x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y8C1Ev();
extern void _ZN3ccc9CC12x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y8E[] = {
  NSPAIR(_ZN3ccc9CC12x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y8E[];
extern void _ZN3ccc9CC12x10y83abcEv();
extern void _ZN3ccc9CC12x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y83abcEv,_ZThn4_N3ccc9CC12x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y83abcEv,_ZThn4_N3ccc9CC12x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y8E[];
Class_Descriptor cd__ZN3ccc9CC12x10y8E = {  "_ZN3ccc9CC12x10y8E", // class name
  bases__ZN3ccc9CC12x10y8E, 2,
  &(vtc__ZN3ccc9CC12x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y9  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC12x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x10y93pqrEv
  ~CC12x10y9(); // tgen
  CC12x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x10y9E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x10y93efgEv");}
void  ccc::CC12x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x10y93pqrEv");}
ccc::CC12x10y9 ::~CC12x10y9(){ note_dtor("_ZN3ccc9CC12x10y9E", this);} // tgen
ccc::CC12x10y9 ::CC12x10y9(){ note_ctor("_ZN3ccc9CC12x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x10y9E, buf);
    ::ccc::CC12x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x10y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC12x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x10y9E);
    dp->::ccc::CC12x10y9::~CC12x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x10y9E(Test__ZN3ccc9CC12x10y9E, "_ZN3ccc9CC12x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x10y9C1Ev();
extern void _ZN3ccc9CC12x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x10y9E[] = {
  NSPAIR(_ZN3ccc9CC12x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC12x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x10y93efgEv();
extern void _ZN3ccc9CC12x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x10y93pqrEv,_ZThn4_N3ccc9CC12x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x10y93pqrEv,_ZThn4_N3ccc9CC12x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x10y9E[];
Class_Descriptor cd__ZN3ccc9CC12x10y9E = {  "_ZN3ccc9CC12x10y9E", // class name
  bases__ZN3ccc9CC12x10y9E, 2,
  &(vtc__ZN3ccc9CC12x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x10y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y10  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC12x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x10y103abcEv
  ~CC12x10y10(); // tgen
  CC12x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y10E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x10y103pqrEv");}
void  ccc::CC12x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x10y103abcEv");}
ccc::CC12x10y10 ::~CC12x10y10(){ note_dtor("_ZN3ccc10CC12x10y10E", this);} // tgen
ccc::CC12x10y10 ::CC12x10y10(){ note_ctor("_ZN3ccc10CC12x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y10E, buf);
    ::ccc::CC12x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y10E);
    dp->::ccc::CC12x10y10::~CC12x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y10E(Test__ZN3ccc10CC12x10y10E, "_ZN3ccc10CC12x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y10C1Ev();
extern void _ZN3ccc10CC12x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y10E[] = {
  NSPAIR(_ZN3ccc10CC12x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y10E[];
extern void _ZN3ccc10CC12x10y103abcEv();
extern void _ZN3ccc10CC12x10y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x10y103pqrEv,_ZThn4_N3ccc10CC12x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC12x10y103abcEv,_ZThn4_N3ccc10CC12x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x10y103pqrEv,_ZThn4_N3ccc10CC12x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x10y103abcEv,_ZThn4_N3ccc10CC12x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y10E[];
Class_Descriptor cd__ZN3ccc10CC12x10y10E = {  "_ZN3ccc10CC12x10y10E", // class name
  bases__ZN3ccc10CC12x10y10E, 2,
  &(vtc__ZN3ccc10CC12x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y11  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC12x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x10y113efgEv
  ~CC12x10y11(); // tgen
  CC12x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y11E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x10y113pqrEv");}
void  ccc::CC12x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x10y113efgEv");}
ccc::CC12x10y11 ::~CC12x10y11(){ note_dtor("_ZN3ccc10CC12x10y11E", this);} // tgen
ccc::CC12x10y11 ::CC12x10y11(){ note_ctor("_ZN3ccc10CC12x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y11E, buf);
    ::ccc::CC12x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y11E);
    dp->::ccc::CC12x10y11::~CC12x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y11E(Test__ZN3ccc10CC12x10y11E, "_ZN3ccc10CC12x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y11C1Ev();
extern void _ZN3ccc10CC12x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y11E[] = {
  NSPAIR(_ZN3ccc10CC12x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x10y113pqrEv();
extern void _ZN3ccc10CC12x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x10y113pqrEv,_ZThn4_N3ccc10CC12x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x10y113pqrEv,_ZThn4_N3ccc10CC12x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y11E[];
Class_Descriptor cd__ZN3ccc10CC12x10y11E = {  "_ZN3ccc10CC12x10y11E", // class name
  bases__ZN3ccc10CC12x10y11E, 2,
  &(vtc__ZN3ccc10CC12x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y12  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC12x10y123abcEv
  ~CC12x10y12(); // tgen
  CC12x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y12E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC12x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x10y123abcEv");}
ccc::CC12x10y12 ::~CC12x10y12(){ note_dtor("_ZN3ccc10CC12x10y12E", this);} // tgen
ccc::CC12x10y12 ::CC12x10y12(){ note_ctor("_ZN3ccc10CC12x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y12E, buf);
    ::ccc::CC12x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y12E);
    dp->::ccc::CC12x10y12::~CC12x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y12E(Test__ZN3ccc10CC12x10y12E, "_ZN3ccc10CC12x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y12C1Ev();
extern void _ZN3ccc10CC12x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y12E[] = {
  NSPAIR(_ZN3ccc10CC12x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y12E[];
extern void _ZN3ccc10CC12x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x10y123abcEv,_ZThn4_N3ccc10CC12x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x10y123abcEv,_ZThn4_N3ccc10CC12x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y12E[];
Class_Descriptor cd__ZN3ccc10CC12x10y12E = {  "_ZN3ccc10CC12x10y12E", // class name
  bases__ZN3ccc10CC12x10y12E, 2,
  &(vtc__ZN3ccc10CC12x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y13  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC12x10y133efgEv
  ~CC12x10y13(); // tgen
  CC12x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y13E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC12x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x10y133efgEv");}
ccc::CC12x10y13 ::~CC12x10y13(){ note_dtor("_ZN3ccc10CC12x10y13E", this);} // tgen
ccc::CC12x10y13 ::CC12x10y13(){ note_ctor("_ZN3ccc10CC12x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y13E, buf);
    ::ccc::CC12x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y13E);
    dp->::ccc::CC12x10y13::~CC12x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y13E(Test__ZN3ccc10CC12x10y13E, "_ZN3ccc10CC12x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y13C1Ev();
extern void _ZN3ccc10CC12x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y13E[] = {
  NSPAIR(_ZN3ccc10CC12x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y13E[];
Class_Descriptor cd__ZN3ccc10CC12x10y13E = {  "_ZN3ccc10CC12x10y13E", // class name
  bases__ZN3ccc10CC12x10y13E, 2,
  &(vtc__ZN3ccc10CC12x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y14  : ::ccc::AA12 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC12x10y143pqrEv
  ~CC12x10y14(); // tgen
  CC12x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y14E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x10y143pqrEv");}
ccc::CC12x10y14 ::~CC12x10y14(){ note_dtor("_ZN3ccc10CC12x10y14E", this);} // tgen
ccc::CC12x10y14 ::CC12x10y14(){ note_ctor("_ZN3ccc10CC12x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y14E, buf);
    ::ccc::CC12x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y14E);
    dp->::ccc::CC12x10y14::~CC12x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y14E(Test__ZN3ccc10CC12x10y14E, "_ZN3ccc10CC12x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y14C1Ev();
extern void _ZN3ccc10CC12x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y14E[] = {
  NSPAIR(_ZN3ccc10CC12x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x10y143pqrEv,_ZThn4_N3ccc10CC12x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x10y143pqrEv,_ZThn4_N3ccc10CC12x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y14E[];
Class_Descriptor cd__ZN3ccc10CC12x10y14E = {  "_ZN3ccc10CC12x10y14E", // class name
  bases__ZN3ccc10CC12x10y14E, 2,
  &(vtc__ZN3ccc10CC12x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x10y15  : ::ccc::AA12 , ::ccc::BB10 {
  ~CC12x10y15(); // tgen
  CC12x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x10y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x10y15 ::~CC12x10y15(){ note_dtor("_ZN3ccc10CC12x10y15E", this);} // tgen
ccc::CC12x10y15 ::CC12x10y15(){ note_ctor("_ZN3ccc10CC12x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x10y15E, buf);
    ::ccc::CC12x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x10y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC12x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x10y15E);
    dp->::ccc::CC12x10y15::~CC12x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x10y15E(Test__ZN3ccc10CC12x10y15E, "_ZN3ccc10CC12x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x10y15C1Ev();
extern void _ZN3ccc10CC12x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x10y15E[] = {
  NSPAIR(_ZN3ccc10CC12x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC12x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x10y15E[];
Class_Descriptor cd__ZN3ccc10CC12x10y15E = {  "_ZN3ccc10CC12x10y15E", // class name
  bases__ZN3ccc10CC12x10y15E, 2,
  &(vtc__ZN3ccc10CC12x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x10y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y0  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC12x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y03pqrEv
  ~CC12x11y0(); // tgen
  CC12x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y0E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y03abcEv");}
void  ccc::CC12x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y03efgEv");}
void  ccc::CC12x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y03pqrEv");}
ccc::CC12x11y0 ::~CC12x11y0(){ note_dtor("_ZN3ccc9CC12x11y0E", this);} // tgen
ccc::CC12x11y0 ::CC12x11y0(){ note_ctor("_ZN3ccc9CC12x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y0E, buf);
    ::ccc::CC12x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y0E);
    dp->::ccc::CC12x11y0::~CC12x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y0E(Test__ZN3ccc9CC12x11y0E, "_ZN3ccc9CC12x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y0C1Ev();
extern void _ZN3ccc9CC12x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y0E[] = {
  NSPAIR(_ZN3ccc9CC12x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y0E[];
extern void _ZN3ccc9CC12x11y03abcEv();
extern void _ZN3ccc9CC12x11y03efgEv();
extern void _ZN3ccc9CC12x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y03pqrEv,_ZThn4_N3ccc9CC12x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y03efgEv,_ZThn4_N3ccc9CC12x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y03pqrEv,_ZThn4_N3ccc9CC12x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y03efgEv,_ZThn4_N3ccc9CC12x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y0E[];
Class_Descriptor cd__ZN3ccc9CC12x11y0E = {  "_ZN3ccc9CC12x11y0E", // class name
  bases__ZN3ccc9CC12x11y0E, 2,
  &(vtc__ZN3ccc9CC12x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y1  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC12x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x11y13efgEv
  ~CC12x11y1(); // tgen
  CC12x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y1E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y13abcEv");}
void  ccc::CC12x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y13pqrEv");}
void  ccc::CC12x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y13efgEv");}
ccc::CC12x11y1 ::~CC12x11y1(){ note_dtor("_ZN3ccc9CC12x11y1E", this);} // tgen
ccc::CC12x11y1 ::CC12x11y1(){ note_ctor("_ZN3ccc9CC12x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y1E, buf);
    ::ccc::CC12x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y1E);
    dp->::ccc::CC12x11y1::~CC12x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y1E(Test__ZN3ccc9CC12x11y1E, "_ZN3ccc9CC12x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y1C1Ev();
extern void _ZN3ccc9CC12x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y1E[] = {
  NSPAIR(_ZN3ccc9CC12x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y1E[];
extern void _ZN3ccc9CC12x11y13abcEv();
extern void _ZN3ccc9CC12x11y13pqrEv();
extern void _ZN3ccc9CC12x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y13pqrEv,_ZThn4_N3ccc9CC12x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y13efgEv,_ZThn4_N3ccc9CC12x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y13pqrEv,_ZThn4_N3ccc9CC12x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y13efgEv,_ZThn4_N3ccc9CC12x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y1E[];
Class_Descriptor cd__ZN3ccc9CC12x11y1E = {  "_ZN3ccc9CC12x11y1E", // class name
  bases__ZN3ccc9CC12x11y1E, 2,
  &(vtc__ZN3ccc9CC12x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y2  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC12x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y23pqrEv
  ~CC12x11y2(); // tgen
  CC12x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y2E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y23efgEv");}
void  ccc::CC12x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y23abcEv");}
void  ccc::CC12x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y23pqrEv");}
ccc::CC12x11y2 ::~CC12x11y2(){ note_dtor("_ZN3ccc9CC12x11y2E", this);} // tgen
ccc::CC12x11y2 ::CC12x11y2(){ note_ctor("_ZN3ccc9CC12x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y2E, buf);
    ::ccc::CC12x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y2E);
    dp->::ccc::CC12x11y2::~CC12x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y2E(Test__ZN3ccc9CC12x11y2E, "_ZN3ccc9CC12x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y2C1Ev();
extern void _ZN3ccc9CC12x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y2E[] = {
  NSPAIR(_ZN3ccc9CC12x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y2E[];
extern void _ZN3ccc9CC12x11y23abcEv();
extern void _ZN3ccc9CC12x11y23efgEv();
extern void _ZN3ccc9CC12x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y23pqrEv,_ZThn4_N3ccc9CC12x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y23efgEv,_ZThn4_N3ccc9CC12x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y23pqrEv,_ZThn4_N3ccc9CC12x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y23efgEv,_ZThn4_N3ccc9CC12x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y2E[];
Class_Descriptor cd__ZN3ccc9CC12x11y2E = {  "_ZN3ccc9CC12x11y2E", // class name
  bases__ZN3ccc9CC12x11y2E, 2,
  &(vtc__ZN3ccc9CC12x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y3  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC12x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x11y33abcEv
  ~CC12x11y3(); // tgen
  CC12x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y3E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y33efgEv");}
void  ccc::CC12x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y33pqrEv");}
void  ccc::CC12x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y33abcEv");}
ccc::CC12x11y3 ::~CC12x11y3(){ note_dtor("_ZN3ccc9CC12x11y3E", this);} // tgen
ccc::CC12x11y3 ::CC12x11y3(){ note_ctor("_ZN3ccc9CC12x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y3E, buf);
    ::ccc::CC12x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y3E);
    dp->::ccc::CC12x11y3::~CC12x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y3E(Test__ZN3ccc9CC12x11y3E, "_ZN3ccc9CC12x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y3C1Ev();
extern void _ZN3ccc9CC12x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y3E[] = {
  NSPAIR(_ZN3ccc9CC12x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y3E[];
extern void _ZN3ccc9CC12x11y33abcEv();
extern void _ZN3ccc9CC12x11y33efgEv();
extern void _ZN3ccc9CC12x11y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y33pqrEv,_ZThn4_N3ccc9CC12x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y33efgEv,_ZThn4_N3ccc9CC12x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y33pqrEv,_ZThn4_N3ccc9CC12x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y33efgEv,_ZThn4_N3ccc9CC12x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y3E[];
Class_Descriptor cd__ZN3ccc9CC12x11y3E = {  "_ZN3ccc9CC12x11y3E", // class name
  bases__ZN3ccc9CC12x11y3E, 2,
  &(vtc__ZN3ccc9CC12x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y4  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC12x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x11y43efgEv
  ~CC12x11y4(); // tgen
  CC12x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y4E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y43pqrEv");}
void  ccc::CC12x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y43abcEv");}
void  ccc::CC12x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y43efgEv");}
ccc::CC12x11y4 ::~CC12x11y4(){ note_dtor("_ZN3ccc9CC12x11y4E", this);} // tgen
ccc::CC12x11y4 ::CC12x11y4(){ note_ctor("_ZN3ccc9CC12x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y4E, buf);
    ::ccc::CC12x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y4E);
    dp->::ccc::CC12x11y4::~CC12x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y4E(Test__ZN3ccc9CC12x11y4E, "_ZN3ccc9CC12x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y4C1Ev();
extern void _ZN3ccc9CC12x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y4E[] = {
  NSPAIR(_ZN3ccc9CC12x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y4E[];
extern void _ZN3ccc9CC12x11y43abcEv();
extern void _ZN3ccc9CC12x11y43pqrEv();
extern void _ZN3ccc9CC12x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y43pqrEv,_ZThn4_N3ccc9CC12x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y43efgEv,_ZThn4_N3ccc9CC12x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y43pqrEv,_ZThn4_N3ccc9CC12x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y43efgEv,_ZThn4_N3ccc9CC12x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y4E[];
Class_Descriptor cd__ZN3ccc9CC12x11y4E = {  "_ZN3ccc9CC12x11y4E", // class name
  bases__ZN3ccc9CC12x11y4E, 2,
  &(vtc__ZN3ccc9CC12x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y5  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC12x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x11y53abcEv
  ~CC12x11y5(); // tgen
  CC12x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y5E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y53pqrEv");}
void  ccc::CC12x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y53efgEv");}
void  ccc::CC12x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y53abcEv");}
ccc::CC12x11y5 ::~CC12x11y5(){ note_dtor("_ZN3ccc9CC12x11y5E", this);} // tgen
ccc::CC12x11y5 ::CC12x11y5(){ note_ctor("_ZN3ccc9CC12x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y5E, buf);
    ::ccc::CC12x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y5E);
    dp->::ccc::CC12x11y5::~CC12x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y5E(Test__ZN3ccc9CC12x11y5E, "_ZN3ccc9CC12x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y5C1Ev();
extern void _ZN3ccc9CC12x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y5E[] = {
  NSPAIR(_ZN3ccc9CC12x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y5E[];
extern void _ZN3ccc9CC12x11y53abcEv();
extern void _ZN3ccc9CC12x11y53pqrEv();
extern void _ZN3ccc9CC12x11y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y53pqrEv,_ZThn4_N3ccc9CC12x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y53efgEv,_ZThn4_N3ccc9CC12x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y53pqrEv,_ZThn4_N3ccc9CC12x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y53efgEv,_ZThn4_N3ccc9CC12x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y5E[];
Class_Descriptor cd__ZN3ccc9CC12x11y5E = {  "_ZN3ccc9CC12x11y5E", // class name
  bases__ZN3ccc9CC12x11y5E, 2,
  &(vtc__ZN3ccc9CC12x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y6  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC12x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x11y63efgEv
  ~CC12x11y6(); // tgen
  CC12x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y6E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y63abcEv");}
void  ccc::CC12x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y63efgEv");}
ccc::CC12x11y6 ::~CC12x11y6(){ note_dtor("_ZN3ccc9CC12x11y6E", this);} // tgen
ccc::CC12x11y6 ::CC12x11y6(){ note_ctor("_ZN3ccc9CC12x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y6E, buf);
    ::ccc::CC12x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y6E);
    dp->::ccc::CC12x11y6::~CC12x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y6E(Test__ZN3ccc9CC12x11y6E, "_ZN3ccc9CC12x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y6C1Ev();
extern void _ZN3ccc9CC12x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y6E[] = {
  NSPAIR(_ZN3ccc9CC12x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y6E[];
extern void _ZN3ccc9CC12x11y63abcEv();
extern void _ZN3ccc9CC12x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y63efgEv,_ZThn4_N3ccc9CC12x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y63efgEv,_ZThn4_N3ccc9CC12x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y6E[];
Class_Descriptor cd__ZN3ccc9CC12x11y6E = {  "_ZN3ccc9CC12x11y6E", // class name
  bases__ZN3ccc9CC12x11y6E, 2,
  &(vtc__ZN3ccc9CC12x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y7  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC12x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y73pqrEv
  ~CC12x11y7(); // tgen
  CC12x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y7E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y73abcEv");}
void  ccc::CC12x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y73pqrEv");}
ccc::CC12x11y7 ::~CC12x11y7(){ note_dtor("_ZN3ccc9CC12x11y7E", this);} // tgen
ccc::CC12x11y7 ::CC12x11y7(){ note_ctor("_ZN3ccc9CC12x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y7E, buf);
    ::ccc::CC12x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y7E);
    dp->::ccc::CC12x11y7::~CC12x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y7E(Test__ZN3ccc9CC12x11y7E, "_ZN3ccc9CC12x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y7C1Ev();
extern void _ZN3ccc9CC12x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y7E[] = {
  NSPAIR(_ZN3ccc9CC12x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y7E[];
extern void _ZN3ccc9CC12x11y73abcEv();
extern void _ZN3ccc9CC12x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y73pqrEv,_ZThn4_N3ccc9CC12x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y73pqrEv,_ZThn4_N3ccc9CC12x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y7E[];
Class_Descriptor cd__ZN3ccc9CC12x11y7E = {  "_ZN3ccc9CC12x11y7E", // class name
  bases__ZN3ccc9CC12x11y7E, 2,
  &(vtc__ZN3ccc9CC12x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y8  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC12x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x11y83abcEv
  ~CC12x11y8(); // tgen
  CC12x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y8E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y83efgEv");}
void  ccc::CC12x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x11y83abcEv");}
ccc::CC12x11y8 ::~CC12x11y8(){ note_dtor("_ZN3ccc9CC12x11y8E", this);} // tgen
ccc::CC12x11y8 ::CC12x11y8(){ note_ctor("_ZN3ccc9CC12x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y8E, buf);
    ::ccc::CC12x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y8E);
    dp->::ccc::CC12x11y8::~CC12x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y8E(Test__ZN3ccc9CC12x11y8E, "_ZN3ccc9CC12x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y8C1Ev();
extern void _ZN3ccc9CC12x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y8E[] = {
  NSPAIR(_ZN3ccc9CC12x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y8E[];
extern void _ZN3ccc9CC12x11y83abcEv();
extern void _ZN3ccc9CC12x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y83efgEv,_ZThn4_N3ccc9CC12x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y83efgEv,_ZThn4_N3ccc9CC12x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y8E[];
Class_Descriptor cd__ZN3ccc9CC12x11y8E = {  "_ZN3ccc9CC12x11y8E", // class name
  bases__ZN3ccc9CC12x11y8E, 2,
  &(vtc__ZN3ccc9CC12x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y9  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC12x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x11y93pqrEv
  ~CC12x11y9(); // tgen
  CC12x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x11y9E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x11y93efgEv");}
void  ccc::CC12x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x11y93pqrEv");}
ccc::CC12x11y9 ::~CC12x11y9(){ note_dtor("_ZN3ccc9CC12x11y9E", this);} // tgen
ccc::CC12x11y9 ::CC12x11y9(){ note_ctor("_ZN3ccc9CC12x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x11y9E, buf);
    ::ccc::CC12x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x11y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC12x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x11y9E);
    dp->::ccc::CC12x11y9::~CC12x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x11y9E(Test__ZN3ccc9CC12x11y9E, "_ZN3ccc9CC12x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x11y9C1Ev();
extern void _ZN3ccc9CC12x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x11y9E[] = {
  NSPAIR(_ZN3ccc9CC12x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC12x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x11y93efgEv();
extern void _ZN3ccc9CC12x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y93pqrEv,_ZThn4_N3ccc9CC12x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC12x11y93efgEv,_ZThn4_N3ccc9CC12x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y93pqrEv,_ZThn4_N3ccc9CC12x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x11y93efgEv,_ZThn4_N3ccc9CC12x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x11y9E[];
Class_Descriptor cd__ZN3ccc9CC12x11y9E = {  "_ZN3ccc9CC12x11y9E", // class name
  bases__ZN3ccc9CC12x11y9E, 2,
  &(vtc__ZN3ccc9CC12x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x11y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y10  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC12x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x11y103abcEv
  ~CC12x11y10(); // tgen
  CC12x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y10E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x11y103pqrEv");}
void  ccc::CC12x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x11y103abcEv");}
ccc::CC12x11y10 ::~CC12x11y10(){ note_dtor("_ZN3ccc10CC12x11y10E", this);} // tgen
ccc::CC12x11y10 ::CC12x11y10(){ note_ctor("_ZN3ccc10CC12x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y10E, buf);
    ::ccc::CC12x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y10E);
    dp->::ccc::CC12x11y10::~CC12x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y10E(Test__ZN3ccc10CC12x11y10E, "_ZN3ccc10CC12x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y10C1Ev();
extern void _ZN3ccc10CC12x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y10E[] = {
  NSPAIR(_ZN3ccc10CC12x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y10E[];
extern void _ZN3ccc10CC12x11y103abcEv();
extern void _ZN3ccc10CC12x11y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x11y103pqrEv,_ZThn4_N3ccc10CC12x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x11y103pqrEv,_ZThn4_N3ccc10CC12x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y10E[];
Class_Descriptor cd__ZN3ccc10CC12x11y10E = {  "_ZN3ccc10CC12x11y10E", // class name
  bases__ZN3ccc10CC12x11y10E, 2,
  &(vtc__ZN3ccc10CC12x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y11  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC12x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x11y113efgEv
  ~CC12x11y11(); // tgen
  CC12x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y11E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x11y113pqrEv");}
void  ccc::CC12x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x11y113efgEv");}
ccc::CC12x11y11 ::~CC12x11y11(){ note_dtor("_ZN3ccc10CC12x11y11E", this);} // tgen
ccc::CC12x11y11 ::CC12x11y11(){ note_ctor("_ZN3ccc10CC12x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y11E, buf);
    ::ccc::CC12x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y11E);
    dp->::ccc::CC12x11y11::~CC12x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y11E(Test__ZN3ccc10CC12x11y11E, "_ZN3ccc10CC12x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y11C1Ev();
extern void _ZN3ccc10CC12x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y11E[] = {
  NSPAIR(_ZN3ccc10CC12x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x11y113pqrEv();
extern void _ZN3ccc10CC12x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x11y113pqrEv,_ZThn4_N3ccc10CC12x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC12x11y113efgEv,_ZThn4_N3ccc10CC12x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x11y113pqrEv,_ZThn4_N3ccc10CC12x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x11y113efgEv,_ZThn4_N3ccc10CC12x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y11E[];
Class_Descriptor cd__ZN3ccc10CC12x11y11E = {  "_ZN3ccc10CC12x11y11E", // class name
  bases__ZN3ccc10CC12x11y11E, 2,
  &(vtc__ZN3ccc10CC12x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y12  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC12x11y123abcEv
  ~CC12x11y12(); // tgen
  CC12x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y12E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC12x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x11y123abcEv");}
ccc::CC12x11y12 ::~CC12x11y12(){ note_dtor("_ZN3ccc10CC12x11y12E", this);} // tgen
ccc::CC12x11y12 ::CC12x11y12(){ note_ctor("_ZN3ccc10CC12x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y12E, buf);
    ::ccc::CC12x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y12E);
    dp->::ccc::CC12x11y12::~CC12x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y12E(Test__ZN3ccc10CC12x11y12E, "_ZN3ccc10CC12x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y12C1Ev();
extern void _ZN3ccc10CC12x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y12E[] = {
  NSPAIR(_ZN3ccc10CC12x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y12E[];
extern void _ZN3ccc10CC12x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y12E[];
Class_Descriptor cd__ZN3ccc10CC12x11y12E = {  "_ZN3ccc10CC12x11y12E", // class name
  bases__ZN3ccc10CC12x11y12E, 2,
  &(vtc__ZN3ccc10CC12x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y13  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC12x11y133efgEv
  ~CC12x11y13(); // tgen
  CC12x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y13E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC12x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x11y133efgEv");}
ccc::CC12x11y13 ::~CC12x11y13(){ note_dtor("_ZN3ccc10CC12x11y13E", this);} // tgen
ccc::CC12x11y13 ::CC12x11y13(){ note_ctor("_ZN3ccc10CC12x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y13E, buf);
    ::ccc::CC12x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y13E);
    dp->::ccc::CC12x11y13::~CC12x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y13E(Test__ZN3ccc10CC12x11y13E, "_ZN3ccc10CC12x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y13C1Ev();
extern void _ZN3ccc10CC12x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y13E[] = {
  NSPAIR(_ZN3ccc10CC12x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x11y133efgEv,_ZThn4_N3ccc10CC12x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x11y133efgEv,_ZThn4_N3ccc10CC12x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y13E[];
Class_Descriptor cd__ZN3ccc10CC12x11y13E = {  "_ZN3ccc10CC12x11y13E", // class name
  bases__ZN3ccc10CC12x11y13E, 2,
  &(vtc__ZN3ccc10CC12x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y14  : ::ccc::AA12 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC12x11y143pqrEv
  ~CC12x11y14(); // tgen
  CC12x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y14E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC12x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x11y143pqrEv");}
ccc::CC12x11y14 ::~CC12x11y14(){ note_dtor("_ZN3ccc10CC12x11y14E", this);} // tgen
ccc::CC12x11y14 ::CC12x11y14(){ note_ctor("_ZN3ccc10CC12x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y14E, buf);
    ::ccc::CC12x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y14E);
    dp->::ccc::CC12x11y14::~CC12x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y14E(Test__ZN3ccc10CC12x11y14E, "_ZN3ccc10CC12x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y14C1Ev();
extern void _ZN3ccc10CC12x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y14E[] = {
  NSPAIR(_ZN3ccc10CC12x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x11y143pqrEv,_ZThn4_N3ccc10CC12x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x11y143pqrEv,_ZThn4_N3ccc10CC12x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y14E[];
Class_Descriptor cd__ZN3ccc10CC12x11y14E = {  "_ZN3ccc10CC12x11y14E", // class name
  bases__ZN3ccc10CC12x11y14E, 2,
  &(vtc__ZN3ccc10CC12x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x11y15  : ::ccc::AA12 , ::ccc::BB11 {
  ~CC12x11y15(); // tgen
  CC12x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x11y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC12x11y15 ::~CC12x11y15(){ note_dtor("_ZN3ccc10CC12x11y15E", this);} // tgen
ccc::CC12x11y15 ::CC12x11y15(){ note_ctor("_ZN3ccc10CC12x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x11y15E, buf);
    ::ccc::CC12x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x11y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC12x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x11y15E);
    dp->::ccc::CC12x11y15::~CC12x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x11y15E(Test__ZN3ccc10CC12x11y15E, "_ZN3ccc10CC12x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x11y15C1Ev();
extern void _ZN3ccc10CC12x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x11y15E[] = {
  NSPAIR(_ZN3ccc10CC12x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC12x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x11y15E[];
Class_Descriptor cd__ZN3ccc10CC12x11y15E = {  "_ZN3ccc10CC12x11y15E", // class name
  bases__ZN3ccc10CC12x11y15E, 2,
  &(vtc__ZN3ccc10CC12x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x11y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y0  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC12x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y03pqrEv
  ~CC12x12y0(); // tgen
  CC12x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y0E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y03abcEv");}
void  ccc::CC12x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y03efgEv");}
void  ccc::CC12x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y03pqrEv");}
ccc::CC12x12y0 ::~CC12x12y0(){ note_dtor("_ZN3ccc9CC12x12y0E", this);} // tgen
ccc::CC12x12y0 ::CC12x12y0(){ note_ctor("_ZN3ccc9CC12x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y0E, buf);
    ::ccc::CC12x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y0E);
    dp->::ccc::CC12x12y0::~CC12x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y0E(Test__ZN3ccc9CC12x12y0E, "_ZN3ccc9CC12x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y0C1Ev();
extern void _ZN3ccc9CC12x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y0E[] = {
  NSPAIR(_ZN3ccc9CC12x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y0E[];
extern void _ZN3ccc9CC12x12y03abcEv();
extern void _ZN3ccc9CC12x12y03efgEv();
extern void _ZN3ccc9CC12x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y03abcEv,_ZThn4_N3ccc9CC12x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y03abcEv,_ZThn4_N3ccc9CC12x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y0E[];
Class_Descriptor cd__ZN3ccc9CC12x12y0E = {  "_ZN3ccc9CC12x12y0E", // class name
  bases__ZN3ccc9CC12x12y0E, 2,
  &(vtc__ZN3ccc9CC12x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y1  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC12x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x12y13efgEv
  ~CC12x12y1(); // tgen
  CC12x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y1E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y13abcEv");}
void  ccc::CC12x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y13pqrEv");}
void  ccc::CC12x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y13efgEv");}
ccc::CC12x12y1 ::~CC12x12y1(){ note_dtor("_ZN3ccc9CC12x12y1E", this);} // tgen
ccc::CC12x12y1 ::CC12x12y1(){ note_ctor("_ZN3ccc9CC12x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y1E, buf);
    ::ccc::CC12x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y1E);
    dp->::ccc::CC12x12y1::~CC12x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y1E(Test__ZN3ccc9CC12x12y1E, "_ZN3ccc9CC12x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y1C1Ev();
extern void _ZN3ccc9CC12x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y1E[] = {
  NSPAIR(_ZN3ccc9CC12x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y1E[];
extern void _ZN3ccc9CC12x12y13abcEv();
extern void _ZN3ccc9CC12x12y13pqrEv();
extern void _ZN3ccc9CC12x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y13abcEv,_ZThn4_N3ccc9CC12x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y13abcEv,_ZThn4_N3ccc9CC12x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y1E[];
Class_Descriptor cd__ZN3ccc9CC12x12y1E = {  "_ZN3ccc9CC12x12y1E", // class name
  bases__ZN3ccc9CC12x12y1E, 2,
  &(vtc__ZN3ccc9CC12x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y2  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC12x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y23pqrEv
  ~CC12x12y2(); // tgen
  CC12x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y2E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y23efgEv");}
void  ccc::CC12x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y23abcEv");}
void  ccc::CC12x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y23pqrEv");}
ccc::CC12x12y2 ::~CC12x12y2(){ note_dtor("_ZN3ccc9CC12x12y2E", this);} // tgen
ccc::CC12x12y2 ::CC12x12y2(){ note_ctor("_ZN3ccc9CC12x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y2E, buf);
    ::ccc::CC12x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y2E);
    dp->::ccc::CC12x12y2::~CC12x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y2E(Test__ZN3ccc9CC12x12y2E, "_ZN3ccc9CC12x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y2C1Ev();
extern void _ZN3ccc9CC12x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y2E[] = {
  NSPAIR(_ZN3ccc9CC12x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y2E[];
extern void _ZN3ccc9CC12x12y23abcEv();
extern void _ZN3ccc9CC12x12y23efgEv();
extern void _ZN3ccc9CC12x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y23abcEv,_ZThn4_N3ccc9CC12x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y23abcEv,_ZThn4_N3ccc9CC12x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y2E[];
Class_Descriptor cd__ZN3ccc9CC12x12y2E = {  "_ZN3ccc9CC12x12y2E", // class name
  bases__ZN3ccc9CC12x12y2E, 2,
  &(vtc__ZN3ccc9CC12x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y3  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC12x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x12y33abcEv
  ~CC12x12y3(); // tgen
  CC12x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y3E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y33efgEv");}
void  ccc::CC12x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y33pqrEv");}
void  ccc::CC12x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y33abcEv");}
ccc::CC12x12y3 ::~CC12x12y3(){ note_dtor("_ZN3ccc9CC12x12y3E", this);} // tgen
ccc::CC12x12y3 ::CC12x12y3(){ note_ctor("_ZN3ccc9CC12x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y3E, buf);
    ::ccc::CC12x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y3E);
    dp->::ccc::CC12x12y3::~CC12x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y3E(Test__ZN3ccc9CC12x12y3E, "_ZN3ccc9CC12x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y3C1Ev();
extern void _ZN3ccc9CC12x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y3E[] = {
  NSPAIR(_ZN3ccc9CC12x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y3E[];
extern void _ZN3ccc9CC12x12y33abcEv();
extern void _ZN3ccc9CC12x12y33efgEv();
extern void _ZN3ccc9CC12x12y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y33abcEv,_ZThn4_N3ccc9CC12x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y33abcEv,_ZThn4_N3ccc9CC12x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y3E[];
Class_Descriptor cd__ZN3ccc9CC12x12y3E = {  "_ZN3ccc9CC12x12y3E", // class name
  bases__ZN3ccc9CC12x12y3E, 2,
  &(vtc__ZN3ccc9CC12x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y4  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC12x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x12y43efgEv
  ~CC12x12y4(); // tgen
  CC12x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y4E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y43pqrEv");}
void  ccc::CC12x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y43abcEv");}
void  ccc::CC12x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y43efgEv");}
ccc::CC12x12y4 ::~CC12x12y4(){ note_dtor("_ZN3ccc9CC12x12y4E", this);} // tgen
ccc::CC12x12y4 ::CC12x12y4(){ note_ctor("_ZN3ccc9CC12x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y4E, buf);
    ::ccc::CC12x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y4E);
    dp->::ccc::CC12x12y4::~CC12x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y4E(Test__ZN3ccc9CC12x12y4E, "_ZN3ccc9CC12x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y4C1Ev();
extern void _ZN3ccc9CC12x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y4E[] = {
  NSPAIR(_ZN3ccc9CC12x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y4E[];
extern void _ZN3ccc9CC12x12y43abcEv();
extern void _ZN3ccc9CC12x12y43pqrEv();
extern void _ZN3ccc9CC12x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y43abcEv,_ZThn4_N3ccc9CC12x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y43abcEv,_ZThn4_N3ccc9CC12x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y4E[];
Class_Descriptor cd__ZN3ccc9CC12x12y4E = {  "_ZN3ccc9CC12x12y4E", // class name
  bases__ZN3ccc9CC12x12y4E, 2,
  &(vtc__ZN3ccc9CC12x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y5  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC12x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x12y53abcEv
  ~CC12x12y5(); // tgen
  CC12x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y5E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y53pqrEv");}
void  ccc::CC12x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y53efgEv");}
void  ccc::CC12x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y53abcEv");}
ccc::CC12x12y5 ::~CC12x12y5(){ note_dtor("_ZN3ccc9CC12x12y5E", this);} // tgen
ccc::CC12x12y5 ::CC12x12y5(){ note_ctor("_ZN3ccc9CC12x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y5E, buf);
    ::ccc::CC12x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y5E);
    dp->::ccc::CC12x12y5::~CC12x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y5E(Test__ZN3ccc9CC12x12y5E, "_ZN3ccc9CC12x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y5C1Ev();
extern void _ZN3ccc9CC12x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y5E[] = {
  NSPAIR(_ZN3ccc9CC12x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y5E[];
extern void _ZN3ccc9CC12x12y53abcEv();
extern void _ZN3ccc9CC12x12y53pqrEv();
extern void _ZN3ccc9CC12x12y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y53abcEv,_ZThn4_N3ccc9CC12x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y53abcEv,_ZThn4_N3ccc9CC12x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y5E[];
Class_Descriptor cd__ZN3ccc9CC12x12y5E = {  "_ZN3ccc9CC12x12y5E", // class name
  bases__ZN3ccc9CC12x12y5E, 2,
  &(vtc__ZN3ccc9CC12x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y6  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC12x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x12y63efgEv
  ~CC12x12y6(); // tgen
  CC12x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y6E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y63abcEv");}
void  ccc::CC12x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y63efgEv");}
ccc::CC12x12y6 ::~CC12x12y6(){ note_dtor("_ZN3ccc9CC12x12y6E", this);} // tgen
ccc::CC12x12y6 ::CC12x12y6(){ note_ctor("_ZN3ccc9CC12x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y6E, buf);
    ::ccc::CC12x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y6E);
    dp->::ccc::CC12x12y6::~CC12x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y6E(Test__ZN3ccc9CC12x12y6E, "_ZN3ccc9CC12x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y6C1Ev();
extern void _ZN3ccc9CC12x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y6E[] = {
  NSPAIR(_ZN3ccc9CC12x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y6E[];
extern void _ZN3ccc9CC12x12y63abcEv();
extern void _ZN3ccc9CC12x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y63abcEv,_ZThn4_N3ccc9CC12x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y63abcEv,_ZThn4_N3ccc9CC12x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y6E[];
Class_Descriptor cd__ZN3ccc9CC12x12y6E = {  "_ZN3ccc9CC12x12y6E", // class name
  bases__ZN3ccc9CC12x12y6E, 2,
  &(vtc__ZN3ccc9CC12x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y7  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC12x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y73pqrEv
  ~CC12x12y7(); // tgen
  CC12x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y7E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y73abcEv");}
void  ccc::CC12x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y73pqrEv");}
ccc::CC12x12y7 ::~CC12x12y7(){ note_dtor("_ZN3ccc9CC12x12y7E", this);} // tgen
ccc::CC12x12y7 ::CC12x12y7(){ note_ctor("_ZN3ccc9CC12x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y7E, buf);
    ::ccc::CC12x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y7E);
    dp->::ccc::CC12x12y7::~CC12x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y7E(Test__ZN3ccc9CC12x12y7E, "_ZN3ccc9CC12x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y7C1Ev();
extern void _ZN3ccc9CC12x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y7E[] = {
  NSPAIR(_ZN3ccc9CC12x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y7E[];
extern void _ZN3ccc9CC12x12y73abcEv();
extern void _ZN3ccc9CC12x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y73abcEv,_ZThn4_N3ccc9CC12x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y73abcEv,_ZThn4_N3ccc9CC12x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y7E[];
Class_Descriptor cd__ZN3ccc9CC12x12y7E = {  "_ZN3ccc9CC12x12y7E", // class name
  bases__ZN3ccc9CC12x12y7E, 2,
  &(vtc__ZN3ccc9CC12x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y8  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC12x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x12y83abcEv
  ~CC12x12y8(); // tgen
  CC12x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y8E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y83efgEv");}
void  ccc::CC12x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x12y83abcEv");}
ccc::CC12x12y8 ::~CC12x12y8(){ note_dtor("_ZN3ccc9CC12x12y8E", this);} // tgen
ccc::CC12x12y8 ::CC12x12y8(){ note_ctor("_ZN3ccc9CC12x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y8E, buf);
    ::ccc::CC12x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y8E);
    dp->::ccc::CC12x12y8::~CC12x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y8E(Test__ZN3ccc9CC12x12y8E, "_ZN3ccc9CC12x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y8C1Ev();
extern void _ZN3ccc9CC12x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y8E[] = {
  NSPAIR(_ZN3ccc9CC12x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y8E[];
extern void _ZN3ccc9CC12x12y83abcEv();
extern void _ZN3ccc9CC12x12y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x12y83abcEv,_ZThn4_N3ccc9CC12x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x12y83abcEv,_ZThn4_N3ccc9CC12x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y8E[];
Class_Descriptor cd__ZN3ccc9CC12x12y8E = {  "_ZN3ccc9CC12x12y8E", // class name
  bases__ZN3ccc9CC12x12y8E, 2,
  &(vtc__ZN3ccc9CC12x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y9  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC12x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x12y93pqrEv
  ~CC12x12y9(); // tgen
  CC12x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x12y9E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x12y93efgEv");}
void  ccc::CC12x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x12y93pqrEv");}
ccc::CC12x12y9 ::~CC12x12y9(){ note_dtor("_ZN3ccc9CC12x12y9E", this);} // tgen
ccc::CC12x12y9 ::CC12x12y9(){ note_ctor("_ZN3ccc9CC12x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x12y9E, buf);
    ::ccc::CC12x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x12y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC12x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x12y9E);
    dp->::ccc::CC12x12y9::~CC12x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x12y9E(Test__ZN3ccc9CC12x12y9E, "_ZN3ccc9CC12x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x12y9C1Ev();
extern void _ZN3ccc9CC12x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x12y9E[] = {
  NSPAIR(_ZN3ccc9CC12x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC12x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x12y93efgEv();
extern void _ZN3ccc9CC12x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x12y9E[];
Class_Descriptor cd__ZN3ccc9CC12x12y9E = {  "_ZN3ccc9CC12x12y9E", // class name
  bases__ZN3ccc9CC12x12y9E, 2,
  &(vtc__ZN3ccc9CC12x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x12y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y10  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC12x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x12y103abcEv
  ~CC12x12y10(); // tgen
  CC12x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y10E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x12y103pqrEv");}
void  ccc::CC12x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x12y103abcEv");}
ccc::CC12x12y10 ::~CC12x12y10(){ note_dtor("_ZN3ccc10CC12x12y10E", this);} // tgen
ccc::CC12x12y10 ::CC12x12y10(){ note_ctor("_ZN3ccc10CC12x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y10E, buf);
    ::ccc::CC12x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y10E);
    dp->::ccc::CC12x12y10::~CC12x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y10E(Test__ZN3ccc10CC12x12y10E, "_ZN3ccc10CC12x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y10C1Ev();
extern void _ZN3ccc10CC12x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y10E[] = {
  NSPAIR(_ZN3ccc10CC12x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y10E[];
extern void _ZN3ccc10CC12x12y103abcEv();
extern void _ZN3ccc10CC12x12y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x12y103abcEv,_ZThn4_N3ccc10CC12x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x12y103abcEv,_ZThn4_N3ccc10CC12x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y10E[];
Class_Descriptor cd__ZN3ccc10CC12x12y10E = {  "_ZN3ccc10CC12x12y10E", // class name
  bases__ZN3ccc10CC12x12y10E, 2,
  &(vtc__ZN3ccc10CC12x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y11  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC12x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x12y113efgEv
  ~CC12x12y11(); // tgen
  CC12x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y11E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC12x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x12y113pqrEv");}
void  ccc::CC12x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x12y113efgEv");}
ccc::CC12x12y11 ::~CC12x12y11(){ note_dtor("_ZN3ccc10CC12x12y11E", this);} // tgen
ccc::CC12x12y11 ::CC12x12y11(){ note_ctor("_ZN3ccc10CC12x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y11E, buf);
    ::ccc::CC12x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y11E);
    dp->::ccc::CC12x12y11::~CC12x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y11E(Test__ZN3ccc10CC12x12y11E, "_ZN3ccc10CC12x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y11C1Ev();
extern void _ZN3ccc10CC12x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y11E[] = {
  NSPAIR(_ZN3ccc10CC12x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x12y113pqrEv();
extern void _ZN3ccc10CC12x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y11E[];
Class_Descriptor cd__ZN3ccc10CC12x12y11E = {  "_ZN3ccc10CC12x12y11E", // class name
  bases__ZN3ccc10CC12x12y11E, 2,
  &(vtc__ZN3ccc10CC12x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y12  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC12x12y123abcEv
  ~CC12x12y12(); // tgen
  CC12x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y12E) C1{ BC2{ v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC12x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x12y123abcEv");}
ccc::CC12x12y12 ::~CC12x12y12(){ note_dtor("_ZN3ccc10CC12x12y12E", this);} // tgen
ccc::CC12x12y12 ::CC12x12y12(){ note_ctor("_ZN3ccc10CC12x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y12E, buf);
    ::ccc::CC12x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y12E);
    dp->::ccc::CC12x12y12::~CC12x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y12E(Test__ZN3ccc10CC12x12y12E, "_ZN3ccc10CC12x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y12C1Ev();
extern void _ZN3ccc10CC12x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y12E[] = {
  NSPAIR(_ZN3ccc10CC12x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y12E[];
extern void _ZN3ccc10CC12x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x12y123abcEv,_ZThn4_N3ccc10CC12x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x12y123abcEv,_ZThn4_N3ccc10CC12x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y12E[];
Class_Descriptor cd__ZN3ccc10CC12x12y12E = {  "_ZN3ccc10CC12x12y12E", // class name
  bases__ZN3ccc10CC12x12y12E, 2,
  &(vtc__ZN3ccc10CC12x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y12E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y13  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC12x12y133efgEv
  ~CC12x12y13(); // tgen
  CC12x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y13E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC12x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x12y133efgEv");}
ccc::CC12x12y13 ::~CC12x12y13(){ note_dtor("_ZN3ccc10CC12x12y13E", this);} // tgen
ccc::CC12x12y13 ::CC12x12y13(){ note_ctor("_ZN3ccc10CC12x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y13E, buf);
    ::ccc::CC12x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y13E);
    dp->::ccc::CC12x12y13::~CC12x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y13E(Test__ZN3ccc10CC12x12y13E, "_ZN3ccc10CC12x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y13C1Ev();
extern void _ZN3ccc10CC12x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y13E[] = {
  NSPAIR(_ZN3ccc10CC12x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y13E[];
Class_Descriptor cd__ZN3ccc10CC12x12y13E = {  "_ZN3ccc10CC12x12y13E", // class name
  bases__ZN3ccc10CC12x12y13E, 2,
  &(vtc__ZN3ccc10CC12x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y14  : ::ccc::AA12 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC12x12y143pqrEv
  ~CC12x12y14(); // tgen
  CC12x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y14E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC12x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x12y143pqrEv");}
ccc::CC12x12y14 ::~CC12x12y14(){ note_dtor("_ZN3ccc10CC12x12y14E", this);} // tgen
ccc::CC12x12y14 ::CC12x12y14(){ note_ctor("_ZN3ccc10CC12x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y14E, buf);
    ::ccc::CC12x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y14E);
    dp->::ccc::CC12x12y14::~CC12x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y14E(Test__ZN3ccc10CC12x12y14E, "_ZN3ccc10CC12x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y14C1Ev();
extern void _ZN3ccc10CC12x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y14E[] = {
  NSPAIR(_ZN3ccc10CC12x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y14E[];
Class_Descriptor cd__ZN3ccc10CC12x12y14E = {  "_ZN3ccc10CC12x12y14E", // class name
  bases__ZN3ccc10CC12x12y14E, 2,
  &(vtc__ZN3ccc10CC12x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x12y15  : ::ccc::AA12 , ::ccc::BB12 {
  ~CC12x12y15(); // tgen
  CC12x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x12y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC12x12y15 ::~CC12x12y15(){ note_dtor("_ZN3ccc10CC12x12y15E", this);} // tgen
ccc::CC12x12y15 ::CC12x12y15(){ note_ctor("_ZN3ccc10CC12x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x12y15E, buf);
    ::ccc::CC12x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x12y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC12x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x12y15E);
    dp->::ccc::CC12x12y15::~CC12x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x12y15E(Test__ZN3ccc10CC12x12y15E, "_ZN3ccc10CC12x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x12y15C1Ev();
extern void _ZN3ccc10CC12x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x12y15E[] = {
  NSPAIR(_ZN3ccc10CC12x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC12x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x12y15E[];
Class_Descriptor cd__ZN3ccc10CC12x12y15E = {  "_ZN3ccc10CC12x12y15E", // class name
  bases__ZN3ccc10CC12x12y15E, 2,
  &(vtc__ZN3ccc10CC12x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x12y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y0  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC12x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y03pqrEv
  ~CC12x13y0(); // tgen
  CC12x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y0E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y03abcEv");}
void  ccc::CC12x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y03efgEv");}
void  ccc::CC12x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y03pqrEv");}
ccc::CC12x13y0 ::~CC12x13y0(){ note_dtor("_ZN3ccc9CC12x13y0E", this);} // tgen
ccc::CC12x13y0 ::CC12x13y0(){ note_ctor("_ZN3ccc9CC12x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y0E, buf);
    ::ccc::CC12x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y0E);
    dp->::ccc::CC12x13y0::~CC12x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y0E(Test__ZN3ccc9CC12x13y0E, "_ZN3ccc9CC12x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y0C1Ev();
extern void _ZN3ccc9CC12x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y0E[] = {
  NSPAIR(_ZN3ccc9CC12x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y0E[];
extern void _ZN3ccc9CC12x13y03abcEv();
extern void _ZN3ccc9CC12x13y03efgEv();
extern void _ZN3ccc9CC12x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y03efgEv,_ZThn4_N3ccc9CC12x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y03efgEv,_ZThn4_N3ccc9CC12x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y0E[];
Class_Descriptor cd__ZN3ccc9CC12x13y0E = {  "_ZN3ccc9CC12x13y0E", // class name
  bases__ZN3ccc9CC12x13y0E, 2,
  &(vtc__ZN3ccc9CC12x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y1  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC12x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x13y13efgEv
  ~CC12x13y1(); // tgen
  CC12x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y1E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y13abcEv");}
void  ccc::CC12x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y13pqrEv");}
void  ccc::CC12x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y13efgEv");}
ccc::CC12x13y1 ::~CC12x13y1(){ note_dtor("_ZN3ccc9CC12x13y1E", this);} // tgen
ccc::CC12x13y1 ::CC12x13y1(){ note_ctor("_ZN3ccc9CC12x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y1E, buf);
    ::ccc::CC12x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y1E);
    dp->::ccc::CC12x13y1::~CC12x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y1E(Test__ZN3ccc9CC12x13y1E, "_ZN3ccc9CC12x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y1C1Ev();
extern void _ZN3ccc9CC12x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y1E[] = {
  NSPAIR(_ZN3ccc9CC12x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y1E[];
extern void _ZN3ccc9CC12x13y13abcEv();
extern void _ZN3ccc9CC12x13y13pqrEv();
extern void _ZN3ccc9CC12x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y13efgEv,_ZThn4_N3ccc9CC12x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y13efgEv,_ZThn4_N3ccc9CC12x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y1E[];
Class_Descriptor cd__ZN3ccc9CC12x13y1E = {  "_ZN3ccc9CC12x13y1E", // class name
  bases__ZN3ccc9CC12x13y1E, 2,
  &(vtc__ZN3ccc9CC12x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y2  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC12x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y23pqrEv
  ~CC12x13y2(); // tgen
  CC12x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y2E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y23efgEv");}
void  ccc::CC12x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y23abcEv");}
void  ccc::CC12x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y23pqrEv");}
ccc::CC12x13y2 ::~CC12x13y2(){ note_dtor("_ZN3ccc9CC12x13y2E", this);} // tgen
ccc::CC12x13y2 ::CC12x13y2(){ note_ctor("_ZN3ccc9CC12x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y2E, buf);
    ::ccc::CC12x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y2E);
    dp->::ccc::CC12x13y2::~CC12x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y2E(Test__ZN3ccc9CC12x13y2E, "_ZN3ccc9CC12x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y2C1Ev();
extern void _ZN3ccc9CC12x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y2E[] = {
  NSPAIR(_ZN3ccc9CC12x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y2E[];
extern void _ZN3ccc9CC12x13y23abcEv();
extern void _ZN3ccc9CC12x13y23efgEv();
extern void _ZN3ccc9CC12x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y23efgEv,_ZThn4_N3ccc9CC12x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y23efgEv,_ZThn4_N3ccc9CC12x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y2E[];
Class_Descriptor cd__ZN3ccc9CC12x13y2E = {  "_ZN3ccc9CC12x13y2E", // class name
  bases__ZN3ccc9CC12x13y2E, 2,
  &(vtc__ZN3ccc9CC12x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y3  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC12x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x13y33abcEv
  ~CC12x13y3(); // tgen
  CC12x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y3E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y33efgEv");}
void  ccc::CC12x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y33pqrEv");}
void  ccc::CC12x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y33abcEv");}
ccc::CC12x13y3 ::~CC12x13y3(){ note_dtor("_ZN3ccc9CC12x13y3E", this);} // tgen
ccc::CC12x13y3 ::CC12x13y3(){ note_ctor("_ZN3ccc9CC12x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y3E, buf);
    ::ccc::CC12x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y3E);
    dp->::ccc::CC12x13y3::~CC12x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y3E(Test__ZN3ccc9CC12x13y3E, "_ZN3ccc9CC12x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y3C1Ev();
extern void _ZN3ccc9CC12x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y3E[] = {
  NSPAIR(_ZN3ccc9CC12x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y3E[];
extern void _ZN3ccc9CC12x13y33abcEv();
extern void _ZN3ccc9CC12x13y33efgEv();
extern void _ZN3ccc9CC12x13y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y33efgEv,_ZThn4_N3ccc9CC12x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y33efgEv,_ZThn4_N3ccc9CC12x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y3E[];
Class_Descriptor cd__ZN3ccc9CC12x13y3E = {  "_ZN3ccc9CC12x13y3E", // class name
  bases__ZN3ccc9CC12x13y3E, 2,
  &(vtc__ZN3ccc9CC12x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y4  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC12x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x13y43efgEv
  ~CC12x13y4(); // tgen
  CC12x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y4E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y43pqrEv");}
void  ccc::CC12x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y43abcEv");}
void  ccc::CC12x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y43efgEv");}
ccc::CC12x13y4 ::~CC12x13y4(){ note_dtor("_ZN3ccc9CC12x13y4E", this);} // tgen
ccc::CC12x13y4 ::CC12x13y4(){ note_ctor("_ZN3ccc9CC12x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y4E, buf);
    ::ccc::CC12x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y4E);
    dp->::ccc::CC12x13y4::~CC12x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y4E(Test__ZN3ccc9CC12x13y4E, "_ZN3ccc9CC12x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y4C1Ev();
extern void _ZN3ccc9CC12x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y4E[] = {
  NSPAIR(_ZN3ccc9CC12x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y4E[];
extern void _ZN3ccc9CC12x13y43abcEv();
extern void _ZN3ccc9CC12x13y43pqrEv();
extern void _ZN3ccc9CC12x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y43efgEv,_ZThn4_N3ccc9CC12x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y43efgEv,_ZThn4_N3ccc9CC12x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y4E[];
Class_Descriptor cd__ZN3ccc9CC12x13y4E = {  "_ZN3ccc9CC12x13y4E", // class name
  bases__ZN3ccc9CC12x13y4E, 2,
  &(vtc__ZN3ccc9CC12x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y5  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC12x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x13y53abcEv
  ~CC12x13y5(); // tgen
  CC12x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y5E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y53pqrEv");}
void  ccc::CC12x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y53efgEv");}
void  ccc::CC12x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y53abcEv");}
ccc::CC12x13y5 ::~CC12x13y5(){ note_dtor("_ZN3ccc9CC12x13y5E", this);} // tgen
ccc::CC12x13y5 ::CC12x13y5(){ note_ctor("_ZN3ccc9CC12x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y5E, buf);
    ::ccc::CC12x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y5E);
    dp->::ccc::CC12x13y5::~CC12x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y5E(Test__ZN3ccc9CC12x13y5E, "_ZN3ccc9CC12x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y5C1Ev();
extern void _ZN3ccc9CC12x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y5E[] = {
  NSPAIR(_ZN3ccc9CC12x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y5E[];
extern void _ZN3ccc9CC12x13y53abcEv();
extern void _ZN3ccc9CC12x13y53pqrEv();
extern void _ZN3ccc9CC12x13y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y53efgEv,_ZThn4_N3ccc9CC12x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y53efgEv,_ZThn4_N3ccc9CC12x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y5E[];
Class_Descriptor cd__ZN3ccc9CC12x13y5E = {  "_ZN3ccc9CC12x13y5E", // class name
  bases__ZN3ccc9CC12x13y5E, 2,
  &(vtc__ZN3ccc9CC12x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y6  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC12x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x13y63efgEv
  ~CC12x13y6(); // tgen
  CC12x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y6E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y63abcEv");}
void  ccc::CC12x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y63efgEv");}
ccc::CC12x13y6 ::~CC12x13y6(){ note_dtor("_ZN3ccc9CC12x13y6E", this);} // tgen
ccc::CC12x13y6 ::CC12x13y6(){ note_ctor("_ZN3ccc9CC12x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y6E, buf);
    ::ccc::CC12x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y6E);
    dp->::ccc::CC12x13y6::~CC12x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y6E(Test__ZN3ccc9CC12x13y6E, "_ZN3ccc9CC12x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y6C1Ev();
extern void _ZN3ccc9CC12x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y6E[] = {
  NSPAIR(_ZN3ccc9CC12x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y6E[];
extern void _ZN3ccc9CC12x13y63abcEv();
extern void _ZN3ccc9CC12x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y63efgEv,_ZThn4_N3ccc9CC12x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y63efgEv,_ZThn4_N3ccc9CC12x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y6E[];
Class_Descriptor cd__ZN3ccc9CC12x13y6E = {  "_ZN3ccc9CC12x13y6E", // class name
  bases__ZN3ccc9CC12x13y6E, 2,
  &(vtc__ZN3ccc9CC12x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y7  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC12x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y73pqrEv
  ~CC12x13y7(); // tgen
  CC12x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y7E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y73abcEv");}
void  ccc::CC12x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y73pqrEv");}
ccc::CC12x13y7 ::~CC12x13y7(){ note_dtor("_ZN3ccc9CC12x13y7E", this);} // tgen
ccc::CC12x13y7 ::CC12x13y7(){ note_ctor("_ZN3ccc9CC12x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y7E, buf);
    ::ccc::CC12x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y7E);
    dp->::ccc::CC12x13y7::~CC12x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y7E(Test__ZN3ccc9CC12x13y7E, "_ZN3ccc9CC12x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y7C1Ev();
extern void _ZN3ccc9CC12x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y7E[] = {
  NSPAIR(_ZN3ccc9CC12x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y7E[];
extern void _ZN3ccc9CC12x13y73abcEv();
extern void _ZN3ccc9CC12x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y7E[];
Class_Descriptor cd__ZN3ccc9CC12x13y7E = {  "_ZN3ccc9CC12x13y7E", // class name
  bases__ZN3ccc9CC12x13y7E, 2,
  &(vtc__ZN3ccc9CC12x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y8  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC12x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x13y83abcEv
  ~CC12x13y8(); // tgen
  CC12x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y8E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y83efgEv");}
void  ccc::CC12x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x13y83abcEv");}
ccc::CC12x13y8 ::~CC12x13y8(){ note_dtor("_ZN3ccc9CC12x13y8E", this);} // tgen
ccc::CC12x13y8 ::CC12x13y8(){ note_ctor("_ZN3ccc9CC12x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y8E, buf);
    ::ccc::CC12x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y8E);
    dp->::ccc::CC12x13y8::~CC12x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y8E(Test__ZN3ccc9CC12x13y8E, "_ZN3ccc9CC12x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y8C1Ev();
extern void _ZN3ccc9CC12x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y8E[] = {
  NSPAIR(_ZN3ccc9CC12x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y8E[];
extern void _ZN3ccc9CC12x13y83abcEv();
extern void _ZN3ccc9CC12x13y83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y83efgEv,_ZThn4_N3ccc9CC12x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y83efgEv,_ZThn4_N3ccc9CC12x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y8E[];
Class_Descriptor cd__ZN3ccc9CC12x13y8E = {  "_ZN3ccc9CC12x13y8E", // class name
  bases__ZN3ccc9CC12x13y8E, 2,
  &(vtc__ZN3ccc9CC12x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y9  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC12x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x13y93pqrEv
  ~CC12x13y9(); // tgen
  CC12x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x13y9E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x13y93efgEv");}
void  ccc::CC12x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x13y93pqrEv");}
ccc::CC12x13y9 ::~CC12x13y9(){ note_dtor("_ZN3ccc9CC12x13y9E", this);} // tgen
ccc::CC12x13y9 ::CC12x13y9(){ note_ctor("_ZN3ccc9CC12x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x13y9E, buf);
    ::ccc::CC12x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x13y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC12x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x13y9E);
    dp->::ccc::CC12x13y9::~CC12x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x13y9E(Test__ZN3ccc9CC12x13y9E, "_ZN3ccc9CC12x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x13y9C1Ev();
extern void _ZN3ccc9CC12x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x13y9E[] = {
  NSPAIR(_ZN3ccc9CC12x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC12x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x13y93efgEv();
extern void _ZN3ccc9CC12x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x13y93efgEv,_ZThn4_N3ccc9CC12x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x13y93efgEv,_ZThn4_N3ccc9CC12x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x13y9E[];
Class_Descriptor cd__ZN3ccc9CC12x13y9E = {  "_ZN3ccc9CC12x13y9E", // class name
  bases__ZN3ccc9CC12x13y9E, 2,
  &(vtc__ZN3ccc9CC12x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x13y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y10  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC12x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x13y103abcEv
  ~CC12x13y10(); // tgen
  CC12x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y10E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x13y103pqrEv");}
void  ccc::CC12x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x13y103abcEv");}
ccc::CC12x13y10 ::~CC12x13y10(){ note_dtor("_ZN3ccc10CC12x13y10E", this);} // tgen
ccc::CC12x13y10 ::CC12x13y10(){ note_ctor("_ZN3ccc10CC12x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y10E, buf);
    ::ccc::CC12x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y10E);
    dp->::ccc::CC12x13y10::~CC12x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y10E(Test__ZN3ccc10CC12x13y10E, "_ZN3ccc10CC12x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y10C1Ev();
extern void _ZN3ccc10CC12x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y10E[] = {
  NSPAIR(_ZN3ccc10CC12x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y10E[];
extern void _ZN3ccc10CC12x13y103abcEv();
extern void _ZN3ccc10CC12x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y10E[];
Class_Descriptor cd__ZN3ccc10CC12x13y10E = {  "_ZN3ccc10CC12x13y10E", // class name
  bases__ZN3ccc10CC12x13y10E, 2,
  &(vtc__ZN3ccc10CC12x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y11  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC12x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x13y113efgEv
  ~CC12x13y11(); // tgen
  CC12x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y11E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x13y113pqrEv");}
void  ccc::CC12x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x13y113efgEv");}
ccc::CC12x13y11 ::~CC12x13y11(){ note_dtor("_ZN3ccc10CC12x13y11E", this);} // tgen
ccc::CC12x13y11 ::CC12x13y11(){ note_ctor("_ZN3ccc10CC12x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y11E, buf);
    ::ccc::CC12x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y11E);
    dp->::ccc::CC12x13y11::~CC12x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y11E(Test__ZN3ccc10CC12x13y11E, "_ZN3ccc10CC12x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y11C1Ev();
extern void _ZN3ccc10CC12x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y11E[] = {
  NSPAIR(_ZN3ccc10CC12x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x13y113pqrEv();
extern void _ZN3ccc10CC12x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x13y113efgEv,_ZThn4_N3ccc10CC12x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x13y113efgEv,_ZThn4_N3ccc10CC12x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y11E[];
Class_Descriptor cd__ZN3ccc10CC12x13y11E = {  "_ZN3ccc10CC12x13y11E", // class name
  bases__ZN3ccc10CC12x13y11E, 2,
  &(vtc__ZN3ccc10CC12x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y12  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC12x13y123abcEv
  ~CC12x13y12(); // tgen
  CC12x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y12E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC12x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x13y123abcEv");}
ccc::CC12x13y12 ::~CC12x13y12(){ note_dtor("_ZN3ccc10CC12x13y12E", this);} // tgen
ccc::CC12x13y12 ::CC12x13y12(){ note_ctor("_ZN3ccc10CC12x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y12E, buf);
    ::ccc::CC12x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y12E);
    dp->::ccc::CC12x13y12::~CC12x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y12E(Test__ZN3ccc10CC12x13y12E, "_ZN3ccc10CC12x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y12C1Ev();
extern void _ZN3ccc10CC12x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y12E[] = {
  NSPAIR(_ZN3ccc10CC12x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y12E[];
extern void _ZN3ccc10CC12x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y12E[];
Class_Descriptor cd__ZN3ccc10CC12x13y12E = {  "_ZN3ccc10CC12x13y12E", // class name
  bases__ZN3ccc10CC12x13y12E, 2,
  &(vtc__ZN3ccc10CC12x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y12E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y13  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC12x13y133efgEv
  ~CC12x13y13(); // tgen
  CC12x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y13E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC12x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x13y133efgEv");}
ccc::CC12x13y13 ::~CC12x13y13(){ note_dtor("_ZN3ccc10CC12x13y13E", this);} // tgen
ccc::CC12x13y13 ::CC12x13y13(){ note_ctor("_ZN3ccc10CC12x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y13E, buf);
    ::ccc::CC12x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y13E);
    dp->::ccc::CC12x13y13::~CC12x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y13E(Test__ZN3ccc10CC12x13y13E, "_ZN3ccc10CC12x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y13C1Ev();
extern void _ZN3ccc10CC12x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y13E[] = {
  NSPAIR(_ZN3ccc10CC12x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x13y133efgEv,_ZThn4_N3ccc10CC12x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x13y133efgEv,_ZThn4_N3ccc10CC12x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y13E[];
Class_Descriptor cd__ZN3ccc10CC12x13y13E = {  "_ZN3ccc10CC12x13y13E", // class name
  bases__ZN3ccc10CC12x13y13E, 2,
  &(vtc__ZN3ccc10CC12x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y14  : ::ccc::AA12 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC12x13y143pqrEv
  ~CC12x13y14(); // tgen
  CC12x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y14E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC12x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x13y143pqrEv");}
ccc::CC12x13y14 ::~CC12x13y14(){ note_dtor("_ZN3ccc10CC12x13y14E", this);} // tgen
ccc::CC12x13y14 ::CC12x13y14(){ note_ctor("_ZN3ccc10CC12x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y14E, buf);
    ::ccc::CC12x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y14E);
    dp->::ccc::CC12x13y14::~CC12x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y14E(Test__ZN3ccc10CC12x13y14E, "_ZN3ccc10CC12x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y14C1Ev();
extern void _ZN3ccc10CC12x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y14E[] = {
  NSPAIR(_ZN3ccc10CC12x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y14E[];
Class_Descriptor cd__ZN3ccc10CC12x13y14E = {  "_ZN3ccc10CC12x13y14E", // class name
  bases__ZN3ccc10CC12x13y14E, 2,
  &(vtc__ZN3ccc10CC12x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x13y15  : ::ccc::AA12 , ::ccc::BB13 {
  ~CC12x13y15(); // tgen
  CC12x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x13y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC12x13y15 ::~CC12x13y15(){ note_dtor("_ZN3ccc10CC12x13y15E", this);} // tgen
ccc::CC12x13y15 ::CC12x13y15(){ note_ctor("_ZN3ccc10CC12x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x13y15E, buf);
    ::ccc::CC12x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x13y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC12x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x13y15E);
    dp->::ccc::CC12x13y15::~CC12x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x13y15E(Test__ZN3ccc10CC12x13y15E, "_ZN3ccc10CC12x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x13y15C1Ev();
extern void _ZN3ccc10CC12x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x13y15E[] = {
  NSPAIR(_ZN3ccc10CC12x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC12x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x13y15E[];
Class_Descriptor cd__ZN3ccc10CC12x13y15E = {  "_ZN3ccc10CC12x13y15E", // class name
  bases__ZN3ccc10CC12x13y15E, 2,
  &(vtc__ZN3ccc10CC12x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x13y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y0  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC12x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y03pqrEv
  ~CC12x14y0(); // tgen
  CC12x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y0E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y03abcEv");}
void  ccc::CC12x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y03efgEv");}
void  ccc::CC12x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y03pqrEv");}
ccc::CC12x14y0 ::~CC12x14y0(){ note_dtor("_ZN3ccc9CC12x14y0E", this);} // tgen
ccc::CC12x14y0 ::CC12x14y0(){ note_ctor("_ZN3ccc9CC12x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y0E, buf);
    ::ccc::CC12x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y0E);
    dp->::ccc::CC12x14y0::~CC12x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y0E(Test__ZN3ccc9CC12x14y0E, "_ZN3ccc9CC12x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y0C1Ev();
extern void _ZN3ccc9CC12x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y0E[] = {
  NSPAIR(_ZN3ccc9CC12x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y0E[];
extern void _ZN3ccc9CC12x14y03abcEv();
extern void _ZN3ccc9CC12x14y03efgEv();
extern void _ZN3ccc9CC12x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y03pqrEv,_ZThn4_N3ccc9CC12x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y03pqrEv,_ZThn4_N3ccc9CC12x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y0E[];
Class_Descriptor cd__ZN3ccc9CC12x14y0E = {  "_ZN3ccc9CC12x14y0E", // class name
  bases__ZN3ccc9CC12x14y0E, 2,
  &(vtc__ZN3ccc9CC12x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y1  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC12x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x14y13efgEv
  ~CC12x14y1(); // tgen
  CC12x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y1E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y13abcEv");}
void  ccc::CC12x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y13pqrEv");}
void  ccc::CC12x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y13efgEv");}
ccc::CC12x14y1 ::~CC12x14y1(){ note_dtor("_ZN3ccc9CC12x14y1E", this);} // tgen
ccc::CC12x14y1 ::CC12x14y1(){ note_ctor("_ZN3ccc9CC12x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y1E, buf);
    ::ccc::CC12x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y1E);
    dp->::ccc::CC12x14y1::~CC12x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y1E(Test__ZN3ccc9CC12x14y1E, "_ZN3ccc9CC12x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y1C1Ev();
extern void _ZN3ccc9CC12x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y1E[] = {
  NSPAIR(_ZN3ccc9CC12x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y1E[];
extern void _ZN3ccc9CC12x14y13abcEv();
extern void _ZN3ccc9CC12x14y13pqrEv();
extern void _ZN3ccc9CC12x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y13pqrEv,_ZThn4_N3ccc9CC12x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y13pqrEv,_ZThn4_N3ccc9CC12x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y1E[];
Class_Descriptor cd__ZN3ccc9CC12x14y1E = {  "_ZN3ccc9CC12x14y1E", // class name
  bases__ZN3ccc9CC12x14y1E, 2,
  &(vtc__ZN3ccc9CC12x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y2  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC12x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y23pqrEv
  ~CC12x14y2(); // tgen
  CC12x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y2E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y23efgEv");}
void  ccc::CC12x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y23abcEv");}
void  ccc::CC12x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y23pqrEv");}
ccc::CC12x14y2 ::~CC12x14y2(){ note_dtor("_ZN3ccc9CC12x14y2E", this);} // tgen
ccc::CC12x14y2 ::CC12x14y2(){ note_ctor("_ZN3ccc9CC12x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y2E, buf);
    ::ccc::CC12x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y2E);
    dp->::ccc::CC12x14y2::~CC12x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y2E(Test__ZN3ccc9CC12x14y2E, "_ZN3ccc9CC12x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y2C1Ev();
extern void _ZN3ccc9CC12x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y2E[] = {
  NSPAIR(_ZN3ccc9CC12x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y2E[];
extern void _ZN3ccc9CC12x14y23abcEv();
extern void _ZN3ccc9CC12x14y23efgEv();
extern void _ZN3ccc9CC12x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y23pqrEv,_ZThn4_N3ccc9CC12x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y23pqrEv,_ZThn4_N3ccc9CC12x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y2E[];
Class_Descriptor cd__ZN3ccc9CC12x14y2E = {  "_ZN3ccc9CC12x14y2E", // class name
  bases__ZN3ccc9CC12x14y2E, 2,
  &(vtc__ZN3ccc9CC12x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y3  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC12x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x14y33abcEv
  ~CC12x14y3(); // tgen
  CC12x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y3E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y33efgEv");}
void  ccc::CC12x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y33pqrEv");}
void  ccc::CC12x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y33abcEv");}
ccc::CC12x14y3 ::~CC12x14y3(){ note_dtor("_ZN3ccc9CC12x14y3E", this);} // tgen
ccc::CC12x14y3 ::CC12x14y3(){ note_ctor("_ZN3ccc9CC12x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y3E, buf);
    ::ccc::CC12x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y3E);
    dp->::ccc::CC12x14y3::~CC12x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y3E(Test__ZN3ccc9CC12x14y3E, "_ZN3ccc9CC12x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y3C1Ev();
extern void _ZN3ccc9CC12x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y3E[] = {
  NSPAIR(_ZN3ccc9CC12x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y3E[];
extern void _ZN3ccc9CC12x14y33abcEv();
extern void _ZN3ccc9CC12x14y33efgEv();
extern void _ZN3ccc9CC12x14y33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y33pqrEv,_ZThn4_N3ccc9CC12x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y33pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y33pqrEv,_ZThn4_N3ccc9CC12x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y3E[];
Class_Descriptor cd__ZN3ccc9CC12x14y3E = {  "_ZN3ccc9CC12x14y3E", // class name
  bases__ZN3ccc9CC12x14y3E, 2,
  &(vtc__ZN3ccc9CC12x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y4  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC12x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x14y43efgEv
  ~CC12x14y4(); // tgen
  CC12x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y4E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y43pqrEv");}
void  ccc::CC12x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y43abcEv");}
void  ccc::CC12x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y43efgEv");}
ccc::CC12x14y4 ::~CC12x14y4(){ note_dtor("_ZN3ccc9CC12x14y4E", this);} // tgen
ccc::CC12x14y4 ::CC12x14y4(){ note_ctor("_ZN3ccc9CC12x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y4E, buf);
    ::ccc::CC12x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y4E);
    dp->::ccc::CC12x14y4::~CC12x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y4E(Test__ZN3ccc9CC12x14y4E, "_ZN3ccc9CC12x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y4C1Ev();
extern void _ZN3ccc9CC12x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y4E[] = {
  NSPAIR(_ZN3ccc9CC12x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y4E[];
extern void _ZN3ccc9CC12x14y43abcEv();
extern void _ZN3ccc9CC12x14y43pqrEv();
extern void _ZN3ccc9CC12x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y43pqrEv,_ZThn4_N3ccc9CC12x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y43pqrEv,_ZThn4_N3ccc9CC12x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y4E[];
Class_Descriptor cd__ZN3ccc9CC12x14y4E = {  "_ZN3ccc9CC12x14y4E", // class name
  bases__ZN3ccc9CC12x14y4E, 2,
  &(vtc__ZN3ccc9CC12x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y5  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC12x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x14y53abcEv
  ~CC12x14y5(); // tgen
  CC12x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y5E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y53pqrEv");}
void  ccc::CC12x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y53efgEv");}
void  ccc::CC12x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y53abcEv");}
ccc::CC12x14y5 ::~CC12x14y5(){ note_dtor("_ZN3ccc9CC12x14y5E", this);} // tgen
ccc::CC12x14y5 ::CC12x14y5(){ note_ctor("_ZN3ccc9CC12x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y5E, buf);
    ::ccc::CC12x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y5E);
    dp->::ccc::CC12x14y5::~CC12x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y5E(Test__ZN3ccc9CC12x14y5E, "_ZN3ccc9CC12x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y5C1Ev();
extern void _ZN3ccc9CC12x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y5E[] = {
  NSPAIR(_ZN3ccc9CC12x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y5E[];
extern void _ZN3ccc9CC12x14y53abcEv();
extern void _ZN3ccc9CC12x14y53pqrEv();
extern void _ZN3ccc9CC12x14y53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y53pqrEv,_ZThn4_N3ccc9CC12x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y53efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y53pqrEv,_ZThn4_N3ccc9CC12x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y5E[];
Class_Descriptor cd__ZN3ccc9CC12x14y5E = {  "_ZN3ccc9CC12x14y5E", // class name
  bases__ZN3ccc9CC12x14y5E, 2,
  &(vtc__ZN3ccc9CC12x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y6  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC12x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x14y63efgEv
  ~CC12x14y6(); // tgen
  CC12x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y6E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y63abcEv");}
void  ccc::CC12x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y63efgEv");}
ccc::CC12x14y6 ::~CC12x14y6(){ note_dtor("_ZN3ccc9CC12x14y6E", this);} // tgen
ccc::CC12x14y6 ::CC12x14y6(){ note_ctor("_ZN3ccc9CC12x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y6E, buf);
    ::ccc::CC12x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y6E);
    dp->::ccc::CC12x14y6::~CC12x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y6E(Test__ZN3ccc9CC12x14y6E, "_ZN3ccc9CC12x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y6C1Ev();
extern void _ZN3ccc9CC12x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y6E[] = {
  NSPAIR(_ZN3ccc9CC12x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y6E[];
extern void _ZN3ccc9CC12x14y63abcEv();
extern void _ZN3ccc9CC12x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y6E[];
Class_Descriptor cd__ZN3ccc9CC12x14y6E = {  "_ZN3ccc9CC12x14y6E", // class name
  bases__ZN3ccc9CC12x14y6E, 2,
  &(vtc__ZN3ccc9CC12x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y7  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC12x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y73pqrEv
  ~CC12x14y7(); // tgen
  CC12x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y7E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y73abcEv");}
void  ccc::CC12x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y73pqrEv");}
ccc::CC12x14y7 ::~CC12x14y7(){ note_dtor("_ZN3ccc9CC12x14y7E", this);} // tgen
ccc::CC12x14y7 ::CC12x14y7(){ note_ctor("_ZN3ccc9CC12x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y7E, buf);
    ::ccc::CC12x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y7E);
    dp->::ccc::CC12x14y7::~CC12x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y7E(Test__ZN3ccc9CC12x14y7E, "_ZN3ccc9CC12x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y7C1Ev();
extern void _ZN3ccc9CC12x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y7E[] = {
  NSPAIR(_ZN3ccc9CC12x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y7E[];
extern void _ZN3ccc9CC12x14y73abcEv();
extern void _ZN3ccc9CC12x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y73pqrEv,_ZThn4_N3ccc9CC12x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y73pqrEv,_ZThn4_N3ccc9CC12x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y7E[];
Class_Descriptor cd__ZN3ccc9CC12x14y7E = {  "_ZN3ccc9CC12x14y7E", // class name
  bases__ZN3ccc9CC12x14y7E, 2,
  &(vtc__ZN3ccc9CC12x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y8  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC12x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x14y83abcEv
  ~CC12x14y8(); // tgen
  CC12x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y8E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y83efgEv");}
void  ccc::CC12x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x14y83abcEv");}
ccc::CC12x14y8 ::~CC12x14y8(){ note_dtor("_ZN3ccc9CC12x14y8E", this);} // tgen
ccc::CC12x14y8 ::CC12x14y8(){ note_ctor("_ZN3ccc9CC12x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y8E, buf);
    ::ccc::CC12x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y8E);
    dp->::ccc::CC12x14y8::~CC12x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y8E(Test__ZN3ccc9CC12x14y8E, "_ZN3ccc9CC12x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y8C1Ev();
extern void _ZN3ccc9CC12x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y8E[] = {
  NSPAIR(_ZN3ccc9CC12x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y8E[];
extern void _ZN3ccc9CC12x14y83abcEv();
extern void _ZN3ccc9CC12x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y83efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y8E[];
Class_Descriptor cd__ZN3ccc9CC12x14y8E = {  "_ZN3ccc9CC12x14y8E", // class name
  bases__ZN3ccc9CC12x14y8E, 2,
  &(vtc__ZN3ccc9CC12x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y9  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC12x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x14y93pqrEv
  ~CC12x14y9(); // tgen
  CC12x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x14y9E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x14y93efgEv");}
void  ccc::CC12x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x14y93pqrEv");}
ccc::CC12x14y9 ::~CC12x14y9(){ note_dtor("_ZN3ccc9CC12x14y9E", this);} // tgen
ccc::CC12x14y9 ::CC12x14y9(){ note_ctor("_ZN3ccc9CC12x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC12x14y9E, buf);
    ::ccc::CC12x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC12x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x14y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC12x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x14y9E);
    dp->::ccc::CC12x14y9::~CC12x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x14y9E(Test__ZN3ccc9CC12x14y9E, "_ZN3ccc9CC12x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC12x14y9C1Ev();
extern void _ZN3ccc9CC12x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x14y9E[] = {
  NSPAIR(_ZN3ccc9CC12x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC12x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x14y93efgEv();
extern void _ZN3ccc9CC12x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC12x14y93pqrEv,_ZThn4_N3ccc9CC12x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC12x14y93pqrEv,_ZThn4_N3ccc9CC12x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x14y9E[];
Class_Descriptor cd__ZN3ccc9CC12x14y9E = {  "_ZN3ccc9CC12x14y9E", // class name
  bases__ZN3ccc9CC12x14y9E, 2,
  &(vtc__ZN3ccc9CC12x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC12x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x14y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y10  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC12x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x14y103abcEv
  ~CC12x14y10(); // tgen
  CC12x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y10E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x14y103pqrEv");}
void  ccc::CC12x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x14y103abcEv");}
ccc::CC12x14y10 ::~CC12x14y10(){ note_dtor("_ZN3ccc10CC12x14y10E", this);} // tgen
ccc::CC12x14y10 ::CC12x14y10(){ note_ctor("_ZN3ccc10CC12x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y10E, buf);
    ::ccc::CC12x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y10E);
    dp->::ccc::CC12x14y10::~CC12x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y10E(Test__ZN3ccc10CC12x14y10E, "_ZN3ccc10CC12x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y10C1Ev();
extern void _ZN3ccc10CC12x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y10E[] = {
  NSPAIR(_ZN3ccc10CC12x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y10E[];
extern void _ZN3ccc10CC12x14y103abcEv();
extern void _ZN3ccc10CC12x14y103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x14y103pqrEv,_ZThn4_N3ccc10CC12x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y103pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x14y103pqrEv,_ZThn4_N3ccc10CC12x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y10E[];
Class_Descriptor cd__ZN3ccc10CC12x14y10E = {  "_ZN3ccc10CC12x14y10E", // class name
  bases__ZN3ccc10CC12x14y10E, 2,
  &(vtc__ZN3ccc10CC12x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y11  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC12x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x14y113efgEv
  ~CC12x14y11(); // tgen
  CC12x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y11E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC12x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x14y113pqrEv");}
void  ccc::CC12x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x14y113efgEv");}
ccc::CC12x14y11 ::~CC12x14y11(){ note_dtor("_ZN3ccc10CC12x14y11E", this);} // tgen
ccc::CC12x14y11 ::CC12x14y11(){ note_ctor("_ZN3ccc10CC12x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y11E, buf);
    ::ccc::CC12x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y11E);
    dp->::ccc::CC12x14y11::~CC12x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y11E(Test__ZN3ccc10CC12x14y11E, "_ZN3ccc10CC12x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y11C1Ev();
extern void _ZN3ccc10CC12x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y11E[] = {
  NSPAIR(_ZN3ccc10CC12x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x14y113pqrEv();
extern void _ZN3ccc10CC12x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x14y113pqrEv,_ZThn4_N3ccc10CC12x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x14y113pqrEv,_ZThn4_N3ccc10CC12x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y11E[];
Class_Descriptor cd__ZN3ccc10CC12x14y11E = {  "_ZN3ccc10CC12x14y11E", // class name
  bases__ZN3ccc10CC12x14y11E, 2,
  &(vtc__ZN3ccc10CC12x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y12  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC12x14y123abcEv
  ~CC12x14y12(); // tgen
  CC12x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y12E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC12x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x14y123abcEv");}
ccc::CC12x14y12 ::~CC12x14y12(){ note_dtor("_ZN3ccc10CC12x14y12E", this);} // tgen
ccc::CC12x14y12 ::CC12x14y12(){ note_ctor("_ZN3ccc10CC12x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y12E, buf);
    ::ccc::CC12x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y12E);
    dp->::ccc::CC12x14y12::~CC12x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y12E(Test__ZN3ccc10CC12x14y12E, "_ZN3ccc10CC12x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y12C1Ev();
extern void _ZN3ccc10CC12x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y12E[] = {
  NSPAIR(_ZN3ccc10CC12x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y12E[];
extern void _ZN3ccc10CC12x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y12E[];
Class_Descriptor cd__ZN3ccc10CC12x14y12E = {  "_ZN3ccc10CC12x14y12E", // class name
  bases__ZN3ccc10CC12x14y12E, 2,
  &(vtc__ZN3ccc10CC12x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y12E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y13  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC12x14y133efgEv
  ~CC12x14y13(); // tgen
  CC12x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y13E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC12x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x14y133efgEv");}
ccc::CC12x14y13 ::~CC12x14y13(){ note_dtor("_ZN3ccc10CC12x14y13E", this);} // tgen
ccc::CC12x14y13 ::CC12x14y13(){ note_ctor("_ZN3ccc10CC12x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y13E, buf);
    ::ccc::CC12x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y13E);
    dp->::ccc::CC12x14y13::~CC12x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y13E(Test__ZN3ccc10CC12x14y13E, "_ZN3ccc10CC12x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y13C1Ev();
extern void _ZN3ccc10CC12x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y13E[] = {
  NSPAIR(_ZN3ccc10CC12x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y13E[];
Class_Descriptor cd__ZN3ccc10CC12x14y13E = {  "_ZN3ccc10CC12x14y13E", // class name
  bases__ZN3ccc10CC12x14y13E, 2,
  &(vtc__ZN3ccc10CC12x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y14  : ::ccc::AA12 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC12x14y143pqrEv
  ~CC12x14y14(); // tgen
  CC12x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y14E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC12x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x14y143pqrEv");}
ccc::CC12x14y14 ::~CC12x14y14(){ note_dtor("_ZN3ccc10CC12x14y14E", this);} // tgen
ccc::CC12x14y14 ::CC12x14y14(){ note_ctor("_ZN3ccc10CC12x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y14E, buf);
    ::ccc::CC12x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y14E);
    dp->::ccc::CC12x14y14::~CC12x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y14E(Test__ZN3ccc10CC12x14y14E, "_ZN3ccc10CC12x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y14C1Ev();
extern void _ZN3ccc10CC12x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y14E[] = {
  NSPAIR(_ZN3ccc10CC12x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC12x14y143pqrEv,_ZThn4_N3ccc10CC12x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC12x14y143pqrEv,_ZThn4_N3ccc10CC12x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y14E[];
Class_Descriptor cd__ZN3ccc10CC12x14y14E = {  "_ZN3ccc10CC12x14y14E", // class name
  bases__ZN3ccc10CC12x14y14E, 2,
  &(vtc__ZN3ccc10CC12x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x14y15  : ::ccc::AA12 , ::ccc::BB14 {
  ~CC12x14y15(); // tgen
  CC12x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x14y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC12x14y15 ::~CC12x14y15(){ note_dtor("_ZN3ccc10CC12x14y15E", this);} // tgen
ccc::CC12x14y15 ::CC12x14y15(){ note_ctor("_ZN3ccc10CC12x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC12x14y15E, buf);
    ::ccc::CC12x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC12x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x14y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC12x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x14y15E);
    dp->::ccc::CC12x14y15::~CC12x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x14y15E(Test__ZN3ccc10CC12x14y15E, "_ZN3ccc10CC12x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC12x14y15C1Ev();
extern void _ZN3ccc10CC12x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x14y15E[] = {
  NSPAIR(_ZN3ccc10CC12x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC12x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y15E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x14y15E[];
Class_Descriptor cd__ZN3ccc10CC12x14y15E = {  "_ZN3ccc10CC12x14y15E", // class name
  bases__ZN3ccc10CC12x14y15E, 2,
  &(vtc__ZN3ccc10CC12x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC12x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x14y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y0  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC12x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC12x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y03pqrEv
  ~CC12x15y0(); // tgen
  CC12x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y0E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y03abcEv");}
void  ccc::CC12x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y03efgEv");}
void  ccc::CC12x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y03pqrEv");}
ccc::CC12x15y0 ::~CC12x15y0(){ note_dtor("_ZN3ccc9CC12x15y0E", this);} // tgen
ccc::CC12x15y0 ::CC12x15y0(){ note_ctor("_ZN3ccc9CC12x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y0E, buf);
    ::ccc::CC12x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y0E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y0E);
    dp->::ccc::CC12x15y0::~CC12x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y0E(Test__ZN3ccc9CC12x15y0E, "_ZN3ccc9CC12x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y0C1Ev();
extern void _ZN3ccc9CC12x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y0E[] = {
  NSPAIR(_ZN3ccc9CC12x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y0E[];
extern void _ZN3ccc9CC12x15y03abcEv();
extern void _ZN3ccc9CC12x15y03efgEv();
extern void _ZN3ccc9CC12x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y0E[];
Class_Descriptor cd__ZN3ccc9CC12x15y0E = {  "_ZN3ccc9CC12x15y0E", // class name
  bases__ZN3ccc9CC12x15y0E, 2,
  &(vtc__ZN3ccc9CC12x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y1  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC12x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x15y13efgEv
  ~CC12x15y1(); // tgen
  CC12x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y1E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y13abcEv");}
void  ccc::CC12x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y13pqrEv");}
void  ccc::CC12x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y13efgEv");}
ccc::CC12x15y1 ::~CC12x15y1(){ note_dtor("_ZN3ccc9CC12x15y1E", this);} // tgen
ccc::CC12x15y1 ::CC12x15y1(){ note_ctor("_ZN3ccc9CC12x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y1E, buf);
    ::ccc::CC12x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y1E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y1E);
    dp->::ccc::CC12x15y1::~CC12x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y1E(Test__ZN3ccc9CC12x15y1E, "_ZN3ccc9CC12x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y1C1Ev();
extern void _ZN3ccc9CC12x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y1E[] = {
  NSPAIR(_ZN3ccc9CC12x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y1E[];
extern void _ZN3ccc9CC12x15y13abcEv();
extern void _ZN3ccc9CC12x15y13pqrEv();
extern void _ZN3ccc9CC12x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y1E[];
Class_Descriptor cd__ZN3ccc9CC12x15y1E = {  "_ZN3ccc9CC12x15y1E", // class name
  bases__ZN3ccc9CC12x15y1E, 2,
  &(vtc__ZN3ccc9CC12x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y2  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC12x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC12x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y23pqrEv
  ~CC12x15y2(); // tgen
  CC12x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y2E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y23efgEv");}
void  ccc::CC12x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y23abcEv");}
void  ccc::CC12x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y23pqrEv");}
ccc::CC12x15y2 ::~CC12x15y2(){ note_dtor("_ZN3ccc9CC12x15y2E", this);} // tgen
ccc::CC12x15y2 ::CC12x15y2(){ note_ctor("_ZN3ccc9CC12x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y2E, buf);
    ::ccc::CC12x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y2E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y2E);
    dp->::ccc::CC12x15y2::~CC12x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y2E(Test__ZN3ccc9CC12x15y2E, "_ZN3ccc9CC12x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y2C1Ev();
extern void _ZN3ccc9CC12x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y2E[] = {
  NSPAIR(_ZN3ccc9CC12x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y2E[];
extern void _ZN3ccc9CC12x15y23abcEv();
extern void _ZN3ccc9CC12x15y23efgEv();
extern void _ZN3ccc9CC12x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y2E[];
Class_Descriptor cd__ZN3ccc9CC12x15y2E = {  "_ZN3ccc9CC12x15y2E", // class name
  bases__ZN3ccc9CC12x15y2E, 2,
  &(vtc__ZN3ccc9CC12x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y3  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC12x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x15y33abcEv
  ~CC12x15y3(); // tgen
  CC12x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y3E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y33efgEv");}
void  ccc::CC12x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y33pqrEv");}
void  ccc::CC12x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y33abcEv");}
ccc::CC12x15y3 ::~CC12x15y3(){ note_dtor("_ZN3ccc9CC12x15y3E", this);} // tgen
ccc::CC12x15y3 ::CC12x15y3(){ note_ctor("_ZN3ccc9CC12x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y3E, buf);
    ::ccc::CC12x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y3E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y3E);
    dp->::ccc::CC12x15y3::~CC12x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y3E(Test__ZN3ccc9CC12x15y3E, "_ZN3ccc9CC12x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y3C1Ev();
extern void _ZN3ccc9CC12x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y3E[] = {
  NSPAIR(_ZN3ccc9CC12x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y3E[];
extern void _ZN3ccc9CC12x15y33abcEv();
extern void _ZN3ccc9CC12x15y33efgEv();
extern void _ZN3ccc9CC12x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y3E[];
Class_Descriptor cd__ZN3ccc9CC12x15y3E = {  "_ZN3ccc9CC12x15y3E", // class name
  bases__ZN3ccc9CC12x15y3E, 2,
  &(vtc__ZN3ccc9CC12x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y4  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC12x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC12x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC12x15y43efgEv
  ~CC12x15y4(); // tgen
  CC12x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y4E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y43pqrEv");}
void  ccc::CC12x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y43abcEv");}
void  ccc::CC12x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y43efgEv");}
ccc::CC12x15y4 ::~CC12x15y4(){ note_dtor("_ZN3ccc9CC12x15y4E", this);} // tgen
ccc::CC12x15y4 ::CC12x15y4(){ note_ctor("_ZN3ccc9CC12x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y4E, buf);
    ::ccc::CC12x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y4E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y4E);
    dp->::ccc::CC12x15y4::~CC12x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y4E(Test__ZN3ccc9CC12x15y4E, "_ZN3ccc9CC12x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y4C1Ev();
extern void _ZN3ccc9CC12x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y4E[] = {
  NSPAIR(_ZN3ccc9CC12x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y4E[];
extern void _ZN3ccc9CC12x15y43abcEv();
extern void _ZN3ccc9CC12x15y43pqrEv();
extern void _ZN3ccc9CC12x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y4E[];
Class_Descriptor cd__ZN3ccc9CC12x15y4E = {  "_ZN3ccc9CC12x15y4E", // class name
  bases__ZN3ccc9CC12x15y4E, 2,
  &(vtc__ZN3ccc9CC12x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y5  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC12x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC12x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC12x15y53abcEv
  ~CC12x15y5(); // tgen
  CC12x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y5E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC12x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y53pqrEv");}
void  ccc::CC12x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y53efgEv");}
void  ccc::CC12x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y53abcEv");}
ccc::CC12x15y5 ::~CC12x15y5(){ note_dtor("_ZN3ccc9CC12x15y5E", this);} // tgen
ccc::CC12x15y5 ::CC12x15y5(){ note_ctor("_ZN3ccc9CC12x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y5E, buf);
    ::ccc::CC12x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y5E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y5E);
    dp->::ccc::CC12x15y5::~CC12x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y5E(Test__ZN3ccc9CC12x15y5E, "_ZN3ccc9CC12x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y5C1Ev();
extern void _ZN3ccc9CC12x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y5E[] = {
  NSPAIR(_ZN3ccc9CC12x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y5E[];
extern void _ZN3ccc9CC12x15y53abcEv();
extern void _ZN3ccc9CC12x15y53pqrEv();
extern void _ZN3ccc9CC12x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y5E[];
Class_Descriptor cd__ZN3ccc9CC12x15y5E = {  "_ZN3ccc9CC12x15y5E", // class name
  bases__ZN3ccc9CC12x15y5E, 2,
  &(vtc__ZN3ccc9CC12x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y6  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC12x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC12x15y63efgEv
  ~CC12x15y6(); // tgen
  CC12x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y6E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y63abcEv");}
void  ccc::CC12x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y63efgEv");}
ccc::CC12x15y6 ::~CC12x15y6(){ note_dtor("_ZN3ccc9CC12x15y6E", this);} // tgen
ccc::CC12x15y6 ::CC12x15y6(){ note_ctor("_ZN3ccc9CC12x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y6E, buf);
    ::ccc::CC12x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y6E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y6E);
    dp->::ccc::CC12x15y6::~CC12x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y6E(Test__ZN3ccc9CC12x15y6E, "_ZN3ccc9CC12x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y6C1Ev();
extern void _ZN3ccc9CC12x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y6E[] = {
  NSPAIR(_ZN3ccc9CC12x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y6E[];
extern void _ZN3ccc9CC12x15y63abcEv();
extern void _ZN3ccc9CC12x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y6E[];
Class_Descriptor cd__ZN3ccc9CC12x15y6E = {  "_ZN3ccc9CC12x15y6E", // class name
  bases__ZN3ccc9CC12x15y6E, 2,
  &(vtc__ZN3ccc9CC12x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y7  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC12x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y73pqrEv
  ~CC12x15y7(); // tgen
  CC12x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y7E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y73abcEv");}
void  ccc::CC12x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y73pqrEv");}
ccc::CC12x15y7 ::~CC12x15y7(){ note_dtor("_ZN3ccc9CC12x15y7E", this);} // tgen
ccc::CC12x15y7 ::CC12x15y7(){ note_ctor("_ZN3ccc9CC12x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y7E, buf);
    ::ccc::CC12x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y7E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y7E);
    dp->::ccc::CC12x15y7::~CC12x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y7E(Test__ZN3ccc9CC12x15y7E, "_ZN3ccc9CC12x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y7C1Ev();
extern void _ZN3ccc9CC12x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y7E[] = {
  NSPAIR(_ZN3ccc9CC12x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y7E[];
extern void _ZN3ccc9CC12x15y73abcEv();
extern void _ZN3ccc9CC12x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y7E[];
Class_Descriptor cd__ZN3ccc9CC12x15y7E = {  "_ZN3ccc9CC12x15y7E", // class name
  bases__ZN3ccc9CC12x15y7E, 2,
  &(vtc__ZN3ccc9CC12x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y8  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC12x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC12x15y83abcEv
  ~CC12x15y8(); // tgen
  CC12x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y8E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y83efgEv");}
void  ccc::CC12x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC12x15y83abcEv");}
ccc::CC12x15y8 ::~CC12x15y8(){ note_dtor("_ZN3ccc9CC12x15y8E", this);} // tgen
ccc::CC12x15y8 ::CC12x15y8(){ note_ctor("_ZN3ccc9CC12x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y8E, buf);
    ::ccc::CC12x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y8E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y8E);
    dp->::ccc::CC12x15y8::~CC12x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y8E(Test__ZN3ccc9CC12x15y8E, "_ZN3ccc9CC12x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y8C1Ev();
extern void _ZN3ccc9CC12x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y8E[] = {
  NSPAIR(_ZN3ccc9CC12x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y8E[];
extern void _ZN3ccc9CC12x15y83abcEv();
extern void _ZN3ccc9CC12x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y8E[];
Class_Descriptor cd__ZN3ccc9CC12x15y8E = {  "_ZN3ccc9CC12x15y8E", // class name
  bases__ZN3ccc9CC12x15y8E, 2,
  &(vtc__ZN3ccc9CC12x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y9  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC12x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC12x15y93pqrEv
  ~CC12x15y9(); // tgen
  CC12x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC12x15y9E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC12x15y93efgEv");}
void  ccc::CC12x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC12x15y93pqrEv");}
ccc::CC12x15y9 ::~CC12x15y9(){ note_dtor("_ZN3ccc9CC12x15y9E", this);} // tgen
ccc::CC12x15y9 ::CC12x15y9(){ note_ctor("_ZN3ccc9CC12x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC12x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC12x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC12x15y9E, buf);
    ::ccc::CC12x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC12x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC12x15y9E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc9CC12x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC12x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC12x15y9E);
    dp->::ccc::CC12x15y9::~CC12x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC12x15y9E(Test__ZN3ccc9CC12x15y9E, "_ZN3ccc9CC12x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC12x15y9C1Ev();
extern void _ZN3ccc9CC12x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC12x15y9E[] = {
  NSPAIR(_ZN3ccc9CC12x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC12x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC12x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y9E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc9CC12x15y93efgEv();
extern void _ZN3ccc9CC12x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC12x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC12x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC12x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC12x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC12x15y9E[];
Class_Descriptor cd__ZN3ccc9CC12x15y9E = {  "_ZN3ccc9CC12x15y9E", // class name
  bases__ZN3ccc9CC12x15y9E, 2,
  &(vtc__ZN3ccc9CC12x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC12x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC12x15y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y10  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC12x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC12x15y103abcEv
  ~CC12x15y10(); // tgen
  CC12x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y10E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x15y103pqrEv");}
void  ccc::CC12x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x15y103abcEv");}
ccc::CC12x15y10 ::~CC12x15y10(){ note_dtor("_ZN3ccc10CC12x15y10E", this);} // tgen
ccc::CC12x15y10 ::CC12x15y10(){ note_ctor("_ZN3ccc10CC12x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y10E, buf);
    ::ccc::CC12x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y10E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y10E);
    dp->::ccc::CC12x15y10::~CC12x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y10E(Test__ZN3ccc10CC12x15y10E, "_ZN3ccc10CC12x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y10C1Ev();
extern void _ZN3ccc10CC12x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y10E[] = {
  NSPAIR(_ZN3ccc10CC12x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y10E[];
extern void _ZN3ccc10CC12x15y103abcEv();
extern void _ZN3ccc10CC12x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y10E[];
Class_Descriptor cd__ZN3ccc10CC12x15y10E = {  "_ZN3ccc10CC12x15y10E", // class name
  bases__ZN3ccc10CC12x15y10E, 2,
  &(vtc__ZN3ccc10CC12x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y11  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC12x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC12x15y113efgEv
  ~CC12x15y11(); // tgen
  CC12x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y11E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC12x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x15y113pqrEv");}
void  ccc::CC12x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x15y113efgEv");}
ccc::CC12x15y11 ::~CC12x15y11(){ note_dtor("_ZN3ccc10CC12x15y11E", this);} // tgen
ccc::CC12x15y11 ::CC12x15y11(){ note_ctor("_ZN3ccc10CC12x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y11E, buf);
    ::ccc::CC12x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y11E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y11E);
    dp->::ccc::CC12x15y11::~CC12x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y11E(Test__ZN3ccc10CC12x15y11E, "_ZN3ccc10CC12x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y11C1Ev();
extern void _ZN3ccc10CC12x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y11E[] = {
  NSPAIR(_ZN3ccc10CC12x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y11E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x15y113pqrEv();
extern void _ZN3ccc10CC12x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y11E[];
Class_Descriptor cd__ZN3ccc10CC12x15y11E = {  "_ZN3ccc10CC12x15y11E", // class name
  bases__ZN3ccc10CC12x15y11E, 2,
  &(vtc__ZN3ccc10CC12x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y12  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC12x15y123abcEv
  ~CC12x15y12(); // tgen
  CC12x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y12E) C1{ BC2{ v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC12x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC12x15y123abcEv");}
ccc::CC12x15y12 ::~CC12x15y12(){ note_dtor("_ZN3ccc10CC12x15y12E", this);} // tgen
ccc::CC12x15y12 ::CC12x15y12(){ note_ctor("_ZN3ccc10CC12x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y12E, buf);
    ::ccc::CC12x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y12E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y12E);
    dp->::ccc::CC12x15y12::~CC12x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y12E(Test__ZN3ccc10CC12x15y12E, "_ZN3ccc10CC12x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y12C1Ev();
extern void _ZN3ccc10CC12x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y12E[] = {
  NSPAIR(_ZN3ccc10CC12x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y12E[];
extern void _ZN3ccc10CC12x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y12E[];
Class_Descriptor cd__ZN3ccc10CC12x15y12E = {  "_ZN3ccc10CC12x15y12E", // class name
  bases__ZN3ccc10CC12x15y12E, 2,
  &(vtc__ZN3ccc10CC12x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y12E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y13  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC12x15y133efgEv
  ~CC12x15y13(); // tgen
  CC12x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y13E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC12x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC12x15y133efgEv");}
ccc::CC12x15y13 ::~CC12x15y13(){ note_dtor("_ZN3ccc10CC12x15y13E", this);} // tgen
ccc::CC12x15y13 ::CC12x15y13(){ note_ctor("_ZN3ccc10CC12x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y13E, buf);
    ::ccc::CC12x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y13E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y13E);
    dp->::ccc::CC12x15y13::~CC12x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y13E(Test__ZN3ccc10CC12x15y13E, "_ZN3ccc10CC12x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y13C1Ev();
extern void _ZN3ccc10CC12x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y13E[] = {
  NSPAIR(_ZN3ccc10CC12x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y13E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y13E[];
Class_Descriptor cd__ZN3ccc10CC12x15y13E = {  "_ZN3ccc10CC12x15y13E", // class name
  bases__ZN3ccc10CC12x15y13E, 2,
  &(vtc__ZN3ccc10CC12x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y14  : ::ccc::AA12 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC12x15y143pqrEv
  ~CC12x15y14(); // tgen
  CC12x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y14E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC12x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC12x15y143pqrEv");}
ccc::CC12x15y14 ::~CC12x15y14(){ note_dtor("_ZN3ccc10CC12x15y14E", this);} // tgen
ccc::CC12x15y14 ::CC12x15y14(){ note_ctor("_ZN3ccc10CC12x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y14E, buf);
    ::ccc::CC12x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y14E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y14E);
    dp->::ccc::CC12x15y14::~CC12x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y14E(Test__ZN3ccc10CC12x15y14E, "_ZN3ccc10CC12x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y14C1Ev();
extern void _ZN3ccc10CC12x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y14E[] = {
  NSPAIR(_ZN3ccc10CC12x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y14E[];
extern void _ZN3ccc4AA123abcEv();
extern void _ZN3ccc10CC12x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC12x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y14E[];
Class_Descriptor cd__ZN3ccc10CC12x15y14E = {  "_ZN3ccc10CC12x15y14E", // class name
  bases__ZN3ccc10CC12x15y14E, 2,
  &(vtc__ZN3ccc10CC12x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC12x15y15  : ::ccc::AA12 , ::ccc::BB15 {
  ~CC12x15y15(); // tgen
  CC12x15y15(); // tgen
};
//SIG(1 _ZN3ccc10CC12x15y15E) C1{ BC2{ v1} BC3{}}
}
namespace ccc { 
ccc::CC12x15y15 ::~CC12x15y15(){ note_dtor("_ZN3ccc10CC12x15y15E", this);} // tgen
ccc::CC12x15y15 ::CC12x15y15(){ note_ctor("_ZN3ccc10CC12x15y15E", this);} // tgen
}
static void Test__ZN3ccc10CC12x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC12x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC12x15y15E, buf);
    ::ccc::CC12x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC12x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC12x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC12x15y15E)");
    check_base_class_offset(lv, (::ccc::AA12*), 0, "_ZN3ccc10CC12x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC12x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC12x15y15E);
    dp->::ccc::CC12x15y15::~CC12x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC12x15y15E(Test__ZN3ccc10CC12x15y15E, "_ZN3ccc10CC12x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC12x15y15C1Ev();
extern void _ZN3ccc10CC12x15y15D1Ev();
Name_Map name_map__ZN3ccc10CC12x15y15E[] = {
  NSPAIR(_ZN3ccc10CC12x15y15C1Ev),
  NSPAIR(_ZN3ccc10CC12x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA12E;
extern VTBL_ENTRY _ZTIN3ccc4AA12E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA12E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC12x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y15E[];
extern void _ZN3ccc4AA123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC12x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC12x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC12x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC12x15y15E[];
Class_Descriptor cd__ZN3ccc10CC12x15y15E = {  "_ZN3ccc10CC12x15y15E", // class name
  bases__ZN3ccc10CC12x15y15E, 2,
  &(vtc__ZN3ccc10CC12x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC12x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC12x15y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y0  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC13x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y03pqrEv
  ~CC13x0y0(); // tgen
  CC13x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y0E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y03abcEv");}
void  ccc::CC13x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y03efgEv");}
void  ccc::CC13x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y03pqrEv");}
ccc::CC13x0y0 ::~CC13x0y0(){ note_dtor("_ZN3ccc8CC13x0y0E", this);} // tgen
ccc::CC13x0y0 ::CC13x0y0(){ note_ctor("_ZN3ccc8CC13x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y0E, buf);
    ::ccc::CC13x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y0E);
    dp->::ccc::CC13x0y0::~CC13x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y0E(Test__ZN3ccc8CC13x0y0E, "_ZN3ccc8CC13x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y0C1Ev();
extern void _ZN3ccc8CC13x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y0E[] = {
  NSPAIR(_ZN3ccc8CC13x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y0E[];
extern void _ZN3ccc8CC13x0y03efgEv();
extern void _ZN3ccc8CC13x0y03abcEv();
extern void _ZN3ccc8CC13x0y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y03abcEv,_ZThn4_N3ccc8CC13x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y03efgEv,_ZThn4_N3ccc8CC13x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y03pqrEv,_ZThn4_N3ccc8CC13x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y03abcEv,_ZThn4_N3ccc8CC13x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y03efgEv,_ZThn4_N3ccc8CC13x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y03pqrEv,_ZThn4_N3ccc8CC13x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y0E[];
Class_Descriptor cd__ZN3ccc8CC13x0y0E = {  "_ZN3ccc8CC13x0y0E", // class name
  bases__ZN3ccc8CC13x0y0E, 2,
  &(vtc__ZN3ccc8CC13x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y1  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC13x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x0y13efgEv
  ~CC13x0y1(); // tgen
  CC13x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y1E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y13abcEv");}
void  ccc::CC13x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y13pqrEv");}
void  ccc::CC13x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y13efgEv");}
ccc::CC13x0y1 ::~CC13x0y1(){ note_dtor("_ZN3ccc8CC13x0y1E", this);} // tgen
ccc::CC13x0y1 ::CC13x0y1(){ note_ctor("_ZN3ccc8CC13x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y1E, buf);
    ::ccc::CC13x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y1E);
    dp->::ccc::CC13x0y1::~CC13x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y1E(Test__ZN3ccc8CC13x0y1E, "_ZN3ccc8CC13x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y1C1Ev();
extern void _ZN3ccc8CC13x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y1E[] = {
  NSPAIR(_ZN3ccc8CC13x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y1E[];
extern void _ZN3ccc8CC13x0y13efgEv();
extern void _ZN3ccc8CC13x0y13abcEv();
extern void _ZN3ccc8CC13x0y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y13abcEv,_ZThn4_N3ccc8CC13x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y13efgEv,_ZThn4_N3ccc8CC13x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y13pqrEv,_ZThn4_N3ccc8CC13x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y13abcEv,_ZThn4_N3ccc8CC13x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y13efgEv,_ZThn4_N3ccc8CC13x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y13pqrEv,_ZThn4_N3ccc8CC13x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y1E[];
Class_Descriptor cd__ZN3ccc8CC13x0y1E = {  "_ZN3ccc8CC13x0y1E", // class name
  bases__ZN3ccc8CC13x0y1E, 2,
  &(vtc__ZN3ccc8CC13x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y2  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC13x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y23pqrEv
  ~CC13x0y2(); // tgen
  CC13x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y2E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y23efgEv");}
void  ccc::CC13x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y23abcEv");}
void  ccc::CC13x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y23pqrEv");}
ccc::CC13x0y2 ::~CC13x0y2(){ note_dtor("_ZN3ccc8CC13x0y2E", this);} // tgen
ccc::CC13x0y2 ::CC13x0y2(){ note_ctor("_ZN3ccc8CC13x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y2E, buf);
    ::ccc::CC13x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y2E);
    dp->::ccc::CC13x0y2::~CC13x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y2E(Test__ZN3ccc8CC13x0y2E, "_ZN3ccc8CC13x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y2C1Ev();
extern void _ZN3ccc8CC13x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y2E[] = {
  NSPAIR(_ZN3ccc8CC13x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y2E[];
extern void _ZN3ccc8CC13x0y23efgEv();
extern void _ZN3ccc8CC13x0y23abcEv();
extern void _ZN3ccc8CC13x0y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y23abcEv,_ZThn4_N3ccc8CC13x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y23efgEv,_ZThn4_N3ccc8CC13x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y23pqrEv,_ZThn4_N3ccc8CC13x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y23abcEv,_ZThn4_N3ccc8CC13x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y23efgEv,_ZThn4_N3ccc8CC13x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y23pqrEv,_ZThn4_N3ccc8CC13x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y2E[];
Class_Descriptor cd__ZN3ccc8CC13x0y2E = {  "_ZN3ccc8CC13x0y2E", // class name
  bases__ZN3ccc8CC13x0y2E, 2,
  &(vtc__ZN3ccc8CC13x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y3  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC13x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x0y33abcEv
  ~CC13x0y3(); // tgen
  CC13x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y3E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y33efgEv");}
void  ccc::CC13x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y33pqrEv");}
void  ccc::CC13x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y33abcEv");}
ccc::CC13x0y3 ::~CC13x0y3(){ note_dtor("_ZN3ccc8CC13x0y3E", this);} // tgen
ccc::CC13x0y3 ::CC13x0y3(){ note_ctor("_ZN3ccc8CC13x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y3E, buf);
    ::ccc::CC13x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y3E);
    dp->::ccc::CC13x0y3::~CC13x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y3E(Test__ZN3ccc8CC13x0y3E, "_ZN3ccc8CC13x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y3C1Ev();
extern void _ZN3ccc8CC13x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y3E[] = {
  NSPAIR(_ZN3ccc8CC13x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y3E[];
extern void _ZN3ccc8CC13x0y33efgEv();
extern void _ZN3ccc8CC13x0y33pqrEv();
extern void _ZN3ccc8CC13x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y33abcEv,_ZThn4_N3ccc8CC13x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y33efgEv,_ZThn4_N3ccc8CC13x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y33pqrEv,_ZThn4_N3ccc8CC13x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y33abcEv,_ZThn4_N3ccc8CC13x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y33efgEv,_ZThn4_N3ccc8CC13x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y33pqrEv,_ZThn4_N3ccc8CC13x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y3E[];
Class_Descriptor cd__ZN3ccc8CC13x0y3E = {  "_ZN3ccc8CC13x0y3E", // class name
  bases__ZN3ccc8CC13x0y3E, 2,
  &(vtc__ZN3ccc8CC13x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y4  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC13x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x0y43efgEv
  ~CC13x0y4(); // tgen
  CC13x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y4E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y43pqrEv");}
void  ccc::CC13x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y43abcEv");}
void  ccc::CC13x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y43efgEv");}
ccc::CC13x0y4 ::~CC13x0y4(){ note_dtor("_ZN3ccc8CC13x0y4E", this);} // tgen
ccc::CC13x0y4 ::CC13x0y4(){ note_ctor("_ZN3ccc8CC13x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y4E, buf);
    ::ccc::CC13x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y4E);
    dp->::ccc::CC13x0y4::~CC13x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y4E(Test__ZN3ccc8CC13x0y4E, "_ZN3ccc8CC13x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y4C1Ev();
extern void _ZN3ccc8CC13x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y4E[] = {
  NSPAIR(_ZN3ccc8CC13x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y4E[];
extern void _ZN3ccc8CC13x0y43efgEv();
extern void _ZN3ccc8CC13x0y43pqrEv();
extern void _ZN3ccc8CC13x0y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y43abcEv,_ZThn4_N3ccc8CC13x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y43efgEv,_ZThn4_N3ccc8CC13x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y43pqrEv,_ZThn4_N3ccc8CC13x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y43abcEv,_ZThn4_N3ccc8CC13x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y43efgEv,_ZThn4_N3ccc8CC13x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y43pqrEv,_ZThn4_N3ccc8CC13x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y4E[];
Class_Descriptor cd__ZN3ccc8CC13x0y4E = {  "_ZN3ccc8CC13x0y4E", // class name
  bases__ZN3ccc8CC13x0y4E, 2,
  &(vtc__ZN3ccc8CC13x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y5  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC13x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x0y53abcEv
  ~CC13x0y5(); // tgen
  CC13x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y5E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y53pqrEv");}
void  ccc::CC13x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y53efgEv");}
void  ccc::CC13x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y53abcEv");}
ccc::CC13x0y5 ::~CC13x0y5(){ note_dtor("_ZN3ccc8CC13x0y5E", this);} // tgen
ccc::CC13x0y5 ::CC13x0y5(){ note_ctor("_ZN3ccc8CC13x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y5E, buf);
    ::ccc::CC13x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y5E);
    dp->::ccc::CC13x0y5::~CC13x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y5E(Test__ZN3ccc8CC13x0y5E, "_ZN3ccc8CC13x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y5C1Ev();
extern void _ZN3ccc8CC13x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y5E[] = {
  NSPAIR(_ZN3ccc8CC13x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y5E[];
extern void _ZN3ccc8CC13x0y53efgEv();
extern void _ZN3ccc8CC13x0y53pqrEv();
extern void _ZN3ccc8CC13x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y53abcEv,_ZThn4_N3ccc8CC13x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y53efgEv,_ZThn4_N3ccc8CC13x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y53pqrEv,_ZThn4_N3ccc8CC13x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y53abcEv,_ZThn4_N3ccc8CC13x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y53efgEv,_ZThn4_N3ccc8CC13x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y53pqrEv,_ZThn4_N3ccc8CC13x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y5E[];
Class_Descriptor cd__ZN3ccc8CC13x0y5E = {  "_ZN3ccc8CC13x0y5E", // class name
  bases__ZN3ccc8CC13x0y5E, 2,
  &(vtc__ZN3ccc8CC13x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y6  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC13x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x0y63efgEv
  ~CC13x0y6(); // tgen
  CC13x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y6E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y63abcEv");}
void  ccc::CC13x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y63efgEv");}
ccc::CC13x0y6 ::~CC13x0y6(){ note_dtor("_ZN3ccc8CC13x0y6E", this);} // tgen
ccc::CC13x0y6 ::CC13x0y6(){ note_ctor("_ZN3ccc8CC13x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y6E, buf);
    ::ccc::CC13x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y6E);
    dp->::ccc::CC13x0y6::~CC13x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y6E(Test__ZN3ccc8CC13x0y6E, "_ZN3ccc8CC13x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y6C1Ev();
extern void _ZN3ccc8CC13x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y6E[] = {
  NSPAIR(_ZN3ccc8CC13x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y6E[];
extern void _ZN3ccc8CC13x0y63efgEv();
extern void _ZN3ccc8CC13x0y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y63abcEv,_ZThn4_N3ccc8CC13x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y63efgEv,_ZThn4_N3ccc8CC13x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y63abcEv,_ZThn4_N3ccc8CC13x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y63efgEv,_ZThn4_N3ccc8CC13x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y6E[];
Class_Descriptor cd__ZN3ccc8CC13x0y6E = {  "_ZN3ccc8CC13x0y6E", // class name
  bases__ZN3ccc8CC13x0y6E, 2,
  &(vtc__ZN3ccc8CC13x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y7  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC13x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y73pqrEv
  ~CC13x0y7(); // tgen
  CC13x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y7E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y73abcEv");}
void  ccc::CC13x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y73pqrEv");}
ccc::CC13x0y7 ::~CC13x0y7(){ note_dtor("_ZN3ccc8CC13x0y7E", this);} // tgen
ccc::CC13x0y7 ::CC13x0y7(){ note_ctor("_ZN3ccc8CC13x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y7E, buf);
    ::ccc::CC13x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y7E);
    dp->::ccc::CC13x0y7::~CC13x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y7E(Test__ZN3ccc8CC13x0y7E, "_ZN3ccc8CC13x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y7C1Ev();
extern void _ZN3ccc8CC13x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y7E[] = {
  NSPAIR(_ZN3ccc8CC13x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x0y73abcEv();
extern void _ZN3ccc8CC13x0y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y73abcEv,_ZThn4_N3ccc8CC13x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y73pqrEv,_ZThn4_N3ccc8CC13x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y73abcEv,_ZThn4_N3ccc8CC13x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y73pqrEv,_ZThn4_N3ccc8CC13x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y7E[];
Class_Descriptor cd__ZN3ccc8CC13x0y7E = {  "_ZN3ccc8CC13x0y7E", // class name
  bases__ZN3ccc8CC13x0y7E, 2,
  &(vtc__ZN3ccc8CC13x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y8  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC13x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x0y83abcEv
  ~CC13x0y8(); // tgen
  CC13x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y8E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y83efgEv");}
void  ccc::CC13x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x0y83abcEv");}
ccc::CC13x0y8 ::~CC13x0y8(){ note_dtor("_ZN3ccc8CC13x0y8E", this);} // tgen
ccc::CC13x0y8 ::CC13x0y8(){ note_ctor("_ZN3ccc8CC13x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y8E, buf);
    ::ccc::CC13x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y8E);
    dp->::ccc::CC13x0y8::~CC13x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y8E(Test__ZN3ccc8CC13x0y8E, "_ZN3ccc8CC13x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y8C1Ev();
extern void _ZN3ccc8CC13x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y8E[] = {
  NSPAIR(_ZN3ccc8CC13x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y8E[];
extern void _ZN3ccc8CC13x0y83efgEv();
extern void _ZN3ccc8CC13x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y83abcEv,_ZThn4_N3ccc8CC13x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y83efgEv,_ZThn4_N3ccc8CC13x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y83abcEv,_ZThn4_N3ccc8CC13x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y83efgEv,_ZThn4_N3ccc8CC13x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y8E[];
Class_Descriptor cd__ZN3ccc8CC13x0y8E = {  "_ZN3ccc8CC13x0y8E", // class name
  bases__ZN3ccc8CC13x0y8E, 2,
  &(vtc__ZN3ccc8CC13x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y9  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC13x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x0y93pqrEv
  ~CC13x0y9(); // tgen
  CC13x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x0y9E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x0y93efgEv");}
void  ccc::CC13x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x0y93pqrEv");}
ccc::CC13x0y9 ::~CC13x0y9(){ note_dtor("_ZN3ccc8CC13x0y9E", this);} // tgen
ccc::CC13x0y9 ::CC13x0y9(){ note_ctor("_ZN3ccc8CC13x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x0y9E, buf);
    ::ccc::CC13x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x0y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC13x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x0y9E);
    dp->::ccc::CC13x0y9::~CC13x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x0y9E(Test__ZN3ccc8CC13x0y9E, "_ZN3ccc8CC13x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x0y9C1Ev();
extern void _ZN3ccc8CC13x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x0y9E[] = {
  NSPAIR(_ZN3ccc8CC13x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC13x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y9E[];
extern void _ZN3ccc8CC13x0y93efgEv();
extern void _ZN3ccc8CC13x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y93efgEv,_ZThn4_N3ccc8CC13x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x0y93pqrEv,_ZThn4_N3ccc8CC13x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x0y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y93efgEv,_ZThn4_N3ccc8CC13x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x0y93pqrEv,_ZThn4_N3ccc8CC13x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x0y9E[];
Class_Descriptor cd__ZN3ccc8CC13x0y9E = {  "_ZN3ccc8CC13x0y9E", // class name
  bases__ZN3ccc8CC13x0y9E, 2,
  &(vtc__ZN3ccc8CC13x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x0y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y10  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC13x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x0y103abcEv
  ~CC13x0y10(); // tgen
  CC13x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y10E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x0y103pqrEv");}
void  ccc::CC13x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x0y103abcEv");}
ccc::CC13x0y10 ::~CC13x0y10(){ note_dtor("_ZN3ccc9CC13x0y10E", this);} // tgen
ccc::CC13x0y10 ::CC13x0y10(){ note_ctor("_ZN3ccc9CC13x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y10E, buf);
    ::ccc::CC13x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y10E);
    dp->::ccc::CC13x0y10::~CC13x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y10E(Test__ZN3ccc9CC13x0y10E, "_ZN3ccc9CC13x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y10C1Ev();
extern void _ZN3ccc9CC13x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y10E[] = {
  NSPAIR(_ZN3ccc9CC13x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x0y103pqrEv();
extern void _ZN3ccc9CC13x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y103abcEv,_ZThn4_N3ccc9CC13x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y103pqrEv,_ZThn4_N3ccc9CC13x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y103abcEv,_ZThn4_N3ccc9CC13x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y103pqrEv,_ZThn4_N3ccc9CC13x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y10E[];
Class_Descriptor cd__ZN3ccc9CC13x0y10E = {  "_ZN3ccc9CC13x0y10E", // class name
  bases__ZN3ccc9CC13x0y10E, 2,
  &(vtc__ZN3ccc9CC13x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y11  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC13x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x0y113efgEv
  ~CC13x0y11(); // tgen
  CC13x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y11E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x0y113pqrEv");}
void  ccc::CC13x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x0y113efgEv");}
ccc::CC13x0y11 ::~CC13x0y11(){ note_dtor("_ZN3ccc9CC13x0y11E", this);} // tgen
ccc::CC13x0y11 ::CC13x0y11(){ note_ctor("_ZN3ccc9CC13x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y11E, buf);
    ::ccc::CC13x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y11E);
    dp->::ccc::CC13x0y11::~CC13x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y11E(Test__ZN3ccc9CC13x0y11E, "_ZN3ccc9CC13x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y11C1Ev();
extern void _ZN3ccc9CC13x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y11E[] = {
  NSPAIR(_ZN3ccc9CC13x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y11E[];
extern void _ZN3ccc9CC13x0y113efgEv();
extern void _ZN3ccc9CC13x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y113efgEv,_ZThn4_N3ccc9CC13x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y113pqrEv,_ZThn4_N3ccc9CC13x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y113efgEv,_ZThn4_N3ccc9CC13x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y113pqrEv,_ZThn4_N3ccc9CC13x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y11E[];
Class_Descriptor cd__ZN3ccc9CC13x0y11E = {  "_ZN3ccc9CC13x0y11E", // class name
  bases__ZN3ccc9CC13x0y11E, 2,
  &(vtc__ZN3ccc9CC13x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y12  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC13x0y123abcEv
  ~CC13x0y12(); // tgen
  CC13x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y12E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x0y123abcEv");}
ccc::CC13x0y12 ::~CC13x0y12(){ note_dtor("_ZN3ccc9CC13x0y12E", this);} // tgen
ccc::CC13x0y12 ::CC13x0y12(){ note_ctor("_ZN3ccc9CC13x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y12E, buf);
    ::ccc::CC13x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y12E);
    dp->::ccc::CC13x0y12::~CC13x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y12E(Test__ZN3ccc9CC13x0y12E, "_ZN3ccc9CC13x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y12C1Ev();
extern void _ZN3ccc9CC13x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y12E[] = {
  NSPAIR(_ZN3ccc9CC13x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y123abcEv,_ZThn4_N3ccc9CC13x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y123abcEv,_ZThn4_N3ccc9CC13x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y12E[];
Class_Descriptor cd__ZN3ccc9CC13x0y12E = {  "_ZN3ccc9CC13x0y12E", // class name
  bases__ZN3ccc9CC13x0y12E, 2,
  &(vtc__ZN3ccc9CC13x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y13  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC13x0y133efgEv
  ~CC13x0y13(); // tgen
  CC13x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y13E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x0y133efgEv");}
ccc::CC13x0y13 ::~CC13x0y13(){ note_dtor("_ZN3ccc9CC13x0y13E", this);} // tgen
ccc::CC13x0y13 ::CC13x0y13(){ note_ctor("_ZN3ccc9CC13x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y13E, buf);
    ::ccc::CC13x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y13E);
    dp->::ccc::CC13x0y13::~CC13x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y13E(Test__ZN3ccc9CC13x0y13E, "_ZN3ccc9CC13x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y13C1Ev();
extern void _ZN3ccc9CC13x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y13E[] = {
  NSPAIR(_ZN3ccc9CC13x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y13E[];
extern void _ZN3ccc9CC13x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y133efgEv,_ZThn4_N3ccc9CC13x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y133efgEv,_ZThn4_N3ccc9CC13x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y13E[];
Class_Descriptor cd__ZN3ccc9CC13x0y13E = {  "_ZN3ccc9CC13x0y13E", // class name
  bases__ZN3ccc9CC13x0y13E, 2,
  &(vtc__ZN3ccc9CC13x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y14  : ::ccc::AA13 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC13x0y143pqrEv
  ~CC13x0y14(); // tgen
  CC13x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y14E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC13x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x0y143pqrEv");}
ccc::CC13x0y14 ::~CC13x0y14(){ note_dtor("_ZN3ccc9CC13x0y14E", this);} // tgen
ccc::CC13x0y14 ::CC13x0y14(){ note_ctor("_ZN3ccc9CC13x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y14E, buf);
    ::ccc::CC13x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y14E);
    dp->::ccc::CC13x0y14::~CC13x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y14E(Test__ZN3ccc9CC13x0y14E, "_ZN3ccc9CC13x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y14C1Ev();
extern void _ZN3ccc9CC13x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y14E[] = {
  NSPAIR(_ZN3ccc9CC13x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x0y143pqrEv,_ZThn4_N3ccc9CC13x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x0y143pqrEv,_ZThn4_N3ccc9CC13x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y14E[];
Class_Descriptor cd__ZN3ccc9CC13x0y14E = {  "_ZN3ccc9CC13x0y14E", // class name
  bases__ZN3ccc9CC13x0y14E, 2,
  &(vtc__ZN3ccc9CC13x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x0y15  : ::ccc::AA13 , ::ccc::BB0 {
  ~CC13x0y15(); // tgen
  CC13x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x0y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x0y15 ::~CC13x0y15(){ note_dtor("_ZN3ccc9CC13x0y15E", this);} // tgen
ccc::CC13x0y15 ::CC13x0y15(){ note_ctor("_ZN3ccc9CC13x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x0y15E, buf);
    ::ccc::CC13x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x0y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC13x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x0y15E);
    dp->::ccc::CC13x0y15::~CC13x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x0y15E(Test__ZN3ccc9CC13x0y15E, "_ZN3ccc9CC13x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x0y15C1Ev();
extern void _ZN3ccc9CC13x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x0y15E[] = {
  NSPAIR(_ZN3ccc9CC13x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC13x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x0y15E[];
Class_Descriptor cd__ZN3ccc9CC13x0y15E = {  "_ZN3ccc9CC13x0y15E", // class name
  bases__ZN3ccc9CC13x0y15E, 2,
  &(vtc__ZN3ccc9CC13x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x0y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y0  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC13x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y03pqrEv
  ~CC13x1y0(); // tgen
  CC13x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y0E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y03abcEv");}
void  ccc::CC13x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y03efgEv");}
void  ccc::CC13x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y03pqrEv");}
ccc::CC13x1y0 ::~CC13x1y0(){ note_dtor("_ZN3ccc8CC13x1y0E", this);} // tgen
ccc::CC13x1y0 ::CC13x1y0(){ note_ctor("_ZN3ccc8CC13x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y0E, buf);
    ::ccc::CC13x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y0E);
    dp->::ccc::CC13x1y0::~CC13x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y0E(Test__ZN3ccc8CC13x1y0E, "_ZN3ccc8CC13x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y0C1Ev();
extern void _ZN3ccc8CC13x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y0E[] = {
  NSPAIR(_ZN3ccc8CC13x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y0E[];
extern void _ZN3ccc8CC13x1y03efgEv();
extern void _ZN3ccc8CC13x1y03abcEv();
extern void _ZN3ccc8CC13x1y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y03abcEv,_ZThn4_N3ccc8CC13x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y03pqrEv,_ZThn4_N3ccc8CC13x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y03efgEv,_ZThn4_N3ccc8CC13x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y03abcEv,_ZThn4_N3ccc8CC13x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y03pqrEv,_ZThn4_N3ccc8CC13x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y03efgEv,_ZThn4_N3ccc8CC13x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y0E[];
Class_Descriptor cd__ZN3ccc8CC13x1y0E = {  "_ZN3ccc8CC13x1y0E", // class name
  bases__ZN3ccc8CC13x1y0E, 2,
  &(vtc__ZN3ccc8CC13x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y1  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC13x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x1y13efgEv
  ~CC13x1y1(); // tgen
  CC13x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y1E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y13abcEv");}
void  ccc::CC13x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y13pqrEv");}
void  ccc::CC13x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y13efgEv");}
ccc::CC13x1y1 ::~CC13x1y1(){ note_dtor("_ZN3ccc8CC13x1y1E", this);} // tgen
ccc::CC13x1y1 ::CC13x1y1(){ note_ctor("_ZN3ccc8CC13x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y1E, buf);
    ::ccc::CC13x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y1E);
    dp->::ccc::CC13x1y1::~CC13x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y1E(Test__ZN3ccc8CC13x1y1E, "_ZN3ccc8CC13x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y1C1Ev();
extern void _ZN3ccc8CC13x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y1E[] = {
  NSPAIR(_ZN3ccc8CC13x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y1E[];
extern void _ZN3ccc8CC13x1y13efgEv();
extern void _ZN3ccc8CC13x1y13abcEv();
extern void _ZN3ccc8CC13x1y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y13abcEv,_ZThn4_N3ccc8CC13x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y13pqrEv,_ZThn4_N3ccc8CC13x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y13efgEv,_ZThn4_N3ccc8CC13x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y13abcEv,_ZThn4_N3ccc8CC13x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y13pqrEv,_ZThn4_N3ccc8CC13x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y13efgEv,_ZThn4_N3ccc8CC13x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y1E[];
Class_Descriptor cd__ZN3ccc8CC13x1y1E = {  "_ZN3ccc8CC13x1y1E", // class name
  bases__ZN3ccc8CC13x1y1E, 2,
  &(vtc__ZN3ccc8CC13x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y2  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC13x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y23pqrEv
  ~CC13x1y2(); // tgen
  CC13x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y2E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y23efgEv");}
void  ccc::CC13x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y23abcEv");}
void  ccc::CC13x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y23pqrEv");}
ccc::CC13x1y2 ::~CC13x1y2(){ note_dtor("_ZN3ccc8CC13x1y2E", this);} // tgen
ccc::CC13x1y2 ::CC13x1y2(){ note_ctor("_ZN3ccc8CC13x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y2E, buf);
    ::ccc::CC13x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y2E);
    dp->::ccc::CC13x1y2::~CC13x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y2E(Test__ZN3ccc8CC13x1y2E, "_ZN3ccc8CC13x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y2C1Ev();
extern void _ZN3ccc8CC13x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y2E[] = {
  NSPAIR(_ZN3ccc8CC13x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y2E[];
extern void _ZN3ccc8CC13x1y23efgEv();
extern void _ZN3ccc8CC13x1y23abcEv();
extern void _ZN3ccc8CC13x1y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y23abcEv,_ZThn4_N3ccc8CC13x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y23pqrEv,_ZThn4_N3ccc8CC13x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y23efgEv,_ZThn4_N3ccc8CC13x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y23abcEv,_ZThn4_N3ccc8CC13x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y23pqrEv,_ZThn4_N3ccc8CC13x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y23efgEv,_ZThn4_N3ccc8CC13x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y2E[];
Class_Descriptor cd__ZN3ccc8CC13x1y2E = {  "_ZN3ccc8CC13x1y2E", // class name
  bases__ZN3ccc8CC13x1y2E, 2,
  &(vtc__ZN3ccc8CC13x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y3  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC13x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x1y33abcEv
  ~CC13x1y3(); // tgen
  CC13x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y3E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y33efgEv");}
void  ccc::CC13x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y33pqrEv");}
void  ccc::CC13x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y33abcEv");}
ccc::CC13x1y3 ::~CC13x1y3(){ note_dtor("_ZN3ccc8CC13x1y3E", this);} // tgen
ccc::CC13x1y3 ::CC13x1y3(){ note_ctor("_ZN3ccc8CC13x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y3E, buf);
    ::ccc::CC13x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y3E);
    dp->::ccc::CC13x1y3::~CC13x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y3E(Test__ZN3ccc8CC13x1y3E, "_ZN3ccc8CC13x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y3C1Ev();
extern void _ZN3ccc8CC13x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y3E[] = {
  NSPAIR(_ZN3ccc8CC13x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y3E[];
extern void _ZN3ccc8CC13x1y33efgEv();
extern void _ZN3ccc8CC13x1y33pqrEv();
extern void _ZN3ccc8CC13x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y33abcEv,_ZThn4_N3ccc8CC13x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y33pqrEv,_ZThn4_N3ccc8CC13x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y33efgEv,_ZThn4_N3ccc8CC13x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y33abcEv,_ZThn4_N3ccc8CC13x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y33pqrEv,_ZThn4_N3ccc8CC13x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y33efgEv,_ZThn4_N3ccc8CC13x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y3E[];
Class_Descriptor cd__ZN3ccc8CC13x1y3E = {  "_ZN3ccc8CC13x1y3E", // class name
  bases__ZN3ccc8CC13x1y3E, 2,
  &(vtc__ZN3ccc8CC13x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y4  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC13x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x1y43efgEv
  ~CC13x1y4(); // tgen
  CC13x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y4E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y43pqrEv");}
void  ccc::CC13x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y43abcEv");}
void  ccc::CC13x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y43efgEv");}
ccc::CC13x1y4 ::~CC13x1y4(){ note_dtor("_ZN3ccc8CC13x1y4E", this);} // tgen
ccc::CC13x1y4 ::CC13x1y4(){ note_ctor("_ZN3ccc8CC13x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y4E, buf);
    ::ccc::CC13x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y4E);
    dp->::ccc::CC13x1y4::~CC13x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y4E(Test__ZN3ccc8CC13x1y4E, "_ZN3ccc8CC13x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y4C1Ev();
extern void _ZN3ccc8CC13x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y4E[] = {
  NSPAIR(_ZN3ccc8CC13x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y4E[];
extern void _ZN3ccc8CC13x1y43efgEv();
extern void _ZN3ccc8CC13x1y43pqrEv();
extern void _ZN3ccc8CC13x1y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y43abcEv,_ZThn4_N3ccc8CC13x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y43pqrEv,_ZThn4_N3ccc8CC13x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y43efgEv,_ZThn4_N3ccc8CC13x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y43abcEv,_ZThn4_N3ccc8CC13x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y43pqrEv,_ZThn4_N3ccc8CC13x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y43efgEv,_ZThn4_N3ccc8CC13x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y4E[];
Class_Descriptor cd__ZN3ccc8CC13x1y4E = {  "_ZN3ccc8CC13x1y4E", // class name
  bases__ZN3ccc8CC13x1y4E, 2,
  &(vtc__ZN3ccc8CC13x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y5  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC13x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x1y53abcEv
  ~CC13x1y5(); // tgen
  CC13x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y5E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y53pqrEv");}
void  ccc::CC13x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y53efgEv");}
void  ccc::CC13x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y53abcEv");}
ccc::CC13x1y5 ::~CC13x1y5(){ note_dtor("_ZN3ccc8CC13x1y5E", this);} // tgen
ccc::CC13x1y5 ::CC13x1y5(){ note_ctor("_ZN3ccc8CC13x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y5E, buf);
    ::ccc::CC13x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y5E);
    dp->::ccc::CC13x1y5::~CC13x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y5E(Test__ZN3ccc8CC13x1y5E, "_ZN3ccc8CC13x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y5C1Ev();
extern void _ZN3ccc8CC13x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y5E[] = {
  NSPAIR(_ZN3ccc8CC13x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y5E[];
extern void _ZN3ccc8CC13x1y53efgEv();
extern void _ZN3ccc8CC13x1y53pqrEv();
extern void _ZN3ccc8CC13x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y53abcEv,_ZThn4_N3ccc8CC13x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y53pqrEv,_ZThn4_N3ccc8CC13x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y53efgEv,_ZThn4_N3ccc8CC13x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y53abcEv,_ZThn4_N3ccc8CC13x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y53pqrEv,_ZThn4_N3ccc8CC13x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y53efgEv,_ZThn4_N3ccc8CC13x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y5E[];
Class_Descriptor cd__ZN3ccc8CC13x1y5E = {  "_ZN3ccc8CC13x1y5E", // class name
  bases__ZN3ccc8CC13x1y5E, 2,
  &(vtc__ZN3ccc8CC13x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y6  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC13x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x1y63efgEv
  ~CC13x1y6(); // tgen
  CC13x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y6E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y63abcEv");}
void  ccc::CC13x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y63efgEv");}
ccc::CC13x1y6 ::~CC13x1y6(){ note_dtor("_ZN3ccc8CC13x1y6E", this);} // tgen
ccc::CC13x1y6 ::CC13x1y6(){ note_ctor("_ZN3ccc8CC13x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y6E, buf);
    ::ccc::CC13x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y6E);
    dp->::ccc::CC13x1y6::~CC13x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y6E(Test__ZN3ccc8CC13x1y6E, "_ZN3ccc8CC13x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y6C1Ev();
extern void _ZN3ccc8CC13x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y6E[] = {
  NSPAIR(_ZN3ccc8CC13x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y6E[];
extern void _ZN3ccc8CC13x1y63efgEv();
extern void _ZN3ccc8CC13x1y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y63abcEv,_ZThn4_N3ccc8CC13x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y63efgEv,_ZThn4_N3ccc8CC13x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y63abcEv,_ZThn4_N3ccc8CC13x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y63efgEv,_ZThn4_N3ccc8CC13x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y6E[];
Class_Descriptor cd__ZN3ccc8CC13x1y6E = {  "_ZN3ccc8CC13x1y6E", // class name
  bases__ZN3ccc8CC13x1y6E, 2,
  &(vtc__ZN3ccc8CC13x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y7  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC13x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y73pqrEv
  ~CC13x1y7(); // tgen
  CC13x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y7E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y73abcEv");}
void  ccc::CC13x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y73pqrEv");}
ccc::CC13x1y7 ::~CC13x1y7(){ note_dtor("_ZN3ccc8CC13x1y7E", this);} // tgen
ccc::CC13x1y7 ::CC13x1y7(){ note_ctor("_ZN3ccc8CC13x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y7E, buf);
    ::ccc::CC13x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y7E);
    dp->::ccc::CC13x1y7::~CC13x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y7E(Test__ZN3ccc8CC13x1y7E, "_ZN3ccc8CC13x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y7C1Ev();
extern void _ZN3ccc8CC13x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y7E[] = {
  NSPAIR(_ZN3ccc8CC13x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x1y73abcEv();
extern void _ZN3ccc8CC13x1y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y73abcEv,_ZThn4_N3ccc8CC13x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y73pqrEv,_ZThn4_N3ccc8CC13x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y73abcEv,_ZThn4_N3ccc8CC13x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y73pqrEv,_ZThn4_N3ccc8CC13x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y7E[];
Class_Descriptor cd__ZN3ccc8CC13x1y7E = {  "_ZN3ccc8CC13x1y7E", // class name
  bases__ZN3ccc8CC13x1y7E, 2,
  &(vtc__ZN3ccc8CC13x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y8  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC13x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x1y83abcEv
  ~CC13x1y8(); // tgen
  CC13x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y8E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y83efgEv");}
void  ccc::CC13x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x1y83abcEv");}
ccc::CC13x1y8 ::~CC13x1y8(){ note_dtor("_ZN3ccc8CC13x1y8E", this);} // tgen
ccc::CC13x1y8 ::CC13x1y8(){ note_ctor("_ZN3ccc8CC13x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y8E, buf);
    ::ccc::CC13x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y8E);
    dp->::ccc::CC13x1y8::~CC13x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y8E(Test__ZN3ccc8CC13x1y8E, "_ZN3ccc8CC13x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y8C1Ev();
extern void _ZN3ccc8CC13x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y8E[] = {
  NSPAIR(_ZN3ccc8CC13x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y8E[];
extern void _ZN3ccc8CC13x1y83efgEv();
extern void _ZN3ccc8CC13x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y83abcEv,_ZThn4_N3ccc8CC13x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y83efgEv,_ZThn4_N3ccc8CC13x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y83abcEv,_ZThn4_N3ccc8CC13x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y83efgEv,_ZThn4_N3ccc8CC13x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y8E[];
Class_Descriptor cd__ZN3ccc8CC13x1y8E = {  "_ZN3ccc8CC13x1y8E", // class name
  bases__ZN3ccc8CC13x1y8E, 2,
  &(vtc__ZN3ccc8CC13x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y9  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC13x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x1y93pqrEv
  ~CC13x1y9(); // tgen
  CC13x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x1y9E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x1y93efgEv");}
void  ccc::CC13x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x1y93pqrEv");}
ccc::CC13x1y9 ::~CC13x1y9(){ note_dtor("_ZN3ccc8CC13x1y9E", this);} // tgen
ccc::CC13x1y9 ::CC13x1y9(){ note_ctor("_ZN3ccc8CC13x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x1y9E, buf);
    ::ccc::CC13x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x1y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC13x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x1y9E);
    dp->::ccc::CC13x1y9::~CC13x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x1y9E(Test__ZN3ccc8CC13x1y9E, "_ZN3ccc8CC13x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x1y9C1Ev();
extern void _ZN3ccc8CC13x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x1y9E[] = {
  NSPAIR(_ZN3ccc8CC13x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC13x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y9E[];
extern void _ZN3ccc8CC13x1y93efgEv();
extern void _ZN3ccc8CC13x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y93pqrEv,_ZThn4_N3ccc8CC13x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x1y93efgEv,_ZThn4_N3ccc8CC13x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x1y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y93pqrEv,_ZThn4_N3ccc8CC13x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x1y93efgEv,_ZThn4_N3ccc8CC13x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x1y9E[];
Class_Descriptor cd__ZN3ccc8CC13x1y9E = {  "_ZN3ccc8CC13x1y9E", // class name
  bases__ZN3ccc8CC13x1y9E, 2,
  &(vtc__ZN3ccc8CC13x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x1y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y10  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC13x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x1y103abcEv
  ~CC13x1y10(); // tgen
  CC13x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y10E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x1y103pqrEv");}
void  ccc::CC13x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x1y103abcEv");}
ccc::CC13x1y10 ::~CC13x1y10(){ note_dtor("_ZN3ccc9CC13x1y10E", this);} // tgen
ccc::CC13x1y10 ::CC13x1y10(){ note_ctor("_ZN3ccc9CC13x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y10E, buf);
    ::ccc::CC13x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y10E);
    dp->::ccc::CC13x1y10::~CC13x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y10E(Test__ZN3ccc9CC13x1y10E, "_ZN3ccc9CC13x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y10C1Ev();
extern void _ZN3ccc9CC13x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y10E[] = {
  NSPAIR(_ZN3ccc9CC13x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x1y103pqrEv();
extern void _ZN3ccc9CC13x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y103abcEv,_ZThn4_N3ccc9CC13x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y103pqrEv,_ZThn4_N3ccc9CC13x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y103abcEv,_ZThn4_N3ccc9CC13x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y103pqrEv,_ZThn4_N3ccc9CC13x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y10E[];
Class_Descriptor cd__ZN3ccc9CC13x1y10E = {  "_ZN3ccc9CC13x1y10E", // class name
  bases__ZN3ccc9CC13x1y10E, 2,
  &(vtc__ZN3ccc9CC13x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y11  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC13x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x1y113efgEv
  ~CC13x1y11(); // tgen
  CC13x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y11E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x1y113pqrEv");}
void  ccc::CC13x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x1y113efgEv");}
ccc::CC13x1y11 ::~CC13x1y11(){ note_dtor("_ZN3ccc9CC13x1y11E", this);} // tgen
ccc::CC13x1y11 ::CC13x1y11(){ note_ctor("_ZN3ccc9CC13x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y11E, buf);
    ::ccc::CC13x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y11E);
    dp->::ccc::CC13x1y11::~CC13x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y11E(Test__ZN3ccc9CC13x1y11E, "_ZN3ccc9CC13x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y11C1Ev();
extern void _ZN3ccc9CC13x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y11E[] = {
  NSPAIR(_ZN3ccc9CC13x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y11E[];
extern void _ZN3ccc9CC13x1y113efgEv();
extern void _ZN3ccc9CC13x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y113pqrEv,_ZThn4_N3ccc9CC13x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y113efgEv,_ZThn4_N3ccc9CC13x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y113pqrEv,_ZThn4_N3ccc9CC13x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y113efgEv,_ZThn4_N3ccc9CC13x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y11E[];
Class_Descriptor cd__ZN3ccc9CC13x1y11E = {  "_ZN3ccc9CC13x1y11E", // class name
  bases__ZN3ccc9CC13x1y11E, 2,
  &(vtc__ZN3ccc9CC13x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y12  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC13x1y123abcEv
  ~CC13x1y12(); // tgen
  CC13x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y12E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x1y123abcEv");}
ccc::CC13x1y12 ::~CC13x1y12(){ note_dtor("_ZN3ccc9CC13x1y12E", this);} // tgen
ccc::CC13x1y12 ::CC13x1y12(){ note_ctor("_ZN3ccc9CC13x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y12E, buf);
    ::ccc::CC13x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y12E);
    dp->::ccc::CC13x1y12::~CC13x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y12E(Test__ZN3ccc9CC13x1y12E, "_ZN3ccc9CC13x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y12C1Ev();
extern void _ZN3ccc9CC13x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y12E[] = {
  NSPAIR(_ZN3ccc9CC13x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y123abcEv,_ZThn4_N3ccc9CC13x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y123abcEv,_ZThn4_N3ccc9CC13x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y12E[];
Class_Descriptor cd__ZN3ccc9CC13x1y12E = {  "_ZN3ccc9CC13x1y12E", // class name
  bases__ZN3ccc9CC13x1y12E, 2,
  &(vtc__ZN3ccc9CC13x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y13  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC13x1y133efgEv
  ~CC13x1y13(); // tgen
  CC13x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y13E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x1y133efgEv");}
ccc::CC13x1y13 ::~CC13x1y13(){ note_dtor("_ZN3ccc9CC13x1y13E", this);} // tgen
ccc::CC13x1y13 ::CC13x1y13(){ note_ctor("_ZN3ccc9CC13x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y13E, buf);
    ::ccc::CC13x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y13E);
    dp->::ccc::CC13x1y13::~CC13x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y13E(Test__ZN3ccc9CC13x1y13E, "_ZN3ccc9CC13x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y13C1Ev();
extern void _ZN3ccc9CC13x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y13E[] = {
  NSPAIR(_ZN3ccc9CC13x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y13E[];
extern void _ZN3ccc9CC13x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y133efgEv,_ZThn4_N3ccc9CC13x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y133efgEv,_ZThn4_N3ccc9CC13x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y13E[];
Class_Descriptor cd__ZN3ccc9CC13x1y13E = {  "_ZN3ccc9CC13x1y13E", // class name
  bases__ZN3ccc9CC13x1y13E, 2,
  &(vtc__ZN3ccc9CC13x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y14  : ::ccc::AA13 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC13x1y143pqrEv
  ~CC13x1y14(); // tgen
  CC13x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y14E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC13x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x1y143pqrEv");}
ccc::CC13x1y14 ::~CC13x1y14(){ note_dtor("_ZN3ccc9CC13x1y14E", this);} // tgen
ccc::CC13x1y14 ::CC13x1y14(){ note_ctor("_ZN3ccc9CC13x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y14E, buf);
    ::ccc::CC13x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y14E);
    dp->::ccc::CC13x1y14::~CC13x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y14E(Test__ZN3ccc9CC13x1y14E, "_ZN3ccc9CC13x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y14C1Ev();
extern void _ZN3ccc9CC13x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y14E[] = {
  NSPAIR(_ZN3ccc9CC13x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x1y143pqrEv,_ZThn4_N3ccc9CC13x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x1y143pqrEv,_ZThn4_N3ccc9CC13x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y14E[];
Class_Descriptor cd__ZN3ccc9CC13x1y14E = {  "_ZN3ccc9CC13x1y14E", // class name
  bases__ZN3ccc9CC13x1y14E, 2,
  &(vtc__ZN3ccc9CC13x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x1y15  : ::ccc::AA13 , ::ccc::BB1 {
  ~CC13x1y15(); // tgen
  CC13x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x1y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x1y15 ::~CC13x1y15(){ note_dtor("_ZN3ccc9CC13x1y15E", this);} // tgen
ccc::CC13x1y15 ::CC13x1y15(){ note_ctor("_ZN3ccc9CC13x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x1y15E, buf);
    ::ccc::CC13x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x1y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC13x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x1y15E);
    dp->::ccc::CC13x1y15::~CC13x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x1y15E(Test__ZN3ccc9CC13x1y15E, "_ZN3ccc9CC13x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x1y15C1Ev();
extern void _ZN3ccc9CC13x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x1y15E[] = {
  NSPAIR(_ZN3ccc9CC13x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC13x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x1y15E[];
Class_Descriptor cd__ZN3ccc9CC13x1y15E = {  "_ZN3ccc9CC13x1y15E", // class name
  bases__ZN3ccc9CC13x1y15E, 2,
  &(vtc__ZN3ccc9CC13x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x1y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y0  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC13x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y03pqrEv
  ~CC13x2y0(); // tgen
  CC13x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y0E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y03abcEv");}
void  ccc::CC13x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y03efgEv");}
void  ccc::CC13x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y03pqrEv");}
ccc::CC13x2y0 ::~CC13x2y0(){ note_dtor("_ZN3ccc8CC13x2y0E", this);} // tgen
ccc::CC13x2y0 ::CC13x2y0(){ note_ctor("_ZN3ccc8CC13x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y0E, buf);
    ::ccc::CC13x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y0E);
    dp->::ccc::CC13x2y0::~CC13x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y0E(Test__ZN3ccc8CC13x2y0E, "_ZN3ccc8CC13x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y0C1Ev();
extern void _ZN3ccc8CC13x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y0E[] = {
  NSPAIR(_ZN3ccc8CC13x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y0E[];
extern void _ZN3ccc8CC13x2y03efgEv();
extern void _ZN3ccc8CC13x2y03abcEv();
extern void _ZN3ccc8CC13x2y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y03efgEv,_ZThn4_N3ccc8CC13x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y03abcEv,_ZThn4_N3ccc8CC13x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y03pqrEv,_ZThn4_N3ccc8CC13x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y03efgEv,_ZThn4_N3ccc8CC13x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y03abcEv,_ZThn4_N3ccc8CC13x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y03pqrEv,_ZThn4_N3ccc8CC13x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y0E[];
Class_Descriptor cd__ZN3ccc8CC13x2y0E = {  "_ZN3ccc8CC13x2y0E", // class name
  bases__ZN3ccc8CC13x2y0E, 2,
  &(vtc__ZN3ccc8CC13x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y1  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC13x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x2y13efgEv
  ~CC13x2y1(); // tgen
  CC13x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y1E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y13abcEv");}
void  ccc::CC13x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y13pqrEv");}
void  ccc::CC13x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y13efgEv");}
ccc::CC13x2y1 ::~CC13x2y1(){ note_dtor("_ZN3ccc8CC13x2y1E", this);} // tgen
ccc::CC13x2y1 ::CC13x2y1(){ note_ctor("_ZN3ccc8CC13x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y1E, buf);
    ::ccc::CC13x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y1E);
    dp->::ccc::CC13x2y1::~CC13x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y1E(Test__ZN3ccc8CC13x2y1E, "_ZN3ccc8CC13x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y1C1Ev();
extern void _ZN3ccc8CC13x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y1E[] = {
  NSPAIR(_ZN3ccc8CC13x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y1E[];
extern void _ZN3ccc8CC13x2y13efgEv();
extern void _ZN3ccc8CC13x2y13abcEv();
extern void _ZN3ccc8CC13x2y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y13efgEv,_ZThn4_N3ccc8CC13x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y13abcEv,_ZThn4_N3ccc8CC13x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y13pqrEv,_ZThn4_N3ccc8CC13x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y13efgEv,_ZThn4_N3ccc8CC13x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y13abcEv,_ZThn4_N3ccc8CC13x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y13pqrEv,_ZThn4_N3ccc8CC13x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y1E[];
Class_Descriptor cd__ZN3ccc8CC13x2y1E = {  "_ZN3ccc8CC13x2y1E", // class name
  bases__ZN3ccc8CC13x2y1E, 2,
  &(vtc__ZN3ccc8CC13x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y2  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC13x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y23pqrEv
  ~CC13x2y2(); // tgen
  CC13x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y2E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y23efgEv");}
void  ccc::CC13x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y23abcEv");}
void  ccc::CC13x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y23pqrEv");}
ccc::CC13x2y2 ::~CC13x2y2(){ note_dtor("_ZN3ccc8CC13x2y2E", this);} // tgen
ccc::CC13x2y2 ::CC13x2y2(){ note_ctor("_ZN3ccc8CC13x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y2E, buf);
    ::ccc::CC13x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y2E);
    dp->::ccc::CC13x2y2::~CC13x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y2E(Test__ZN3ccc8CC13x2y2E, "_ZN3ccc8CC13x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y2C1Ev();
extern void _ZN3ccc8CC13x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y2E[] = {
  NSPAIR(_ZN3ccc8CC13x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y2E[];
extern void _ZN3ccc8CC13x2y23efgEv();
extern void _ZN3ccc8CC13x2y23abcEv();
extern void _ZN3ccc8CC13x2y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y23efgEv,_ZThn4_N3ccc8CC13x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y23abcEv,_ZThn4_N3ccc8CC13x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y23pqrEv,_ZThn4_N3ccc8CC13x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y23efgEv,_ZThn4_N3ccc8CC13x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y23abcEv,_ZThn4_N3ccc8CC13x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y23pqrEv,_ZThn4_N3ccc8CC13x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y2E[];
Class_Descriptor cd__ZN3ccc8CC13x2y2E = {  "_ZN3ccc8CC13x2y2E", // class name
  bases__ZN3ccc8CC13x2y2E, 2,
  &(vtc__ZN3ccc8CC13x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y3  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC13x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x2y33abcEv
  ~CC13x2y3(); // tgen
  CC13x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y3E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y33efgEv");}
void  ccc::CC13x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y33pqrEv");}
void  ccc::CC13x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y33abcEv");}
ccc::CC13x2y3 ::~CC13x2y3(){ note_dtor("_ZN3ccc8CC13x2y3E", this);} // tgen
ccc::CC13x2y3 ::CC13x2y3(){ note_ctor("_ZN3ccc8CC13x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y3E, buf);
    ::ccc::CC13x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y3E);
    dp->::ccc::CC13x2y3::~CC13x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y3E(Test__ZN3ccc8CC13x2y3E, "_ZN3ccc8CC13x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y3C1Ev();
extern void _ZN3ccc8CC13x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y3E[] = {
  NSPAIR(_ZN3ccc8CC13x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y3E[];
extern void _ZN3ccc8CC13x2y33efgEv();
extern void _ZN3ccc8CC13x2y33pqrEv();
extern void _ZN3ccc8CC13x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y33efgEv,_ZThn4_N3ccc8CC13x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y33abcEv,_ZThn4_N3ccc8CC13x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y33pqrEv,_ZThn4_N3ccc8CC13x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y33efgEv,_ZThn4_N3ccc8CC13x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y33abcEv,_ZThn4_N3ccc8CC13x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y33pqrEv,_ZThn4_N3ccc8CC13x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y3E[];
Class_Descriptor cd__ZN3ccc8CC13x2y3E = {  "_ZN3ccc8CC13x2y3E", // class name
  bases__ZN3ccc8CC13x2y3E, 2,
  &(vtc__ZN3ccc8CC13x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y4  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC13x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x2y43efgEv
  ~CC13x2y4(); // tgen
  CC13x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y4E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y43pqrEv");}
void  ccc::CC13x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y43abcEv");}
void  ccc::CC13x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y43efgEv");}
ccc::CC13x2y4 ::~CC13x2y4(){ note_dtor("_ZN3ccc8CC13x2y4E", this);} // tgen
ccc::CC13x2y4 ::CC13x2y4(){ note_ctor("_ZN3ccc8CC13x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y4E, buf);
    ::ccc::CC13x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y4E);
    dp->::ccc::CC13x2y4::~CC13x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y4E(Test__ZN3ccc8CC13x2y4E, "_ZN3ccc8CC13x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y4C1Ev();
extern void _ZN3ccc8CC13x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y4E[] = {
  NSPAIR(_ZN3ccc8CC13x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y4E[];
extern void _ZN3ccc8CC13x2y43efgEv();
extern void _ZN3ccc8CC13x2y43pqrEv();
extern void _ZN3ccc8CC13x2y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y43efgEv,_ZThn4_N3ccc8CC13x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y43abcEv,_ZThn4_N3ccc8CC13x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y43pqrEv,_ZThn4_N3ccc8CC13x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y43efgEv,_ZThn4_N3ccc8CC13x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y43abcEv,_ZThn4_N3ccc8CC13x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y43pqrEv,_ZThn4_N3ccc8CC13x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y4E[];
Class_Descriptor cd__ZN3ccc8CC13x2y4E = {  "_ZN3ccc8CC13x2y4E", // class name
  bases__ZN3ccc8CC13x2y4E, 2,
  &(vtc__ZN3ccc8CC13x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y5  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC13x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x2y53abcEv
  ~CC13x2y5(); // tgen
  CC13x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y5E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y53pqrEv");}
void  ccc::CC13x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y53efgEv");}
void  ccc::CC13x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y53abcEv");}
ccc::CC13x2y5 ::~CC13x2y5(){ note_dtor("_ZN3ccc8CC13x2y5E", this);} // tgen
ccc::CC13x2y5 ::CC13x2y5(){ note_ctor("_ZN3ccc8CC13x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y5E, buf);
    ::ccc::CC13x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y5E);
    dp->::ccc::CC13x2y5::~CC13x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y5E(Test__ZN3ccc8CC13x2y5E, "_ZN3ccc8CC13x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y5C1Ev();
extern void _ZN3ccc8CC13x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y5E[] = {
  NSPAIR(_ZN3ccc8CC13x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y5E[];
extern void _ZN3ccc8CC13x2y53efgEv();
extern void _ZN3ccc8CC13x2y53pqrEv();
extern void _ZN3ccc8CC13x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y53efgEv,_ZThn4_N3ccc8CC13x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y53abcEv,_ZThn4_N3ccc8CC13x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y53pqrEv,_ZThn4_N3ccc8CC13x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y53efgEv,_ZThn4_N3ccc8CC13x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y53abcEv,_ZThn4_N3ccc8CC13x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y53pqrEv,_ZThn4_N3ccc8CC13x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y5E[];
Class_Descriptor cd__ZN3ccc8CC13x2y5E = {  "_ZN3ccc8CC13x2y5E", // class name
  bases__ZN3ccc8CC13x2y5E, 2,
  &(vtc__ZN3ccc8CC13x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y6  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC13x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x2y63efgEv
  ~CC13x2y6(); // tgen
  CC13x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y6E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y63abcEv");}
void  ccc::CC13x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y63efgEv");}
ccc::CC13x2y6 ::~CC13x2y6(){ note_dtor("_ZN3ccc8CC13x2y6E", this);} // tgen
ccc::CC13x2y6 ::CC13x2y6(){ note_ctor("_ZN3ccc8CC13x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y6E, buf);
    ::ccc::CC13x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y6E);
    dp->::ccc::CC13x2y6::~CC13x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y6E(Test__ZN3ccc8CC13x2y6E, "_ZN3ccc8CC13x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y6C1Ev();
extern void _ZN3ccc8CC13x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y6E[] = {
  NSPAIR(_ZN3ccc8CC13x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y6E[];
extern void _ZN3ccc8CC13x2y63efgEv();
extern void _ZN3ccc8CC13x2y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y63efgEv,_ZThn4_N3ccc8CC13x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y63abcEv,_ZThn4_N3ccc8CC13x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y63efgEv,_ZThn4_N3ccc8CC13x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y63abcEv,_ZThn4_N3ccc8CC13x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y6E[];
Class_Descriptor cd__ZN3ccc8CC13x2y6E = {  "_ZN3ccc8CC13x2y6E", // class name
  bases__ZN3ccc8CC13x2y6E, 2,
  &(vtc__ZN3ccc8CC13x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y7  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC13x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y73pqrEv
  ~CC13x2y7(); // tgen
  CC13x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y7E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y73abcEv");}
void  ccc::CC13x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y73pqrEv");}
ccc::CC13x2y7 ::~CC13x2y7(){ note_dtor("_ZN3ccc8CC13x2y7E", this);} // tgen
ccc::CC13x2y7 ::CC13x2y7(){ note_ctor("_ZN3ccc8CC13x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y7E, buf);
    ::ccc::CC13x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y7E);
    dp->::ccc::CC13x2y7::~CC13x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y7E(Test__ZN3ccc8CC13x2y7E, "_ZN3ccc8CC13x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y7C1Ev();
extern void _ZN3ccc8CC13x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y7E[] = {
  NSPAIR(_ZN3ccc8CC13x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x2y73abcEv();
extern void _ZN3ccc8CC13x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y73abcEv,_ZThn4_N3ccc8CC13x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y73pqrEv,_ZThn4_N3ccc8CC13x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y73abcEv,_ZThn4_N3ccc8CC13x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y73pqrEv,_ZThn4_N3ccc8CC13x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y7E[];
Class_Descriptor cd__ZN3ccc8CC13x2y7E = {  "_ZN3ccc8CC13x2y7E", // class name
  bases__ZN3ccc8CC13x2y7E, 2,
  &(vtc__ZN3ccc8CC13x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y8  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC13x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x2y83abcEv
  ~CC13x2y8(); // tgen
  CC13x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y8E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y83efgEv");}
void  ccc::CC13x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x2y83abcEv");}
ccc::CC13x2y8 ::~CC13x2y8(){ note_dtor("_ZN3ccc8CC13x2y8E", this);} // tgen
ccc::CC13x2y8 ::CC13x2y8(){ note_ctor("_ZN3ccc8CC13x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y8E, buf);
    ::ccc::CC13x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y8E);
    dp->::ccc::CC13x2y8::~CC13x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y8E(Test__ZN3ccc8CC13x2y8E, "_ZN3ccc8CC13x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y8C1Ev();
extern void _ZN3ccc8CC13x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y8E[] = {
  NSPAIR(_ZN3ccc8CC13x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y8E[];
extern void _ZN3ccc8CC13x2y83efgEv();
extern void _ZN3ccc8CC13x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y83efgEv,_ZThn4_N3ccc8CC13x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y83abcEv,_ZThn4_N3ccc8CC13x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y83efgEv,_ZThn4_N3ccc8CC13x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y83abcEv,_ZThn4_N3ccc8CC13x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y8E[];
Class_Descriptor cd__ZN3ccc8CC13x2y8E = {  "_ZN3ccc8CC13x2y8E", // class name
  bases__ZN3ccc8CC13x2y8E, 2,
  &(vtc__ZN3ccc8CC13x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y9  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC13x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x2y93pqrEv
  ~CC13x2y9(); // tgen
  CC13x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x2y9E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x2y93efgEv");}
void  ccc::CC13x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x2y93pqrEv");}
ccc::CC13x2y9 ::~CC13x2y9(){ note_dtor("_ZN3ccc8CC13x2y9E", this);} // tgen
ccc::CC13x2y9 ::CC13x2y9(){ note_ctor("_ZN3ccc8CC13x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x2y9E, buf);
    ::ccc::CC13x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x2y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC13x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x2y9E);
    dp->::ccc::CC13x2y9::~CC13x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x2y9E(Test__ZN3ccc8CC13x2y9E, "_ZN3ccc8CC13x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x2y9C1Ev();
extern void _ZN3ccc8CC13x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x2y9E[] = {
  NSPAIR(_ZN3ccc8CC13x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC13x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y9E[];
extern void _ZN3ccc8CC13x2y93efgEv();
extern void _ZN3ccc8CC13x2y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y93efgEv,_ZThn4_N3ccc8CC13x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x2y93pqrEv,_ZThn4_N3ccc8CC13x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x2y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y93efgEv,_ZThn4_N3ccc8CC13x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x2y93pqrEv,_ZThn4_N3ccc8CC13x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x2y9E[];
Class_Descriptor cd__ZN3ccc8CC13x2y9E = {  "_ZN3ccc8CC13x2y9E", // class name
  bases__ZN3ccc8CC13x2y9E, 2,
  &(vtc__ZN3ccc8CC13x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x2y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y10  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC13x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x2y103abcEv
  ~CC13x2y10(); // tgen
  CC13x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y10E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x2y103pqrEv");}
void  ccc::CC13x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x2y103abcEv");}
ccc::CC13x2y10 ::~CC13x2y10(){ note_dtor("_ZN3ccc9CC13x2y10E", this);} // tgen
ccc::CC13x2y10 ::CC13x2y10(){ note_ctor("_ZN3ccc9CC13x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y10E, buf);
    ::ccc::CC13x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y10E);
    dp->::ccc::CC13x2y10::~CC13x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y10E(Test__ZN3ccc9CC13x2y10E, "_ZN3ccc9CC13x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y10C1Ev();
extern void _ZN3ccc9CC13x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y10E[] = {
  NSPAIR(_ZN3ccc9CC13x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x2y103pqrEv();
extern void _ZN3ccc9CC13x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y103abcEv,_ZThn4_N3ccc9CC13x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y103pqrEv,_ZThn4_N3ccc9CC13x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y103abcEv,_ZThn4_N3ccc9CC13x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y103pqrEv,_ZThn4_N3ccc9CC13x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y10E[];
Class_Descriptor cd__ZN3ccc9CC13x2y10E = {  "_ZN3ccc9CC13x2y10E", // class name
  bases__ZN3ccc9CC13x2y10E, 2,
  &(vtc__ZN3ccc9CC13x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y11  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC13x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x2y113efgEv
  ~CC13x2y11(); // tgen
  CC13x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y11E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x2y113pqrEv");}
void  ccc::CC13x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x2y113efgEv");}
ccc::CC13x2y11 ::~CC13x2y11(){ note_dtor("_ZN3ccc9CC13x2y11E", this);} // tgen
ccc::CC13x2y11 ::CC13x2y11(){ note_ctor("_ZN3ccc9CC13x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y11E, buf);
    ::ccc::CC13x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y11E);
    dp->::ccc::CC13x2y11::~CC13x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y11E(Test__ZN3ccc9CC13x2y11E, "_ZN3ccc9CC13x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y11C1Ev();
extern void _ZN3ccc9CC13x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y11E[] = {
  NSPAIR(_ZN3ccc9CC13x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y11E[];
extern void _ZN3ccc9CC13x2y113efgEv();
extern void _ZN3ccc9CC13x2y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y113efgEv,_ZThn4_N3ccc9CC13x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y113pqrEv,_ZThn4_N3ccc9CC13x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y113efgEv,_ZThn4_N3ccc9CC13x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y113pqrEv,_ZThn4_N3ccc9CC13x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y11E[];
Class_Descriptor cd__ZN3ccc9CC13x2y11E = {  "_ZN3ccc9CC13x2y11E", // class name
  bases__ZN3ccc9CC13x2y11E, 2,
  &(vtc__ZN3ccc9CC13x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y12  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC13x2y123abcEv
  ~CC13x2y12(); // tgen
  CC13x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y12E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC13x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x2y123abcEv");}
ccc::CC13x2y12 ::~CC13x2y12(){ note_dtor("_ZN3ccc9CC13x2y12E", this);} // tgen
ccc::CC13x2y12 ::CC13x2y12(){ note_ctor("_ZN3ccc9CC13x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y12E, buf);
    ::ccc::CC13x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y12E);
    dp->::ccc::CC13x2y12::~CC13x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y12E(Test__ZN3ccc9CC13x2y12E, "_ZN3ccc9CC13x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y12C1Ev();
extern void _ZN3ccc9CC13x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y12E[] = {
  NSPAIR(_ZN3ccc9CC13x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y123abcEv,_ZThn4_N3ccc9CC13x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y123abcEv,_ZThn4_N3ccc9CC13x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y12E[];
Class_Descriptor cd__ZN3ccc9CC13x2y12E = {  "_ZN3ccc9CC13x2y12E", // class name
  bases__ZN3ccc9CC13x2y12E, 2,
  &(vtc__ZN3ccc9CC13x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y13  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC13x2y133efgEv
  ~CC13x2y13(); // tgen
  CC13x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y13E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC13x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x2y133efgEv");}
ccc::CC13x2y13 ::~CC13x2y13(){ note_dtor("_ZN3ccc9CC13x2y13E", this);} // tgen
ccc::CC13x2y13 ::CC13x2y13(){ note_ctor("_ZN3ccc9CC13x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y13E, buf);
    ::ccc::CC13x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y13E);
    dp->::ccc::CC13x2y13::~CC13x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y13E(Test__ZN3ccc9CC13x2y13E, "_ZN3ccc9CC13x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y13C1Ev();
extern void _ZN3ccc9CC13x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y13E[] = {
  NSPAIR(_ZN3ccc9CC13x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y13E[];
extern void _ZN3ccc9CC13x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y133efgEv,_ZThn4_N3ccc9CC13x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y133efgEv,_ZThn4_N3ccc9CC13x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y13E[];
Class_Descriptor cd__ZN3ccc9CC13x2y13E = {  "_ZN3ccc9CC13x2y13E", // class name
  bases__ZN3ccc9CC13x2y13E, 2,
  &(vtc__ZN3ccc9CC13x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y14  : ::ccc::AA13 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC13x2y143pqrEv
  ~CC13x2y14(); // tgen
  CC13x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y14E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC13x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x2y143pqrEv");}
ccc::CC13x2y14 ::~CC13x2y14(){ note_dtor("_ZN3ccc9CC13x2y14E", this);} // tgen
ccc::CC13x2y14 ::CC13x2y14(){ note_ctor("_ZN3ccc9CC13x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y14E, buf);
    ::ccc::CC13x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y14E);
    dp->::ccc::CC13x2y14::~CC13x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y14E(Test__ZN3ccc9CC13x2y14E, "_ZN3ccc9CC13x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y14C1Ev();
extern void _ZN3ccc9CC13x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y14E[] = {
  NSPAIR(_ZN3ccc9CC13x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x2y143pqrEv,_ZThn4_N3ccc9CC13x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x2y143pqrEv,_ZThn4_N3ccc9CC13x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y14E[];
Class_Descriptor cd__ZN3ccc9CC13x2y14E = {  "_ZN3ccc9CC13x2y14E", // class name
  bases__ZN3ccc9CC13x2y14E, 2,
  &(vtc__ZN3ccc9CC13x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x2y15  : ::ccc::AA13 , ::ccc::BB2 {
  ~CC13x2y15(); // tgen
  CC13x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x2y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x2y15 ::~CC13x2y15(){ note_dtor("_ZN3ccc9CC13x2y15E", this);} // tgen
ccc::CC13x2y15 ::CC13x2y15(){ note_ctor("_ZN3ccc9CC13x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x2y15E, buf);
    ::ccc::CC13x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x2y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC13x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x2y15E);
    dp->::ccc::CC13x2y15::~CC13x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x2y15E(Test__ZN3ccc9CC13x2y15E, "_ZN3ccc9CC13x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x2y15C1Ev();
extern void _ZN3ccc9CC13x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x2y15E[] = {
  NSPAIR(_ZN3ccc9CC13x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC13x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x2y15E[];
Class_Descriptor cd__ZN3ccc9CC13x2y15E = {  "_ZN3ccc9CC13x2y15E", // class name
  bases__ZN3ccc9CC13x2y15E, 2,
  &(vtc__ZN3ccc9CC13x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x2y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y0  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC13x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y03pqrEv
  ~CC13x3y0(); // tgen
  CC13x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y0E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y03abcEv");}
void  ccc::CC13x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y03efgEv");}
void  ccc::CC13x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y03pqrEv");}
ccc::CC13x3y0 ::~CC13x3y0(){ note_dtor("_ZN3ccc8CC13x3y0E", this);} // tgen
ccc::CC13x3y0 ::CC13x3y0(){ note_ctor("_ZN3ccc8CC13x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y0E, buf);
    ::ccc::CC13x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y0E);
    dp->::ccc::CC13x3y0::~CC13x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y0E(Test__ZN3ccc8CC13x3y0E, "_ZN3ccc8CC13x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y0C1Ev();
extern void _ZN3ccc8CC13x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y0E[] = {
  NSPAIR(_ZN3ccc8CC13x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y0E[];
extern void _ZN3ccc8CC13x3y03efgEv();
extern void _ZN3ccc8CC13x3y03abcEv();
extern void _ZN3ccc8CC13x3y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y03efgEv,_ZThn4_N3ccc8CC13x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y03pqrEv,_ZThn4_N3ccc8CC13x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y03abcEv,_ZThn4_N3ccc8CC13x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y03efgEv,_ZThn4_N3ccc8CC13x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y03pqrEv,_ZThn4_N3ccc8CC13x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y03abcEv,_ZThn4_N3ccc8CC13x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y0E[];
Class_Descriptor cd__ZN3ccc8CC13x3y0E = {  "_ZN3ccc8CC13x3y0E", // class name
  bases__ZN3ccc8CC13x3y0E, 2,
  &(vtc__ZN3ccc8CC13x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y1  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC13x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x3y13efgEv
  ~CC13x3y1(); // tgen
  CC13x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y1E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y13abcEv");}
void  ccc::CC13x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y13pqrEv");}
void  ccc::CC13x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y13efgEv");}
ccc::CC13x3y1 ::~CC13x3y1(){ note_dtor("_ZN3ccc8CC13x3y1E", this);} // tgen
ccc::CC13x3y1 ::CC13x3y1(){ note_ctor("_ZN3ccc8CC13x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y1E, buf);
    ::ccc::CC13x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y1E);
    dp->::ccc::CC13x3y1::~CC13x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y1E(Test__ZN3ccc8CC13x3y1E, "_ZN3ccc8CC13x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y1C1Ev();
extern void _ZN3ccc8CC13x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y1E[] = {
  NSPAIR(_ZN3ccc8CC13x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y1E[];
extern void _ZN3ccc8CC13x3y13efgEv();
extern void _ZN3ccc8CC13x3y13abcEv();
extern void _ZN3ccc8CC13x3y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y13efgEv,_ZThn4_N3ccc8CC13x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y13pqrEv,_ZThn4_N3ccc8CC13x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y13abcEv,_ZThn4_N3ccc8CC13x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y13efgEv,_ZThn4_N3ccc8CC13x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y13pqrEv,_ZThn4_N3ccc8CC13x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y13abcEv,_ZThn4_N3ccc8CC13x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y1E[];
Class_Descriptor cd__ZN3ccc8CC13x3y1E = {  "_ZN3ccc8CC13x3y1E", // class name
  bases__ZN3ccc8CC13x3y1E, 2,
  &(vtc__ZN3ccc8CC13x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y2  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC13x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y23pqrEv
  ~CC13x3y2(); // tgen
  CC13x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y2E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y23efgEv");}
void  ccc::CC13x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y23abcEv");}
void  ccc::CC13x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y23pqrEv");}
ccc::CC13x3y2 ::~CC13x3y2(){ note_dtor("_ZN3ccc8CC13x3y2E", this);} // tgen
ccc::CC13x3y2 ::CC13x3y2(){ note_ctor("_ZN3ccc8CC13x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y2E, buf);
    ::ccc::CC13x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y2E);
    dp->::ccc::CC13x3y2::~CC13x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y2E(Test__ZN3ccc8CC13x3y2E, "_ZN3ccc8CC13x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y2C1Ev();
extern void _ZN3ccc8CC13x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y2E[] = {
  NSPAIR(_ZN3ccc8CC13x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y2E[];
extern void _ZN3ccc8CC13x3y23efgEv();
extern void _ZN3ccc8CC13x3y23abcEv();
extern void _ZN3ccc8CC13x3y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y23efgEv,_ZThn4_N3ccc8CC13x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y23pqrEv,_ZThn4_N3ccc8CC13x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y23abcEv,_ZThn4_N3ccc8CC13x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y23efgEv,_ZThn4_N3ccc8CC13x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y23pqrEv,_ZThn4_N3ccc8CC13x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y23abcEv,_ZThn4_N3ccc8CC13x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y2E[];
Class_Descriptor cd__ZN3ccc8CC13x3y2E = {  "_ZN3ccc8CC13x3y2E", // class name
  bases__ZN3ccc8CC13x3y2E, 2,
  &(vtc__ZN3ccc8CC13x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y3  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC13x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x3y33abcEv
  ~CC13x3y3(); // tgen
  CC13x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y3E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y33efgEv");}
void  ccc::CC13x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y33pqrEv");}
void  ccc::CC13x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y33abcEv");}
ccc::CC13x3y3 ::~CC13x3y3(){ note_dtor("_ZN3ccc8CC13x3y3E", this);} // tgen
ccc::CC13x3y3 ::CC13x3y3(){ note_ctor("_ZN3ccc8CC13x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y3E, buf);
    ::ccc::CC13x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y3E);
    dp->::ccc::CC13x3y3::~CC13x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y3E(Test__ZN3ccc8CC13x3y3E, "_ZN3ccc8CC13x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y3C1Ev();
extern void _ZN3ccc8CC13x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y3E[] = {
  NSPAIR(_ZN3ccc8CC13x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y3E[];
extern void _ZN3ccc8CC13x3y33efgEv();
extern void _ZN3ccc8CC13x3y33pqrEv();
extern void _ZN3ccc8CC13x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y33efgEv,_ZThn4_N3ccc8CC13x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y33pqrEv,_ZThn4_N3ccc8CC13x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y33abcEv,_ZThn4_N3ccc8CC13x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y33efgEv,_ZThn4_N3ccc8CC13x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y33pqrEv,_ZThn4_N3ccc8CC13x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y33abcEv,_ZThn4_N3ccc8CC13x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y3E[];
Class_Descriptor cd__ZN3ccc8CC13x3y3E = {  "_ZN3ccc8CC13x3y3E", // class name
  bases__ZN3ccc8CC13x3y3E, 2,
  &(vtc__ZN3ccc8CC13x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y4  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC13x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x3y43efgEv
  ~CC13x3y4(); // tgen
  CC13x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y4E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y43pqrEv");}
void  ccc::CC13x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y43abcEv");}
void  ccc::CC13x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y43efgEv");}
ccc::CC13x3y4 ::~CC13x3y4(){ note_dtor("_ZN3ccc8CC13x3y4E", this);} // tgen
ccc::CC13x3y4 ::CC13x3y4(){ note_ctor("_ZN3ccc8CC13x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y4E, buf);
    ::ccc::CC13x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y4E);
    dp->::ccc::CC13x3y4::~CC13x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y4E(Test__ZN3ccc8CC13x3y4E, "_ZN3ccc8CC13x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y4C1Ev();
extern void _ZN3ccc8CC13x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y4E[] = {
  NSPAIR(_ZN3ccc8CC13x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y4E[];
extern void _ZN3ccc8CC13x3y43efgEv();
extern void _ZN3ccc8CC13x3y43pqrEv();
extern void _ZN3ccc8CC13x3y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y43efgEv,_ZThn4_N3ccc8CC13x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y43pqrEv,_ZThn4_N3ccc8CC13x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y43abcEv,_ZThn4_N3ccc8CC13x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y43efgEv,_ZThn4_N3ccc8CC13x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y43pqrEv,_ZThn4_N3ccc8CC13x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y43abcEv,_ZThn4_N3ccc8CC13x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y4E[];
Class_Descriptor cd__ZN3ccc8CC13x3y4E = {  "_ZN3ccc8CC13x3y4E", // class name
  bases__ZN3ccc8CC13x3y4E, 2,
  &(vtc__ZN3ccc8CC13x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y5  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC13x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x3y53abcEv
  ~CC13x3y5(); // tgen
  CC13x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y5E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y53pqrEv");}
void  ccc::CC13x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y53efgEv");}
void  ccc::CC13x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y53abcEv");}
ccc::CC13x3y5 ::~CC13x3y5(){ note_dtor("_ZN3ccc8CC13x3y5E", this);} // tgen
ccc::CC13x3y5 ::CC13x3y5(){ note_ctor("_ZN3ccc8CC13x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y5E, buf);
    ::ccc::CC13x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y5E);
    dp->::ccc::CC13x3y5::~CC13x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y5E(Test__ZN3ccc8CC13x3y5E, "_ZN3ccc8CC13x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y5C1Ev();
extern void _ZN3ccc8CC13x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y5E[] = {
  NSPAIR(_ZN3ccc8CC13x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y5E[];
extern void _ZN3ccc8CC13x3y53efgEv();
extern void _ZN3ccc8CC13x3y53pqrEv();
extern void _ZN3ccc8CC13x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y53efgEv,_ZThn4_N3ccc8CC13x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y53pqrEv,_ZThn4_N3ccc8CC13x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y53abcEv,_ZThn4_N3ccc8CC13x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y53efgEv,_ZThn4_N3ccc8CC13x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y53pqrEv,_ZThn4_N3ccc8CC13x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y53abcEv,_ZThn4_N3ccc8CC13x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y5E[];
Class_Descriptor cd__ZN3ccc8CC13x3y5E = {  "_ZN3ccc8CC13x3y5E", // class name
  bases__ZN3ccc8CC13x3y5E, 2,
  &(vtc__ZN3ccc8CC13x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y6  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC13x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x3y63efgEv
  ~CC13x3y6(); // tgen
  CC13x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y6E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y63abcEv");}
void  ccc::CC13x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y63efgEv");}
ccc::CC13x3y6 ::~CC13x3y6(){ note_dtor("_ZN3ccc8CC13x3y6E", this);} // tgen
ccc::CC13x3y6 ::CC13x3y6(){ note_ctor("_ZN3ccc8CC13x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y6E, buf);
    ::ccc::CC13x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y6E);
    dp->::ccc::CC13x3y6::~CC13x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y6E(Test__ZN3ccc8CC13x3y6E, "_ZN3ccc8CC13x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y6C1Ev();
extern void _ZN3ccc8CC13x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y6E[] = {
  NSPAIR(_ZN3ccc8CC13x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y6E[];
extern void _ZN3ccc8CC13x3y63efgEv();
extern void _ZN3ccc8CC13x3y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y63efgEv,_ZThn4_N3ccc8CC13x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y63abcEv,_ZThn4_N3ccc8CC13x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y63efgEv,_ZThn4_N3ccc8CC13x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y63abcEv,_ZThn4_N3ccc8CC13x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y6E[];
Class_Descriptor cd__ZN3ccc8CC13x3y6E = {  "_ZN3ccc8CC13x3y6E", // class name
  bases__ZN3ccc8CC13x3y6E, 2,
  &(vtc__ZN3ccc8CC13x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y7  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC13x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y73pqrEv
  ~CC13x3y7(); // tgen
  CC13x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y7E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y73abcEv");}
void  ccc::CC13x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y73pqrEv");}
ccc::CC13x3y7 ::~CC13x3y7(){ note_dtor("_ZN3ccc8CC13x3y7E", this);} // tgen
ccc::CC13x3y7 ::CC13x3y7(){ note_ctor("_ZN3ccc8CC13x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y7E, buf);
    ::ccc::CC13x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y7E);
    dp->::ccc::CC13x3y7::~CC13x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y7E(Test__ZN3ccc8CC13x3y7E, "_ZN3ccc8CC13x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y7C1Ev();
extern void _ZN3ccc8CC13x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y7E[] = {
  NSPAIR(_ZN3ccc8CC13x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x3y73abcEv();
extern void _ZN3ccc8CC13x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y73pqrEv,_ZThn4_N3ccc8CC13x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y73abcEv,_ZThn4_N3ccc8CC13x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y73pqrEv,_ZThn4_N3ccc8CC13x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y73abcEv,_ZThn4_N3ccc8CC13x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y7E[];
Class_Descriptor cd__ZN3ccc8CC13x3y7E = {  "_ZN3ccc8CC13x3y7E", // class name
  bases__ZN3ccc8CC13x3y7E, 2,
  &(vtc__ZN3ccc8CC13x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y8  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC13x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x3y83abcEv
  ~CC13x3y8(); // tgen
  CC13x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y8E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y83efgEv");}
void  ccc::CC13x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x3y83abcEv");}
ccc::CC13x3y8 ::~CC13x3y8(){ note_dtor("_ZN3ccc8CC13x3y8E", this);} // tgen
ccc::CC13x3y8 ::CC13x3y8(){ note_ctor("_ZN3ccc8CC13x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y8E, buf);
    ::ccc::CC13x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y8E);
    dp->::ccc::CC13x3y8::~CC13x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y8E(Test__ZN3ccc8CC13x3y8E, "_ZN3ccc8CC13x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y8C1Ev();
extern void _ZN3ccc8CC13x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y8E[] = {
  NSPAIR(_ZN3ccc8CC13x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y8E[];
extern void _ZN3ccc8CC13x3y83efgEv();
extern void _ZN3ccc8CC13x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y83efgEv,_ZThn4_N3ccc8CC13x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y83abcEv,_ZThn4_N3ccc8CC13x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y83efgEv,_ZThn4_N3ccc8CC13x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y83abcEv,_ZThn4_N3ccc8CC13x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y8E[];
Class_Descriptor cd__ZN3ccc8CC13x3y8E = {  "_ZN3ccc8CC13x3y8E", // class name
  bases__ZN3ccc8CC13x3y8E, 2,
  &(vtc__ZN3ccc8CC13x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y9  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC13x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x3y93pqrEv
  ~CC13x3y9(); // tgen
  CC13x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x3y9E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x3y93efgEv");}
void  ccc::CC13x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x3y93pqrEv");}
ccc::CC13x3y9 ::~CC13x3y9(){ note_dtor("_ZN3ccc8CC13x3y9E", this);} // tgen
ccc::CC13x3y9 ::CC13x3y9(){ note_ctor("_ZN3ccc8CC13x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x3y9E, buf);
    ::ccc::CC13x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x3y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC13x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x3y9E);
    dp->::ccc::CC13x3y9::~CC13x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x3y9E(Test__ZN3ccc8CC13x3y9E, "_ZN3ccc8CC13x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x3y9C1Ev();
extern void _ZN3ccc8CC13x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x3y9E[] = {
  NSPAIR(_ZN3ccc8CC13x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC13x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y9E[];
extern void _ZN3ccc8CC13x3y93efgEv();
extern void _ZN3ccc8CC13x3y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y93efgEv,_ZThn4_N3ccc8CC13x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x3y93pqrEv,_ZThn4_N3ccc8CC13x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x3y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y93efgEv,_ZThn4_N3ccc8CC13x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x3y93pqrEv,_ZThn4_N3ccc8CC13x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x3y9E[];
Class_Descriptor cd__ZN3ccc8CC13x3y9E = {  "_ZN3ccc8CC13x3y9E", // class name
  bases__ZN3ccc8CC13x3y9E, 2,
  &(vtc__ZN3ccc8CC13x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x3y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y10  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC13x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x3y103abcEv
  ~CC13x3y10(); // tgen
  CC13x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y10E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x3y103pqrEv");}
void  ccc::CC13x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x3y103abcEv");}
ccc::CC13x3y10 ::~CC13x3y10(){ note_dtor("_ZN3ccc9CC13x3y10E", this);} // tgen
ccc::CC13x3y10 ::CC13x3y10(){ note_ctor("_ZN3ccc9CC13x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y10E, buf);
    ::ccc::CC13x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y10E);
    dp->::ccc::CC13x3y10::~CC13x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y10E(Test__ZN3ccc9CC13x3y10E, "_ZN3ccc9CC13x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y10C1Ev();
extern void _ZN3ccc9CC13x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y10E[] = {
  NSPAIR(_ZN3ccc9CC13x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x3y103pqrEv();
extern void _ZN3ccc9CC13x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y103pqrEv,_ZThn4_N3ccc9CC13x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y103abcEv,_ZThn4_N3ccc9CC13x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y103pqrEv,_ZThn4_N3ccc9CC13x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y103abcEv,_ZThn4_N3ccc9CC13x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y10E[];
Class_Descriptor cd__ZN3ccc9CC13x3y10E = {  "_ZN3ccc9CC13x3y10E", // class name
  bases__ZN3ccc9CC13x3y10E, 2,
  &(vtc__ZN3ccc9CC13x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y11  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC13x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x3y113efgEv
  ~CC13x3y11(); // tgen
  CC13x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y11E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x3y113pqrEv");}
void  ccc::CC13x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x3y113efgEv");}
ccc::CC13x3y11 ::~CC13x3y11(){ note_dtor("_ZN3ccc9CC13x3y11E", this);} // tgen
ccc::CC13x3y11 ::CC13x3y11(){ note_ctor("_ZN3ccc9CC13x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y11E, buf);
    ::ccc::CC13x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y11E);
    dp->::ccc::CC13x3y11::~CC13x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y11E(Test__ZN3ccc9CC13x3y11E, "_ZN3ccc9CC13x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y11C1Ev();
extern void _ZN3ccc9CC13x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y11E[] = {
  NSPAIR(_ZN3ccc9CC13x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y11E[];
extern void _ZN3ccc9CC13x3y113efgEv();
extern void _ZN3ccc9CC13x3y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y113efgEv,_ZThn4_N3ccc9CC13x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y113pqrEv,_ZThn4_N3ccc9CC13x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y113efgEv,_ZThn4_N3ccc9CC13x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y113pqrEv,_ZThn4_N3ccc9CC13x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y11E[];
Class_Descriptor cd__ZN3ccc9CC13x3y11E = {  "_ZN3ccc9CC13x3y11E", // class name
  bases__ZN3ccc9CC13x3y11E, 2,
  &(vtc__ZN3ccc9CC13x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y12  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC13x3y123abcEv
  ~CC13x3y12(); // tgen
  CC13x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y12E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC13x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x3y123abcEv");}
ccc::CC13x3y12 ::~CC13x3y12(){ note_dtor("_ZN3ccc9CC13x3y12E", this);} // tgen
ccc::CC13x3y12 ::CC13x3y12(){ note_ctor("_ZN3ccc9CC13x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y12E, buf);
    ::ccc::CC13x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y12E);
    dp->::ccc::CC13x3y12::~CC13x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y12E(Test__ZN3ccc9CC13x3y12E, "_ZN3ccc9CC13x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y12C1Ev();
extern void _ZN3ccc9CC13x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y12E[] = {
  NSPAIR(_ZN3ccc9CC13x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y123abcEv,_ZThn4_N3ccc9CC13x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y123abcEv,_ZThn4_N3ccc9CC13x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y12E[];
Class_Descriptor cd__ZN3ccc9CC13x3y12E = {  "_ZN3ccc9CC13x3y12E", // class name
  bases__ZN3ccc9CC13x3y12E, 2,
  &(vtc__ZN3ccc9CC13x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y13  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC13x3y133efgEv
  ~CC13x3y13(); // tgen
  CC13x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y13E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC13x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x3y133efgEv");}
ccc::CC13x3y13 ::~CC13x3y13(){ note_dtor("_ZN3ccc9CC13x3y13E", this);} // tgen
ccc::CC13x3y13 ::CC13x3y13(){ note_ctor("_ZN3ccc9CC13x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y13E, buf);
    ::ccc::CC13x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y13E);
    dp->::ccc::CC13x3y13::~CC13x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y13E(Test__ZN3ccc9CC13x3y13E, "_ZN3ccc9CC13x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y13C1Ev();
extern void _ZN3ccc9CC13x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y13E[] = {
  NSPAIR(_ZN3ccc9CC13x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y13E[];
extern void _ZN3ccc9CC13x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y133efgEv,_ZThn4_N3ccc9CC13x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y133efgEv,_ZThn4_N3ccc9CC13x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y13E[];
Class_Descriptor cd__ZN3ccc9CC13x3y13E = {  "_ZN3ccc9CC13x3y13E", // class name
  bases__ZN3ccc9CC13x3y13E, 2,
  &(vtc__ZN3ccc9CC13x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y14  : ::ccc::AA13 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC13x3y143pqrEv
  ~CC13x3y14(); // tgen
  CC13x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y14E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC13x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x3y143pqrEv");}
ccc::CC13x3y14 ::~CC13x3y14(){ note_dtor("_ZN3ccc9CC13x3y14E", this);} // tgen
ccc::CC13x3y14 ::CC13x3y14(){ note_ctor("_ZN3ccc9CC13x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y14E, buf);
    ::ccc::CC13x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y14E);
    dp->::ccc::CC13x3y14::~CC13x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y14E(Test__ZN3ccc9CC13x3y14E, "_ZN3ccc9CC13x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y14C1Ev();
extern void _ZN3ccc9CC13x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y14E[] = {
  NSPAIR(_ZN3ccc9CC13x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x3y143pqrEv,_ZThn4_N3ccc9CC13x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x3y143pqrEv,_ZThn4_N3ccc9CC13x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y14E[];
Class_Descriptor cd__ZN3ccc9CC13x3y14E = {  "_ZN3ccc9CC13x3y14E", // class name
  bases__ZN3ccc9CC13x3y14E, 2,
  &(vtc__ZN3ccc9CC13x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x3y15  : ::ccc::AA13 , ::ccc::BB3 {
  ~CC13x3y15(); // tgen
  CC13x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x3y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x3y15 ::~CC13x3y15(){ note_dtor("_ZN3ccc9CC13x3y15E", this);} // tgen
ccc::CC13x3y15 ::CC13x3y15(){ note_ctor("_ZN3ccc9CC13x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x3y15E, buf);
    ::ccc::CC13x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x3y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC13x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x3y15E);
    dp->::ccc::CC13x3y15::~CC13x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x3y15E(Test__ZN3ccc9CC13x3y15E, "_ZN3ccc9CC13x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x3y15C1Ev();
extern void _ZN3ccc9CC13x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x3y15E[] = {
  NSPAIR(_ZN3ccc9CC13x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC13x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x3y15E[];
Class_Descriptor cd__ZN3ccc9CC13x3y15E = {  "_ZN3ccc9CC13x3y15E", // class name
  bases__ZN3ccc9CC13x3y15E, 2,
  &(vtc__ZN3ccc9CC13x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x3y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y0  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC13x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y03pqrEv
  ~CC13x4y0(); // tgen
  CC13x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y0E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y03abcEv");}
void  ccc::CC13x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y03efgEv");}
void  ccc::CC13x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y03pqrEv");}
ccc::CC13x4y0 ::~CC13x4y0(){ note_dtor("_ZN3ccc8CC13x4y0E", this);} // tgen
ccc::CC13x4y0 ::CC13x4y0(){ note_ctor("_ZN3ccc8CC13x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y0E, buf);
    ::ccc::CC13x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y0E);
    dp->::ccc::CC13x4y0::~CC13x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y0E(Test__ZN3ccc8CC13x4y0E, "_ZN3ccc8CC13x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y0C1Ev();
extern void _ZN3ccc8CC13x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y0E[] = {
  NSPAIR(_ZN3ccc8CC13x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y0E[];
extern void _ZN3ccc8CC13x4y03efgEv();
extern void _ZN3ccc8CC13x4y03abcEv();
extern void _ZN3ccc8CC13x4y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y03pqrEv,_ZThn4_N3ccc8CC13x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y03abcEv,_ZThn4_N3ccc8CC13x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y03efgEv,_ZThn4_N3ccc8CC13x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y03pqrEv,_ZThn4_N3ccc8CC13x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y03abcEv,_ZThn4_N3ccc8CC13x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y03efgEv,_ZThn4_N3ccc8CC13x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y0E[];
Class_Descriptor cd__ZN3ccc8CC13x4y0E = {  "_ZN3ccc8CC13x4y0E", // class name
  bases__ZN3ccc8CC13x4y0E, 2,
  &(vtc__ZN3ccc8CC13x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y1  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC13x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x4y13efgEv
  ~CC13x4y1(); // tgen
  CC13x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y1E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y13abcEv");}
void  ccc::CC13x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y13pqrEv");}
void  ccc::CC13x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y13efgEv");}
ccc::CC13x4y1 ::~CC13x4y1(){ note_dtor("_ZN3ccc8CC13x4y1E", this);} // tgen
ccc::CC13x4y1 ::CC13x4y1(){ note_ctor("_ZN3ccc8CC13x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y1E, buf);
    ::ccc::CC13x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y1E);
    dp->::ccc::CC13x4y1::~CC13x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y1E(Test__ZN3ccc8CC13x4y1E, "_ZN3ccc8CC13x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y1C1Ev();
extern void _ZN3ccc8CC13x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y1E[] = {
  NSPAIR(_ZN3ccc8CC13x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y1E[];
extern void _ZN3ccc8CC13x4y13efgEv();
extern void _ZN3ccc8CC13x4y13abcEv();
extern void _ZN3ccc8CC13x4y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y13pqrEv,_ZThn4_N3ccc8CC13x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y13abcEv,_ZThn4_N3ccc8CC13x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y13efgEv,_ZThn4_N3ccc8CC13x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y13pqrEv,_ZThn4_N3ccc8CC13x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y13abcEv,_ZThn4_N3ccc8CC13x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y13efgEv,_ZThn4_N3ccc8CC13x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y1E[];
Class_Descriptor cd__ZN3ccc8CC13x4y1E = {  "_ZN3ccc8CC13x4y1E", // class name
  bases__ZN3ccc8CC13x4y1E, 2,
  &(vtc__ZN3ccc8CC13x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y2  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC13x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y23pqrEv
  ~CC13x4y2(); // tgen
  CC13x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y2E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y23efgEv");}
void  ccc::CC13x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y23abcEv");}
void  ccc::CC13x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y23pqrEv");}
ccc::CC13x4y2 ::~CC13x4y2(){ note_dtor("_ZN3ccc8CC13x4y2E", this);} // tgen
ccc::CC13x4y2 ::CC13x4y2(){ note_ctor("_ZN3ccc8CC13x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y2E, buf);
    ::ccc::CC13x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y2E);
    dp->::ccc::CC13x4y2::~CC13x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y2E(Test__ZN3ccc8CC13x4y2E, "_ZN3ccc8CC13x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y2C1Ev();
extern void _ZN3ccc8CC13x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y2E[] = {
  NSPAIR(_ZN3ccc8CC13x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y2E[];
extern void _ZN3ccc8CC13x4y23efgEv();
extern void _ZN3ccc8CC13x4y23abcEv();
extern void _ZN3ccc8CC13x4y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y23pqrEv,_ZThn4_N3ccc8CC13x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y23abcEv,_ZThn4_N3ccc8CC13x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y23efgEv,_ZThn4_N3ccc8CC13x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y23pqrEv,_ZThn4_N3ccc8CC13x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y23abcEv,_ZThn4_N3ccc8CC13x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y23efgEv,_ZThn4_N3ccc8CC13x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y2E[];
Class_Descriptor cd__ZN3ccc8CC13x4y2E = {  "_ZN3ccc8CC13x4y2E", // class name
  bases__ZN3ccc8CC13x4y2E, 2,
  &(vtc__ZN3ccc8CC13x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y3  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC13x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x4y33abcEv
  ~CC13x4y3(); // tgen
  CC13x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y3E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y33efgEv");}
void  ccc::CC13x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y33pqrEv");}
void  ccc::CC13x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y33abcEv");}
ccc::CC13x4y3 ::~CC13x4y3(){ note_dtor("_ZN3ccc8CC13x4y3E", this);} // tgen
ccc::CC13x4y3 ::CC13x4y3(){ note_ctor("_ZN3ccc8CC13x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y3E, buf);
    ::ccc::CC13x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y3E);
    dp->::ccc::CC13x4y3::~CC13x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y3E(Test__ZN3ccc8CC13x4y3E, "_ZN3ccc8CC13x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y3C1Ev();
extern void _ZN3ccc8CC13x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y3E[] = {
  NSPAIR(_ZN3ccc8CC13x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y3E[];
extern void _ZN3ccc8CC13x4y33efgEv();
extern void _ZN3ccc8CC13x4y33pqrEv();
extern void _ZN3ccc8CC13x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y33pqrEv,_ZThn4_N3ccc8CC13x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y33abcEv,_ZThn4_N3ccc8CC13x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y33efgEv,_ZThn4_N3ccc8CC13x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y33pqrEv,_ZThn4_N3ccc8CC13x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y33abcEv,_ZThn4_N3ccc8CC13x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y33efgEv,_ZThn4_N3ccc8CC13x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y3E[];
Class_Descriptor cd__ZN3ccc8CC13x4y3E = {  "_ZN3ccc8CC13x4y3E", // class name
  bases__ZN3ccc8CC13x4y3E, 2,
  &(vtc__ZN3ccc8CC13x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y4  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC13x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x4y43efgEv
  ~CC13x4y4(); // tgen
  CC13x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y4E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y43pqrEv");}
void  ccc::CC13x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y43abcEv");}
void  ccc::CC13x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y43efgEv");}
ccc::CC13x4y4 ::~CC13x4y4(){ note_dtor("_ZN3ccc8CC13x4y4E", this);} // tgen
ccc::CC13x4y4 ::CC13x4y4(){ note_ctor("_ZN3ccc8CC13x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y4E, buf);
    ::ccc::CC13x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y4E);
    dp->::ccc::CC13x4y4::~CC13x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y4E(Test__ZN3ccc8CC13x4y4E, "_ZN3ccc8CC13x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y4C1Ev();
extern void _ZN3ccc8CC13x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y4E[] = {
  NSPAIR(_ZN3ccc8CC13x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y4E[];
extern void _ZN3ccc8CC13x4y43efgEv();
extern void _ZN3ccc8CC13x4y43pqrEv();
extern void _ZN3ccc8CC13x4y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y43pqrEv,_ZThn4_N3ccc8CC13x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y43abcEv,_ZThn4_N3ccc8CC13x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y43efgEv,_ZThn4_N3ccc8CC13x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y43pqrEv,_ZThn4_N3ccc8CC13x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y43abcEv,_ZThn4_N3ccc8CC13x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y43efgEv,_ZThn4_N3ccc8CC13x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y4E[];
Class_Descriptor cd__ZN3ccc8CC13x4y4E = {  "_ZN3ccc8CC13x4y4E", // class name
  bases__ZN3ccc8CC13x4y4E, 2,
  &(vtc__ZN3ccc8CC13x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y5  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC13x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x4y53abcEv
  ~CC13x4y5(); // tgen
  CC13x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y5E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y53pqrEv");}
void  ccc::CC13x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y53efgEv");}
void  ccc::CC13x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y53abcEv");}
ccc::CC13x4y5 ::~CC13x4y5(){ note_dtor("_ZN3ccc8CC13x4y5E", this);} // tgen
ccc::CC13x4y5 ::CC13x4y5(){ note_ctor("_ZN3ccc8CC13x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y5E, buf);
    ::ccc::CC13x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y5E);
    dp->::ccc::CC13x4y5::~CC13x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y5E(Test__ZN3ccc8CC13x4y5E, "_ZN3ccc8CC13x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y5C1Ev();
extern void _ZN3ccc8CC13x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y5E[] = {
  NSPAIR(_ZN3ccc8CC13x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y5E[];
extern void _ZN3ccc8CC13x4y53efgEv();
extern void _ZN3ccc8CC13x4y53pqrEv();
extern void _ZN3ccc8CC13x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y53pqrEv,_ZThn4_N3ccc8CC13x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y53abcEv,_ZThn4_N3ccc8CC13x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y53efgEv,_ZThn4_N3ccc8CC13x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y53pqrEv,_ZThn4_N3ccc8CC13x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y53abcEv,_ZThn4_N3ccc8CC13x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y53efgEv,_ZThn4_N3ccc8CC13x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y5E[];
Class_Descriptor cd__ZN3ccc8CC13x4y5E = {  "_ZN3ccc8CC13x4y5E", // class name
  bases__ZN3ccc8CC13x4y5E, 2,
  &(vtc__ZN3ccc8CC13x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y6  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC13x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x4y63efgEv
  ~CC13x4y6(); // tgen
  CC13x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y6E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y63abcEv");}
void  ccc::CC13x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y63efgEv");}
ccc::CC13x4y6 ::~CC13x4y6(){ note_dtor("_ZN3ccc8CC13x4y6E", this);} // tgen
ccc::CC13x4y6 ::CC13x4y6(){ note_ctor("_ZN3ccc8CC13x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y6E, buf);
    ::ccc::CC13x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y6E);
    dp->::ccc::CC13x4y6::~CC13x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y6E(Test__ZN3ccc8CC13x4y6E, "_ZN3ccc8CC13x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y6C1Ev();
extern void _ZN3ccc8CC13x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y6E[] = {
  NSPAIR(_ZN3ccc8CC13x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y6E[];
extern void _ZN3ccc8CC13x4y63efgEv();
extern void _ZN3ccc8CC13x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y63abcEv,_ZThn4_N3ccc8CC13x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y63efgEv,_ZThn4_N3ccc8CC13x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y63abcEv,_ZThn4_N3ccc8CC13x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y63efgEv,_ZThn4_N3ccc8CC13x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y6E[];
Class_Descriptor cd__ZN3ccc8CC13x4y6E = {  "_ZN3ccc8CC13x4y6E", // class name
  bases__ZN3ccc8CC13x4y6E, 2,
  &(vtc__ZN3ccc8CC13x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y7  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC13x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y73pqrEv
  ~CC13x4y7(); // tgen
  CC13x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y7E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y73abcEv");}
void  ccc::CC13x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y73pqrEv");}
ccc::CC13x4y7 ::~CC13x4y7(){ note_dtor("_ZN3ccc8CC13x4y7E", this);} // tgen
ccc::CC13x4y7 ::CC13x4y7(){ note_ctor("_ZN3ccc8CC13x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y7E, buf);
    ::ccc::CC13x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y7E);
    dp->::ccc::CC13x4y7::~CC13x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y7E(Test__ZN3ccc8CC13x4y7E, "_ZN3ccc8CC13x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y7C1Ev();
extern void _ZN3ccc8CC13x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y7E[] = {
  NSPAIR(_ZN3ccc8CC13x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x4y73abcEv();
extern void _ZN3ccc8CC13x4y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y73pqrEv,_ZThn4_N3ccc8CC13x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y73abcEv,_ZThn4_N3ccc8CC13x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y73pqrEv,_ZThn4_N3ccc8CC13x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y73abcEv,_ZThn4_N3ccc8CC13x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y7E[];
Class_Descriptor cd__ZN3ccc8CC13x4y7E = {  "_ZN3ccc8CC13x4y7E", // class name
  bases__ZN3ccc8CC13x4y7E, 2,
  &(vtc__ZN3ccc8CC13x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y8  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC13x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x4y83abcEv
  ~CC13x4y8(); // tgen
  CC13x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y8E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y83efgEv");}
void  ccc::CC13x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x4y83abcEv");}
ccc::CC13x4y8 ::~CC13x4y8(){ note_dtor("_ZN3ccc8CC13x4y8E", this);} // tgen
ccc::CC13x4y8 ::CC13x4y8(){ note_ctor("_ZN3ccc8CC13x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y8E, buf);
    ::ccc::CC13x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y8E);
    dp->::ccc::CC13x4y8::~CC13x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y8E(Test__ZN3ccc8CC13x4y8E, "_ZN3ccc8CC13x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y8C1Ev();
extern void _ZN3ccc8CC13x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y8E[] = {
  NSPAIR(_ZN3ccc8CC13x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y8E[];
extern void _ZN3ccc8CC13x4y83efgEv();
extern void _ZN3ccc8CC13x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y83abcEv,_ZThn4_N3ccc8CC13x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y83efgEv,_ZThn4_N3ccc8CC13x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y83abcEv,_ZThn4_N3ccc8CC13x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y83efgEv,_ZThn4_N3ccc8CC13x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y8E[];
Class_Descriptor cd__ZN3ccc8CC13x4y8E = {  "_ZN3ccc8CC13x4y8E", // class name
  bases__ZN3ccc8CC13x4y8E, 2,
  &(vtc__ZN3ccc8CC13x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y9  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC13x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x4y93pqrEv
  ~CC13x4y9(); // tgen
  CC13x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x4y9E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x4y93efgEv");}
void  ccc::CC13x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x4y93pqrEv");}
ccc::CC13x4y9 ::~CC13x4y9(){ note_dtor("_ZN3ccc8CC13x4y9E", this);} // tgen
ccc::CC13x4y9 ::CC13x4y9(){ note_ctor("_ZN3ccc8CC13x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x4y9E, buf);
    ::ccc::CC13x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x4y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC13x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x4y9E);
    dp->::ccc::CC13x4y9::~CC13x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x4y9E(Test__ZN3ccc8CC13x4y9E, "_ZN3ccc8CC13x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x4y9C1Ev();
extern void _ZN3ccc8CC13x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x4y9E[] = {
  NSPAIR(_ZN3ccc8CC13x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC13x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y9E[];
extern void _ZN3ccc8CC13x4y93efgEv();
extern void _ZN3ccc8CC13x4y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y93pqrEv,_ZThn4_N3ccc8CC13x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x4y93efgEv,_ZThn4_N3ccc8CC13x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x4y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y93pqrEv,_ZThn4_N3ccc8CC13x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x4y93efgEv,_ZThn4_N3ccc8CC13x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x4y9E[];
Class_Descriptor cd__ZN3ccc8CC13x4y9E = {  "_ZN3ccc8CC13x4y9E", // class name
  bases__ZN3ccc8CC13x4y9E, 2,
  &(vtc__ZN3ccc8CC13x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x4y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y10  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC13x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x4y103abcEv
  ~CC13x4y10(); // tgen
  CC13x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y10E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x4y103pqrEv");}
void  ccc::CC13x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x4y103abcEv");}
ccc::CC13x4y10 ::~CC13x4y10(){ note_dtor("_ZN3ccc9CC13x4y10E", this);} // tgen
ccc::CC13x4y10 ::CC13x4y10(){ note_ctor("_ZN3ccc9CC13x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y10E, buf);
    ::ccc::CC13x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y10E);
    dp->::ccc::CC13x4y10::~CC13x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y10E(Test__ZN3ccc9CC13x4y10E, "_ZN3ccc9CC13x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y10C1Ev();
extern void _ZN3ccc9CC13x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y10E[] = {
  NSPAIR(_ZN3ccc9CC13x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x4y103pqrEv();
extern void _ZN3ccc9CC13x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y103pqrEv,_ZThn4_N3ccc9CC13x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y103abcEv,_ZThn4_N3ccc9CC13x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y103pqrEv,_ZThn4_N3ccc9CC13x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y103abcEv,_ZThn4_N3ccc9CC13x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y10E[];
Class_Descriptor cd__ZN3ccc9CC13x4y10E = {  "_ZN3ccc9CC13x4y10E", // class name
  bases__ZN3ccc9CC13x4y10E, 2,
  &(vtc__ZN3ccc9CC13x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y11  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC13x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x4y113efgEv
  ~CC13x4y11(); // tgen
  CC13x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y11E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x4y113pqrEv");}
void  ccc::CC13x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x4y113efgEv");}
ccc::CC13x4y11 ::~CC13x4y11(){ note_dtor("_ZN3ccc9CC13x4y11E", this);} // tgen
ccc::CC13x4y11 ::CC13x4y11(){ note_ctor("_ZN3ccc9CC13x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y11E, buf);
    ::ccc::CC13x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y11E);
    dp->::ccc::CC13x4y11::~CC13x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y11E(Test__ZN3ccc9CC13x4y11E, "_ZN3ccc9CC13x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y11C1Ev();
extern void _ZN3ccc9CC13x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y11E[] = {
  NSPAIR(_ZN3ccc9CC13x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y11E[];
extern void _ZN3ccc9CC13x4y113efgEv();
extern void _ZN3ccc9CC13x4y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y113pqrEv,_ZThn4_N3ccc9CC13x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y113efgEv,_ZThn4_N3ccc9CC13x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y113pqrEv,_ZThn4_N3ccc9CC13x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y113efgEv,_ZThn4_N3ccc9CC13x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y11E[];
Class_Descriptor cd__ZN3ccc9CC13x4y11E = {  "_ZN3ccc9CC13x4y11E", // class name
  bases__ZN3ccc9CC13x4y11E, 2,
  &(vtc__ZN3ccc9CC13x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y12  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC13x4y123abcEv
  ~CC13x4y12(); // tgen
  CC13x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y12E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC13x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x4y123abcEv");}
ccc::CC13x4y12 ::~CC13x4y12(){ note_dtor("_ZN3ccc9CC13x4y12E", this);} // tgen
ccc::CC13x4y12 ::CC13x4y12(){ note_ctor("_ZN3ccc9CC13x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y12E, buf);
    ::ccc::CC13x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y12E);
    dp->::ccc::CC13x4y12::~CC13x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y12E(Test__ZN3ccc9CC13x4y12E, "_ZN3ccc9CC13x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y12C1Ev();
extern void _ZN3ccc9CC13x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y12E[] = {
  NSPAIR(_ZN3ccc9CC13x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y123abcEv,_ZThn4_N3ccc9CC13x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y123abcEv,_ZThn4_N3ccc9CC13x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y12E[];
Class_Descriptor cd__ZN3ccc9CC13x4y12E = {  "_ZN3ccc9CC13x4y12E", // class name
  bases__ZN3ccc9CC13x4y12E, 2,
  &(vtc__ZN3ccc9CC13x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y13  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC13x4y133efgEv
  ~CC13x4y13(); // tgen
  CC13x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y13E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x4y133efgEv");}
ccc::CC13x4y13 ::~CC13x4y13(){ note_dtor("_ZN3ccc9CC13x4y13E", this);} // tgen
ccc::CC13x4y13 ::CC13x4y13(){ note_ctor("_ZN3ccc9CC13x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y13E, buf);
    ::ccc::CC13x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y13E);
    dp->::ccc::CC13x4y13::~CC13x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y13E(Test__ZN3ccc9CC13x4y13E, "_ZN3ccc9CC13x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y13C1Ev();
extern void _ZN3ccc9CC13x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y13E[] = {
  NSPAIR(_ZN3ccc9CC13x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y13E[];
extern void _ZN3ccc9CC13x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y133efgEv,_ZThn4_N3ccc9CC13x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y133efgEv,_ZThn4_N3ccc9CC13x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y13E[];
Class_Descriptor cd__ZN3ccc9CC13x4y13E = {  "_ZN3ccc9CC13x4y13E", // class name
  bases__ZN3ccc9CC13x4y13E, 2,
  &(vtc__ZN3ccc9CC13x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y14  : ::ccc::AA13 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC13x4y143pqrEv
  ~CC13x4y14(); // tgen
  CC13x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y14E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x4y143pqrEv");}
ccc::CC13x4y14 ::~CC13x4y14(){ note_dtor("_ZN3ccc9CC13x4y14E", this);} // tgen
ccc::CC13x4y14 ::CC13x4y14(){ note_ctor("_ZN3ccc9CC13x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y14E, buf);
    ::ccc::CC13x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y14E);
    dp->::ccc::CC13x4y14::~CC13x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y14E(Test__ZN3ccc9CC13x4y14E, "_ZN3ccc9CC13x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y14C1Ev();
extern void _ZN3ccc9CC13x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y14E[] = {
  NSPAIR(_ZN3ccc9CC13x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x4y143pqrEv,_ZThn4_N3ccc9CC13x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x4y143pqrEv,_ZThn4_N3ccc9CC13x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y14E[];
Class_Descriptor cd__ZN3ccc9CC13x4y14E = {  "_ZN3ccc9CC13x4y14E", // class name
  bases__ZN3ccc9CC13x4y14E, 2,
  &(vtc__ZN3ccc9CC13x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x4y15  : ::ccc::AA13 , ::ccc::BB4 {
  ~CC13x4y15(); // tgen
  CC13x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x4y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x4y15 ::~CC13x4y15(){ note_dtor("_ZN3ccc9CC13x4y15E", this);} // tgen
ccc::CC13x4y15 ::CC13x4y15(){ note_ctor("_ZN3ccc9CC13x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x4y15E, buf);
    ::ccc::CC13x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x4y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC13x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x4y15E);
    dp->::ccc::CC13x4y15::~CC13x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x4y15E(Test__ZN3ccc9CC13x4y15E, "_ZN3ccc9CC13x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x4y15C1Ev();
extern void _ZN3ccc9CC13x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x4y15E[] = {
  NSPAIR(_ZN3ccc9CC13x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC13x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x4y15E[];
Class_Descriptor cd__ZN3ccc9CC13x4y15E = {  "_ZN3ccc9CC13x4y15E", // class name
  bases__ZN3ccc9CC13x4y15E, 2,
  &(vtc__ZN3ccc9CC13x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x4y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y0  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC13x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y03pqrEv
  ~CC13x5y0(); // tgen
  CC13x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y0E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y03abcEv");}
void  ccc::CC13x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y03efgEv");}
void  ccc::CC13x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y03pqrEv");}
ccc::CC13x5y0 ::~CC13x5y0(){ note_dtor("_ZN3ccc8CC13x5y0E", this);} // tgen
ccc::CC13x5y0 ::CC13x5y0(){ note_ctor("_ZN3ccc8CC13x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y0E, buf);
    ::ccc::CC13x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y0E);
    dp->::ccc::CC13x5y0::~CC13x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y0E(Test__ZN3ccc8CC13x5y0E, "_ZN3ccc8CC13x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y0C1Ev();
extern void _ZN3ccc8CC13x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y0E[] = {
  NSPAIR(_ZN3ccc8CC13x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y0E[];
extern void _ZN3ccc8CC13x5y03efgEv();
extern void _ZN3ccc8CC13x5y03abcEv();
extern void _ZN3ccc8CC13x5y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y03pqrEv,_ZThn4_N3ccc8CC13x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y03efgEv,_ZThn4_N3ccc8CC13x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y03abcEv,_ZThn4_N3ccc8CC13x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y03pqrEv,_ZThn4_N3ccc8CC13x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y03efgEv,_ZThn4_N3ccc8CC13x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y03abcEv,_ZThn4_N3ccc8CC13x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y0E[];
Class_Descriptor cd__ZN3ccc8CC13x5y0E = {  "_ZN3ccc8CC13x5y0E", // class name
  bases__ZN3ccc8CC13x5y0E, 2,
  &(vtc__ZN3ccc8CC13x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y1  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC13x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x5y13efgEv
  ~CC13x5y1(); // tgen
  CC13x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y1E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y13abcEv");}
void  ccc::CC13x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y13pqrEv");}
void  ccc::CC13x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y13efgEv");}
ccc::CC13x5y1 ::~CC13x5y1(){ note_dtor("_ZN3ccc8CC13x5y1E", this);} // tgen
ccc::CC13x5y1 ::CC13x5y1(){ note_ctor("_ZN3ccc8CC13x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y1E, buf);
    ::ccc::CC13x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y1E);
    dp->::ccc::CC13x5y1::~CC13x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y1E(Test__ZN3ccc8CC13x5y1E, "_ZN3ccc8CC13x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y1C1Ev();
extern void _ZN3ccc8CC13x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y1E[] = {
  NSPAIR(_ZN3ccc8CC13x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y1E[];
extern void _ZN3ccc8CC13x5y13efgEv();
extern void _ZN3ccc8CC13x5y13abcEv();
extern void _ZN3ccc8CC13x5y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y13pqrEv,_ZThn4_N3ccc8CC13x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y13efgEv,_ZThn4_N3ccc8CC13x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y13abcEv,_ZThn4_N3ccc8CC13x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y13pqrEv,_ZThn4_N3ccc8CC13x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y13efgEv,_ZThn4_N3ccc8CC13x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y13abcEv,_ZThn4_N3ccc8CC13x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y1E[];
Class_Descriptor cd__ZN3ccc8CC13x5y1E = {  "_ZN3ccc8CC13x5y1E", // class name
  bases__ZN3ccc8CC13x5y1E, 2,
  &(vtc__ZN3ccc8CC13x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y2  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC13x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y23pqrEv
  ~CC13x5y2(); // tgen
  CC13x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y2E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y23efgEv");}
void  ccc::CC13x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y23abcEv");}
void  ccc::CC13x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y23pqrEv");}
ccc::CC13x5y2 ::~CC13x5y2(){ note_dtor("_ZN3ccc8CC13x5y2E", this);} // tgen
ccc::CC13x5y2 ::CC13x5y2(){ note_ctor("_ZN3ccc8CC13x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y2E, buf);
    ::ccc::CC13x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y2E);
    dp->::ccc::CC13x5y2::~CC13x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y2E(Test__ZN3ccc8CC13x5y2E, "_ZN3ccc8CC13x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y2C1Ev();
extern void _ZN3ccc8CC13x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y2E[] = {
  NSPAIR(_ZN3ccc8CC13x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y2E[];
extern void _ZN3ccc8CC13x5y23efgEv();
extern void _ZN3ccc8CC13x5y23abcEv();
extern void _ZN3ccc8CC13x5y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y23pqrEv,_ZThn4_N3ccc8CC13x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y23efgEv,_ZThn4_N3ccc8CC13x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y23abcEv,_ZThn4_N3ccc8CC13x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y23pqrEv,_ZThn4_N3ccc8CC13x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y23efgEv,_ZThn4_N3ccc8CC13x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y23abcEv,_ZThn4_N3ccc8CC13x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y2E[];
Class_Descriptor cd__ZN3ccc8CC13x5y2E = {  "_ZN3ccc8CC13x5y2E", // class name
  bases__ZN3ccc8CC13x5y2E, 2,
  &(vtc__ZN3ccc8CC13x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y3  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC13x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x5y33abcEv
  ~CC13x5y3(); // tgen
  CC13x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y3E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y33efgEv");}
void  ccc::CC13x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y33pqrEv");}
void  ccc::CC13x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y33abcEv");}
ccc::CC13x5y3 ::~CC13x5y3(){ note_dtor("_ZN3ccc8CC13x5y3E", this);} // tgen
ccc::CC13x5y3 ::CC13x5y3(){ note_ctor("_ZN3ccc8CC13x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y3E, buf);
    ::ccc::CC13x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y3E);
    dp->::ccc::CC13x5y3::~CC13x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y3E(Test__ZN3ccc8CC13x5y3E, "_ZN3ccc8CC13x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y3C1Ev();
extern void _ZN3ccc8CC13x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y3E[] = {
  NSPAIR(_ZN3ccc8CC13x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y3E[];
extern void _ZN3ccc8CC13x5y33efgEv();
extern void _ZN3ccc8CC13x5y33pqrEv();
extern void _ZN3ccc8CC13x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y33pqrEv,_ZThn4_N3ccc8CC13x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y33efgEv,_ZThn4_N3ccc8CC13x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y33abcEv,_ZThn4_N3ccc8CC13x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y33pqrEv,_ZThn4_N3ccc8CC13x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y33efgEv,_ZThn4_N3ccc8CC13x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y33abcEv,_ZThn4_N3ccc8CC13x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y3E[];
Class_Descriptor cd__ZN3ccc8CC13x5y3E = {  "_ZN3ccc8CC13x5y3E", // class name
  bases__ZN3ccc8CC13x5y3E, 2,
  &(vtc__ZN3ccc8CC13x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y4  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC13x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x5y43efgEv
  ~CC13x5y4(); // tgen
  CC13x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y4E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y43pqrEv");}
void  ccc::CC13x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y43abcEv");}
void  ccc::CC13x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y43efgEv");}
ccc::CC13x5y4 ::~CC13x5y4(){ note_dtor("_ZN3ccc8CC13x5y4E", this);} // tgen
ccc::CC13x5y4 ::CC13x5y4(){ note_ctor("_ZN3ccc8CC13x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y4E, buf);
    ::ccc::CC13x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y4E);
    dp->::ccc::CC13x5y4::~CC13x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y4E(Test__ZN3ccc8CC13x5y4E, "_ZN3ccc8CC13x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y4C1Ev();
extern void _ZN3ccc8CC13x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y4E[] = {
  NSPAIR(_ZN3ccc8CC13x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y4E[];
extern void _ZN3ccc8CC13x5y43efgEv();
extern void _ZN3ccc8CC13x5y43pqrEv();
extern void _ZN3ccc8CC13x5y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y43pqrEv,_ZThn4_N3ccc8CC13x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y43efgEv,_ZThn4_N3ccc8CC13x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y43abcEv,_ZThn4_N3ccc8CC13x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y43pqrEv,_ZThn4_N3ccc8CC13x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y43efgEv,_ZThn4_N3ccc8CC13x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y43abcEv,_ZThn4_N3ccc8CC13x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y4E[];
Class_Descriptor cd__ZN3ccc8CC13x5y4E = {  "_ZN3ccc8CC13x5y4E", // class name
  bases__ZN3ccc8CC13x5y4E, 2,
  &(vtc__ZN3ccc8CC13x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y5  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC13x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x5y53abcEv
  ~CC13x5y5(); // tgen
  CC13x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y5E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y53pqrEv");}
void  ccc::CC13x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y53efgEv");}
void  ccc::CC13x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y53abcEv");}
ccc::CC13x5y5 ::~CC13x5y5(){ note_dtor("_ZN3ccc8CC13x5y5E", this);} // tgen
ccc::CC13x5y5 ::CC13x5y5(){ note_ctor("_ZN3ccc8CC13x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y5E, buf);
    ::ccc::CC13x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y5E);
    dp->::ccc::CC13x5y5::~CC13x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y5E(Test__ZN3ccc8CC13x5y5E, "_ZN3ccc8CC13x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y5C1Ev();
extern void _ZN3ccc8CC13x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y5E[] = {
  NSPAIR(_ZN3ccc8CC13x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y5E[];
extern void _ZN3ccc8CC13x5y53efgEv();
extern void _ZN3ccc8CC13x5y53pqrEv();
extern void _ZN3ccc8CC13x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y53pqrEv,_ZThn4_N3ccc8CC13x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y53efgEv,_ZThn4_N3ccc8CC13x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y53abcEv,_ZThn4_N3ccc8CC13x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y53pqrEv,_ZThn4_N3ccc8CC13x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y53efgEv,_ZThn4_N3ccc8CC13x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y53abcEv,_ZThn4_N3ccc8CC13x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y5E[];
Class_Descriptor cd__ZN3ccc8CC13x5y5E = {  "_ZN3ccc8CC13x5y5E", // class name
  bases__ZN3ccc8CC13x5y5E, 2,
  &(vtc__ZN3ccc8CC13x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y6  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC13x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x5y63efgEv
  ~CC13x5y6(); // tgen
  CC13x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y6E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y63abcEv");}
void  ccc::CC13x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y63efgEv");}
ccc::CC13x5y6 ::~CC13x5y6(){ note_dtor("_ZN3ccc8CC13x5y6E", this);} // tgen
ccc::CC13x5y6 ::CC13x5y6(){ note_ctor("_ZN3ccc8CC13x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y6E, buf);
    ::ccc::CC13x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y6E);
    dp->::ccc::CC13x5y6::~CC13x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y6E(Test__ZN3ccc8CC13x5y6E, "_ZN3ccc8CC13x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y6C1Ev();
extern void _ZN3ccc8CC13x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y6E[] = {
  NSPAIR(_ZN3ccc8CC13x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y6E[];
extern void _ZN3ccc8CC13x5y63efgEv();
extern void _ZN3ccc8CC13x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y63efgEv,_ZThn4_N3ccc8CC13x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y63abcEv,_ZThn4_N3ccc8CC13x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y63efgEv,_ZThn4_N3ccc8CC13x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y63abcEv,_ZThn4_N3ccc8CC13x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y6E[];
Class_Descriptor cd__ZN3ccc8CC13x5y6E = {  "_ZN3ccc8CC13x5y6E", // class name
  bases__ZN3ccc8CC13x5y6E, 2,
  &(vtc__ZN3ccc8CC13x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y7  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC13x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y73pqrEv
  ~CC13x5y7(); // tgen
  CC13x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y7E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y73abcEv");}
void  ccc::CC13x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y73pqrEv");}
ccc::CC13x5y7 ::~CC13x5y7(){ note_dtor("_ZN3ccc8CC13x5y7E", this);} // tgen
ccc::CC13x5y7 ::CC13x5y7(){ note_ctor("_ZN3ccc8CC13x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y7E, buf);
    ::ccc::CC13x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y7E);
    dp->::ccc::CC13x5y7::~CC13x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y7E(Test__ZN3ccc8CC13x5y7E, "_ZN3ccc8CC13x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y7C1Ev();
extern void _ZN3ccc8CC13x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y7E[] = {
  NSPAIR(_ZN3ccc8CC13x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x5y73abcEv();
extern void _ZN3ccc8CC13x5y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y73pqrEv,_ZThn4_N3ccc8CC13x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y73abcEv,_ZThn4_N3ccc8CC13x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y73pqrEv,_ZThn4_N3ccc8CC13x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y73abcEv,_ZThn4_N3ccc8CC13x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y7E[];
Class_Descriptor cd__ZN3ccc8CC13x5y7E = {  "_ZN3ccc8CC13x5y7E", // class name
  bases__ZN3ccc8CC13x5y7E, 2,
  &(vtc__ZN3ccc8CC13x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y7E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y8  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC13x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x5y83abcEv
  ~CC13x5y8(); // tgen
  CC13x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y8E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y83efgEv");}
void  ccc::CC13x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x5y83abcEv");}
ccc::CC13x5y8 ::~CC13x5y8(){ note_dtor("_ZN3ccc8CC13x5y8E", this);} // tgen
ccc::CC13x5y8 ::CC13x5y8(){ note_ctor("_ZN3ccc8CC13x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y8E, buf);
    ::ccc::CC13x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y8E);
    dp->::ccc::CC13x5y8::~CC13x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y8E(Test__ZN3ccc8CC13x5y8E, "_ZN3ccc8CC13x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y8C1Ev();
extern void _ZN3ccc8CC13x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y8E[] = {
  NSPAIR(_ZN3ccc8CC13x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y8E[];
extern void _ZN3ccc8CC13x5y83efgEv();
extern void _ZN3ccc8CC13x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y83efgEv,_ZThn4_N3ccc8CC13x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y83abcEv,_ZThn4_N3ccc8CC13x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y83efgEv,_ZThn4_N3ccc8CC13x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y83abcEv,_ZThn4_N3ccc8CC13x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y8E[];
Class_Descriptor cd__ZN3ccc8CC13x5y8E = {  "_ZN3ccc8CC13x5y8E", // class name
  bases__ZN3ccc8CC13x5y8E, 2,
  &(vtc__ZN3ccc8CC13x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y9  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC13x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x5y93pqrEv
  ~CC13x5y9(); // tgen
  CC13x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x5y9E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x5y93efgEv");}
void  ccc::CC13x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x5y93pqrEv");}
ccc::CC13x5y9 ::~CC13x5y9(){ note_dtor("_ZN3ccc8CC13x5y9E", this);} // tgen
ccc::CC13x5y9 ::CC13x5y9(){ note_ctor("_ZN3ccc8CC13x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x5y9E, buf);
    ::ccc::CC13x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x5y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC13x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x5y9E);
    dp->::ccc::CC13x5y9::~CC13x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x5y9E(Test__ZN3ccc8CC13x5y9E, "_ZN3ccc8CC13x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x5y9C1Ev();
extern void _ZN3ccc8CC13x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x5y9E[] = {
  NSPAIR(_ZN3ccc8CC13x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC13x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y9E[];
extern void _ZN3ccc8CC13x5y93efgEv();
extern void _ZN3ccc8CC13x5y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y93pqrEv,_ZThn4_N3ccc8CC13x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x5y93efgEv,_ZThn4_N3ccc8CC13x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x5y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y93pqrEv,_ZThn4_N3ccc8CC13x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x5y93efgEv,_ZThn4_N3ccc8CC13x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x5y9E[];
Class_Descriptor cd__ZN3ccc8CC13x5y9E = {  "_ZN3ccc8CC13x5y9E", // class name
  bases__ZN3ccc8CC13x5y9E, 2,
  &(vtc__ZN3ccc8CC13x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x5y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y10  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC13x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x5y103abcEv
  ~CC13x5y10(); // tgen
  CC13x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y10E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x5y103pqrEv");}
void  ccc::CC13x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x5y103abcEv");}
ccc::CC13x5y10 ::~CC13x5y10(){ note_dtor("_ZN3ccc9CC13x5y10E", this);} // tgen
ccc::CC13x5y10 ::CC13x5y10(){ note_ctor("_ZN3ccc9CC13x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y10E, buf);
    ::ccc::CC13x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y10E);
    dp->::ccc::CC13x5y10::~CC13x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y10E(Test__ZN3ccc9CC13x5y10E, "_ZN3ccc9CC13x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y10C1Ev();
extern void _ZN3ccc9CC13x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y10E[] = {
  NSPAIR(_ZN3ccc9CC13x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x5y103pqrEv();
extern void _ZN3ccc9CC13x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y103pqrEv,_ZThn4_N3ccc9CC13x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y103abcEv,_ZThn4_N3ccc9CC13x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y103pqrEv,_ZThn4_N3ccc9CC13x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y103abcEv,_ZThn4_N3ccc9CC13x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y10E[];
Class_Descriptor cd__ZN3ccc9CC13x5y10E = {  "_ZN3ccc9CC13x5y10E", // class name
  bases__ZN3ccc9CC13x5y10E, 2,
  &(vtc__ZN3ccc9CC13x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y10E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y11  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC13x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x5y113efgEv
  ~CC13x5y11(); // tgen
  CC13x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y11E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x5y113pqrEv");}
void  ccc::CC13x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x5y113efgEv");}
ccc::CC13x5y11 ::~CC13x5y11(){ note_dtor("_ZN3ccc9CC13x5y11E", this);} // tgen
ccc::CC13x5y11 ::CC13x5y11(){ note_ctor("_ZN3ccc9CC13x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y11E, buf);
    ::ccc::CC13x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y11E);
    dp->::ccc::CC13x5y11::~CC13x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y11E(Test__ZN3ccc9CC13x5y11E, "_ZN3ccc9CC13x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y11C1Ev();
extern void _ZN3ccc9CC13x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y11E[] = {
  NSPAIR(_ZN3ccc9CC13x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y11E[];
extern void _ZN3ccc9CC13x5y113efgEv();
extern void _ZN3ccc9CC13x5y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y113pqrEv,_ZThn4_N3ccc9CC13x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y113efgEv,_ZThn4_N3ccc9CC13x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y113pqrEv,_ZThn4_N3ccc9CC13x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y113efgEv,_ZThn4_N3ccc9CC13x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y11E[];
Class_Descriptor cd__ZN3ccc9CC13x5y11E = {  "_ZN3ccc9CC13x5y11E", // class name
  bases__ZN3ccc9CC13x5y11E, 2,
  &(vtc__ZN3ccc9CC13x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y12  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC13x5y123abcEv
  ~CC13x5y12(); // tgen
  CC13x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y12E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC13x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x5y123abcEv");}
ccc::CC13x5y12 ::~CC13x5y12(){ note_dtor("_ZN3ccc9CC13x5y12E", this);} // tgen
ccc::CC13x5y12 ::CC13x5y12(){ note_ctor("_ZN3ccc9CC13x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y12E, buf);
    ::ccc::CC13x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y12E);
    dp->::ccc::CC13x5y12::~CC13x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y12E(Test__ZN3ccc9CC13x5y12E, "_ZN3ccc9CC13x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y12C1Ev();
extern void _ZN3ccc9CC13x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y12E[] = {
  NSPAIR(_ZN3ccc9CC13x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y123abcEv,_ZThn4_N3ccc9CC13x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y123abcEv,_ZThn4_N3ccc9CC13x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y12E[];
Class_Descriptor cd__ZN3ccc9CC13x5y12E = {  "_ZN3ccc9CC13x5y12E", // class name
  bases__ZN3ccc9CC13x5y12E, 2,
  &(vtc__ZN3ccc9CC13x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y13  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC13x5y133efgEv
  ~CC13x5y13(); // tgen
  CC13x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y13E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x5y133efgEv");}
ccc::CC13x5y13 ::~CC13x5y13(){ note_dtor("_ZN3ccc9CC13x5y13E", this);} // tgen
ccc::CC13x5y13 ::CC13x5y13(){ note_ctor("_ZN3ccc9CC13x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y13E, buf);
    ::ccc::CC13x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y13E);
    dp->::ccc::CC13x5y13::~CC13x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y13E(Test__ZN3ccc9CC13x5y13E, "_ZN3ccc9CC13x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y13C1Ev();
extern void _ZN3ccc9CC13x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y13E[] = {
  NSPAIR(_ZN3ccc9CC13x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y13E[];
extern void _ZN3ccc9CC13x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y133efgEv,_ZThn4_N3ccc9CC13x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y133efgEv,_ZThn4_N3ccc9CC13x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y13E[];
Class_Descriptor cd__ZN3ccc9CC13x5y13E = {  "_ZN3ccc9CC13x5y13E", // class name
  bases__ZN3ccc9CC13x5y13E, 2,
  &(vtc__ZN3ccc9CC13x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y14  : ::ccc::AA13 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC13x5y143pqrEv
  ~CC13x5y14(); // tgen
  CC13x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y14E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x5y143pqrEv");}
ccc::CC13x5y14 ::~CC13x5y14(){ note_dtor("_ZN3ccc9CC13x5y14E", this);} // tgen
ccc::CC13x5y14 ::CC13x5y14(){ note_ctor("_ZN3ccc9CC13x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y14E, buf);
    ::ccc::CC13x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y14E);
    dp->::ccc::CC13x5y14::~CC13x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y14E(Test__ZN3ccc9CC13x5y14E, "_ZN3ccc9CC13x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y14C1Ev();
extern void _ZN3ccc9CC13x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y14E[] = {
  NSPAIR(_ZN3ccc9CC13x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x5y143pqrEv,_ZThn4_N3ccc9CC13x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x5y143pqrEv,_ZThn4_N3ccc9CC13x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y14E[];
Class_Descriptor cd__ZN3ccc9CC13x5y14E = {  "_ZN3ccc9CC13x5y14E", // class name
  bases__ZN3ccc9CC13x5y14E, 2,
  &(vtc__ZN3ccc9CC13x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y14E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x5y15  : ::ccc::AA13 , ::ccc::BB5 {
  ~CC13x5y15(); // tgen
  CC13x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x5y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC13x5y15 ::~CC13x5y15(){ note_dtor("_ZN3ccc9CC13x5y15E", this);} // tgen
ccc::CC13x5y15 ::CC13x5y15(){ note_ctor("_ZN3ccc9CC13x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x5y15E, buf);
    ::ccc::CC13x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x5y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC13x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x5y15E);
    dp->::ccc::CC13x5y15::~CC13x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x5y15E(Test__ZN3ccc9CC13x5y15E, "_ZN3ccc9CC13x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x5y15C1Ev();
extern void _ZN3ccc9CC13x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x5y15E[] = {
  NSPAIR(_ZN3ccc9CC13x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC13x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x5y15E[];
Class_Descriptor cd__ZN3ccc9CC13x5y15E = {  "_ZN3ccc9CC13x5y15E", // class name
  bases__ZN3ccc9CC13x5y15E, 2,
  &(vtc__ZN3ccc9CC13x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x5y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y0  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC13x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y03pqrEv
  ~CC13x6y0(); // tgen
  CC13x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y0E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y03abcEv");}
void  ccc::CC13x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y03efgEv");}
void  ccc::CC13x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y03pqrEv");}
ccc::CC13x6y0 ::~CC13x6y0(){ note_dtor("_ZN3ccc8CC13x6y0E", this);} // tgen
ccc::CC13x6y0 ::CC13x6y0(){ note_ctor("_ZN3ccc8CC13x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y0E, buf);
    ::ccc::CC13x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y0E);
    dp->::ccc::CC13x6y0::~CC13x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y0E(Test__ZN3ccc8CC13x6y0E, "_ZN3ccc8CC13x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y0C1Ev();
extern void _ZN3ccc8CC13x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y0E[] = {
  NSPAIR(_ZN3ccc8CC13x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y0E[];
extern void _ZN3ccc8CC13x6y03efgEv();
extern void _ZN3ccc8CC13x6y03abcEv();
extern void _ZN3ccc8CC13x6y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y03abcEv,_ZThn4_N3ccc8CC13x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y03efgEv,_ZThn4_N3ccc8CC13x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y03abcEv,_ZThn4_N3ccc8CC13x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y03efgEv,_ZThn4_N3ccc8CC13x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y0E[];
Class_Descriptor cd__ZN3ccc8CC13x6y0E = {  "_ZN3ccc8CC13x6y0E", // class name
  bases__ZN3ccc8CC13x6y0E, 2,
  &(vtc__ZN3ccc8CC13x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y1  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC13x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x6y13efgEv
  ~CC13x6y1(); // tgen
  CC13x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y1E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y13abcEv");}
void  ccc::CC13x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y13pqrEv");}
void  ccc::CC13x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y13efgEv");}
ccc::CC13x6y1 ::~CC13x6y1(){ note_dtor("_ZN3ccc8CC13x6y1E", this);} // tgen
ccc::CC13x6y1 ::CC13x6y1(){ note_ctor("_ZN3ccc8CC13x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y1E, buf);
    ::ccc::CC13x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y1E);
    dp->::ccc::CC13x6y1::~CC13x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y1E(Test__ZN3ccc8CC13x6y1E, "_ZN3ccc8CC13x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y1C1Ev();
extern void _ZN3ccc8CC13x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y1E[] = {
  NSPAIR(_ZN3ccc8CC13x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y1E[];
extern void _ZN3ccc8CC13x6y13efgEv();
extern void _ZN3ccc8CC13x6y13abcEv();
extern void _ZN3ccc8CC13x6y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y13abcEv,_ZThn4_N3ccc8CC13x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y13efgEv,_ZThn4_N3ccc8CC13x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y13abcEv,_ZThn4_N3ccc8CC13x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y13efgEv,_ZThn4_N3ccc8CC13x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y1E[];
Class_Descriptor cd__ZN3ccc8CC13x6y1E = {  "_ZN3ccc8CC13x6y1E", // class name
  bases__ZN3ccc8CC13x6y1E, 2,
  &(vtc__ZN3ccc8CC13x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y2  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC13x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y23pqrEv
  ~CC13x6y2(); // tgen
  CC13x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y2E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y23efgEv");}
void  ccc::CC13x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y23abcEv");}
void  ccc::CC13x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y23pqrEv");}
ccc::CC13x6y2 ::~CC13x6y2(){ note_dtor("_ZN3ccc8CC13x6y2E", this);} // tgen
ccc::CC13x6y2 ::CC13x6y2(){ note_ctor("_ZN3ccc8CC13x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y2E, buf);
    ::ccc::CC13x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y2E);
    dp->::ccc::CC13x6y2::~CC13x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y2E(Test__ZN3ccc8CC13x6y2E, "_ZN3ccc8CC13x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y2C1Ev();
extern void _ZN3ccc8CC13x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y2E[] = {
  NSPAIR(_ZN3ccc8CC13x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y2E[];
extern void _ZN3ccc8CC13x6y23efgEv();
extern void _ZN3ccc8CC13x6y23abcEv();
extern void _ZN3ccc8CC13x6y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y23abcEv,_ZThn4_N3ccc8CC13x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y23efgEv,_ZThn4_N3ccc8CC13x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y23abcEv,_ZThn4_N3ccc8CC13x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y23efgEv,_ZThn4_N3ccc8CC13x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y2E[];
Class_Descriptor cd__ZN3ccc8CC13x6y2E = {  "_ZN3ccc8CC13x6y2E", // class name
  bases__ZN3ccc8CC13x6y2E, 2,
  &(vtc__ZN3ccc8CC13x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y3  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC13x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x6y33abcEv
  ~CC13x6y3(); // tgen
  CC13x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y3E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y33efgEv");}
void  ccc::CC13x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y33pqrEv");}
void  ccc::CC13x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y33abcEv");}
ccc::CC13x6y3 ::~CC13x6y3(){ note_dtor("_ZN3ccc8CC13x6y3E", this);} // tgen
ccc::CC13x6y3 ::CC13x6y3(){ note_ctor("_ZN3ccc8CC13x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y3E, buf);
    ::ccc::CC13x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y3E);
    dp->::ccc::CC13x6y3::~CC13x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y3E(Test__ZN3ccc8CC13x6y3E, "_ZN3ccc8CC13x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y3C1Ev();
extern void _ZN3ccc8CC13x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y3E[] = {
  NSPAIR(_ZN3ccc8CC13x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y3E[];
extern void _ZN3ccc8CC13x6y33efgEv();
extern void _ZN3ccc8CC13x6y33pqrEv();
extern void _ZN3ccc8CC13x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y33abcEv,_ZThn4_N3ccc8CC13x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y33efgEv,_ZThn4_N3ccc8CC13x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y33abcEv,_ZThn4_N3ccc8CC13x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y33efgEv,_ZThn4_N3ccc8CC13x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y3E[];
Class_Descriptor cd__ZN3ccc8CC13x6y3E = {  "_ZN3ccc8CC13x6y3E", // class name
  bases__ZN3ccc8CC13x6y3E, 2,
  &(vtc__ZN3ccc8CC13x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y4  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC13x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x6y43efgEv
  ~CC13x6y4(); // tgen
  CC13x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y4E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y43pqrEv");}
void  ccc::CC13x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y43abcEv");}
void  ccc::CC13x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y43efgEv");}
ccc::CC13x6y4 ::~CC13x6y4(){ note_dtor("_ZN3ccc8CC13x6y4E", this);} // tgen
ccc::CC13x6y4 ::CC13x6y4(){ note_ctor("_ZN3ccc8CC13x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y4E, buf);
    ::ccc::CC13x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y4E);
    dp->::ccc::CC13x6y4::~CC13x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y4E(Test__ZN3ccc8CC13x6y4E, "_ZN3ccc8CC13x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y4C1Ev();
extern void _ZN3ccc8CC13x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y4E[] = {
  NSPAIR(_ZN3ccc8CC13x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y4E[];
extern void _ZN3ccc8CC13x6y43efgEv();
extern void _ZN3ccc8CC13x6y43pqrEv();
extern void _ZN3ccc8CC13x6y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y43abcEv,_ZThn4_N3ccc8CC13x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y43efgEv,_ZThn4_N3ccc8CC13x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y43abcEv,_ZThn4_N3ccc8CC13x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y43efgEv,_ZThn4_N3ccc8CC13x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y4E[];
Class_Descriptor cd__ZN3ccc8CC13x6y4E = {  "_ZN3ccc8CC13x6y4E", // class name
  bases__ZN3ccc8CC13x6y4E, 2,
  &(vtc__ZN3ccc8CC13x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y5  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC13x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x6y53abcEv
  ~CC13x6y5(); // tgen
  CC13x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y5E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y53pqrEv");}
void  ccc::CC13x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y53efgEv");}
void  ccc::CC13x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y53abcEv");}
ccc::CC13x6y5 ::~CC13x6y5(){ note_dtor("_ZN3ccc8CC13x6y5E", this);} // tgen
ccc::CC13x6y5 ::CC13x6y5(){ note_ctor("_ZN3ccc8CC13x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y5E, buf);
    ::ccc::CC13x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y5E);
    dp->::ccc::CC13x6y5::~CC13x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y5E(Test__ZN3ccc8CC13x6y5E, "_ZN3ccc8CC13x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y5C1Ev();
extern void _ZN3ccc8CC13x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y5E[] = {
  NSPAIR(_ZN3ccc8CC13x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y5E[];
extern void _ZN3ccc8CC13x6y53efgEv();
extern void _ZN3ccc8CC13x6y53pqrEv();
extern void _ZN3ccc8CC13x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y53abcEv,_ZThn4_N3ccc8CC13x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y53efgEv,_ZThn4_N3ccc8CC13x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y53abcEv,_ZThn4_N3ccc8CC13x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y53efgEv,_ZThn4_N3ccc8CC13x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y5E[];
Class_Descriptor cd__ZN3ccc8CC13x6y5E = {  "_ZN3ccc8CC13x6y5E", // class name
  bases__ZN3ccc8CC13x6y5E, 2,
  &(vtc__ZN3ccc8CC13x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y6  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC13x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x6y63efgEv
  ~CC13x6y6(); // tgen
  CC13x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y6E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y63abcEv");}
void  ccc::CC13x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y63efgEv");}
ccc::CC13x6y6 ::~CC13x6y6(){ note_dtor("_ZN3ccc8CC13x6y6E", this);} // tgen
ccc::CC13x6y6 ::CC13x6y6(){ note_ctor("_ZN3ccc8CC13x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y6E, buf);
    ::ccc::CC13x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y6E);
    dp->::ccc::CC13x6y6::~CC13x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y6E(Test__ZN3ccc8CC13x6y6E, "_ZN3ccc8CC13x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y6C1Ev();
extern void _ZN3ccc8CC13x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y6E[] = {
  NSPAIR(_ZN3ccc8CC13x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y6E[];
extern void _ZN3ccc8CC13x6y63efgEv();
extern void _ZN3ccc8CC13x6y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y63abcEv,_ZThn4_N3ccc8CC13x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y63efgEv,_ZThn4_N3ccc8CC13x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y63abcEv,_ZThn4_N3ccc8CC13x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y63efgEv,_ZThn4_N3ccc8CC13x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y6E[];
Class_Descriptor cd__ZN3ccc8CC13x6y6E = {  "_ZN3ccc8CC13x6y6E", // class name
  bases__ZN3ccc8CC13x6y6E, 2,
  &(vtc__ZN3ccc8CC13x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y7  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC13x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y73pqrEv
  ~CC13x6y7(); // tgen
  CC13x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y7E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y73abcEv");}
void  ccc::CC13x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y73pqrEv");}
ccc::CC13x6y7 ::~CC13x6y7(){ note_dtor("_ZN3ccc8CC13x6y7E", this);} // tgen
ccc::CC13x6y7 ::CC13x6y7(){ note_ctor("_ZN3ccc8CC13x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y7E, buf);
    ::ccc::CC13x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y7E);
    dp->::ccc::CC13x6y7::~CC13x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y7E(Test__ZN3ccc8CC13x6y7E, "_ZN3ccc8CC13x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y7C1Ev();
extern void _ZN3ccc8CC13x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y7E[] = {
  NSPAIR(_ZN3ccc8CC13x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x6y73abcEv();
extern void _ZN3ccc8CC13x6y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y73abcEv,_ZThn4_N3ccc8CC13x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y73abcEv,_ZThn4_N3ccc8CC13x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y7E[];
Class_Descriptor cd__ZN3ccc8CC13x6y7E = {  "_ZN3ccc8CC13x6y7E", // class name
  bases__ZN3ccc8CC13x6y7E, 2,
  &(vtc__ZN3ccc8CC13x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y8  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC13x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x6y83abcEv
  ~CC13x6y8(); // tgen
  CC13x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y8E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y83efgEv");}
void  ccc::CC13x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x6y83abcEv");}
ccc::CC13x6y8 ::~CC13x6y8(){ note_dtor("_ZN3ccc8CC13x6y8E", this);} // tgen
ccc::CC13x6y8 ::CC13x6y8(){ note_ctor("_ZN3ccc8CC13x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y8E, buf);
    ::ccc::CC13x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y8E);
    dp->::ccc::CC13x6y8::~CC13x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y8E(Test__ZN3ccc8CC13x6y8E, "_ZN3ccc8CC13x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y8C1Ev();
extern void _ZN3ccc8CC13x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y8E[] = {
  NSPAIR(_ZN3ccc8CC13x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y8E[];
extern void _ZN3ccc8CC13x6y83efgEv();
extern void _ZN3ccc8CC13x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y83abcEv,_ZThn4_N3ccc8CC13x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y83efgEv,_ZThn4_N3ccc8CC13x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y83abcEv,_ZThn4_N3ccc8CC13x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y83efgEv,_ZThn4_N3ccc8CC13x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y8E[];
Class_Descriptor cd__ZN3ccc8CC13x6y8E = {  "_ZN3ccc8CC13x6y8E", // class name
  bases__ZN3ccc8CC13x6y8E, 2,
  &(vtc__ZN3ccc8CC13x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y9  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC13x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x6y93pqrEv
  ~CC13x6y9(); // tgen
  CC13x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x6y9E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x6y93efgEv");}
void  ccc::CC13x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x6y93pqrEv");}
ccc::CC13x6y9 ::~CC13x6y9(){ note_dtor("_ZN3ccc8CC13x6y9E", this);} // tgen
ccc::CC13x6y9 ::CC13x6y9(){ note_ctor("_ZN3ccc8CC13x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x6y9E, buf);
    ::ccc::CC13x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x6y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC13x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x6y9E);
    dp->::ccc::CC13x6y9::~CC13x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x6y9E(Test__ZN3ccc8CC13x6y9E, "_ZN3ccc8CC13x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x6y9C1Ev();
extern void _ZN3ccc8CC13x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x6y9E[] = {
  NSPAIR(_ZN3ccc8CC13x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC13x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y9E[];
extern void _ZN3ccc8CC13x6y93efgEv();
extern void _ZN3ccc8CC13x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x6y93efgEv,_ZThn4_N3ccc8CC13x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x6y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x6y93efgEv,_ZThn4_N3ccc8CC13x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x6y9E[];
Class_Descriptor cd__ZN3ccc8CC13x6y9E = {  "_ZN3ccc8CC13x6y9E", // class name
  bases__ZN3ccc8CC13x6y9E, 2,
  &(vtc__ZN3ccc8CC13x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x6y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y10  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC13x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x6y103abcEv
  ~CC13x6y10(); // tgen
  CC13x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y10E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x6y103pqrEv");}
void  ccc::CC13x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x6y103abcEv");}
ccc::CC13x6y10 ::~CC13x6y10(){ note_dtor("_ZN3ccc9CC13x6y10E", this);} // tgen
ccc::CC13x6y10 ::CC13x6y10(){ note_ctor("_ZN3ccc9CC13x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y10E, buf);
    ::ccc::CC13x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y10E);
    dp->::ccc::CC13x6y10::~CC13x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y10E(Test__ZN3ccc9CC13x6y10E, "_ZN3ccc9CC13x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y10C1Ev();
extern void _ZN3ccc9CC13x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y10E[] = {
  NSPAIR(_ZN3ccc9CC13x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x6y103pqrEv();
extern void _ZN3ccc9CC13x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x6y103abcEv,_ZThn4_N3ccc9CC13x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x6y103abcEv,_ZThn4_N3ccc9CC13x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y10E[];
Class_Descriptor cd__ZN3ccc9CC13x6y10E = {  "_ZN3ccc9CC13x6y10E", // class name
  bases__ZN3ccc9CC13x6y10E, 2,
  &(vtc__ZN3ccc9CC13x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y11  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC13x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x6y113efgEv
  ~CC13x6y11(); // tgen
  CC13x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y11E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x6y113pqrEv");}
void  ccc::CC13x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x6y113efgEv");}
ccc::CC13x6y11 ::~CC13x6y11(){ note_dtor("_ZN3ccc9CC13x6y11E", this);} // tgen
ccc::CC13x6y11 ::CC13x6y11(){ note_ctor("_ZN3ccc9CC13x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y11E, buf);
    ::ccc::CC13x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y11E);
    dp->::ccc::CC13x6y11::~CC13x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y11E(Test__ZN3ccc9CC13x6y11E, "_ZN3ccc9CC13x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y11C1Ev();
extern void _ZN3ccc9CC13x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y11E[] = {
  NSPAIR(_ZN3ccc9CC13x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y11E[];
extern void _ZN3ccc9CC13x6y113efgEv();
extern void _ZN3ccc9CC13x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x6y113efgEv,_ZThn4_N3ccc9CC13x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x6y113efgEv,_ZThn4_N3ccc9CC13x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y11E[];
Class_Descriptor cd__ZN3ccc9CC13x6y11E = {  "_ZN3ccc9CC13x6y11E", // class name
  bases__ZN3ccc9CC13x6y11E, 2,
  &(vtc__ZN3ccc9CC13x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y12  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC13x6y123abcEv
  ~CC13x6y12(); // tgen
  CC13x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y12E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x6y123abcEv");}
ccc::CC13x6y12 ::~CC13x6y12(){ note_dtor("_ZN3ccc9CC13x6y12E", this);} // tgen
ccc::CC13x6y12 ::CC13x6y12(){ note_ctor("_ZN3ccc9CC13x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y12E, buf);
    ::ccc::CC13x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y12E);
    dp->::ccc::CC13x6y12::~CC13x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y12E(Test__ZN3ccc9CC13x6y12E, "_ZN3ccc9CC13x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y12C1Ev();
extern void _ZN3ccc9CC13x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y12E[] = {
  NSPAIR(_ZN3ccc9CC13x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x6y123abcEv,_ZThn4_N3ccc9CC13x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x6y123abcEv,_ZThn4_N3ccc9CC13x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y12E[];
Class_Descriptor cd__ZN3ccc9CC13x6y12E = {  "_ZN3ccc9CC13x6y12E", // class name
  bases__ZN3ccc9CC13x6y12E, 2,
  &(vtc__ZN3ccc9CC13x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y13  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC13x6y133efgEv
  ~CC13x6y13(); // tgen
  CC13x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y13E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC13x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x6y133efgEv");}
ccc::CC13x6y13 ::~CC13x6y13(){ note_dtor("_ZN3ccc9CC13x6y13E", this);} // tgen
ccc::CC13x6y13 ::CC13x6y13(){ note_ctor("_ZN3ccc9CC13x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y13E, buf);
    ::ccc::CC13x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y13E);
    dp->::ccc::CC13x6y13::~CC13x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y13E(Test__ZN3ccc9CC13x6y13E, "_ZN3ccc9CC13x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y13C1Ev();
extern void _ZN3ccc9CC13x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y13E[] = {
  NSPAIR(_ZN3ccc9CC13x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y13E[];
extern void _ZN3ccc9CC13x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x6y133efgEv,_ZThn4_N3ccc9CC13x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x6y133efgEv,_ZThn4_N3ccc9CC13x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y13E[];
Class_Descriptor cd__ZN3ccc9CC13x6y13E = {  "_ZN3ccc9CC13x6y13E", // class name
  bases__ZN3ccc9CC13x6y13E, 2,
  &(vtc__ZN3ccc9CC13x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y14  : ::ccc::AA13 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC13x6y143pqrEv
  ~CC13x6y14(); // tgen
  CC13x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y14E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x6y143pqrEv");}
ccc::CC13x6y14 ::~CC13x6y14(){ note_dtor("_ZN3ccc9CC13x6y14E", this);} // tgen
ccc::CC13x6y14 ::CC13x6y14(){ note_ctor("_ZN3ccc9CC13x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y14E, buf);
    ::ccc::CC13x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y14E);
    dp->::ccc::CC13x6y14::~CC13x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y14E(Test__ZN3ccc9CC13x6y14E, "_ZN3ccc9CC13x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y14C1Ev();
extern void _ZN3ccc9CC13x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y14E[] = {
  NSPAIR(_ZN3ccc9CC13x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y14E[];
Class_Descriptor cd__ZN3ccc9CC13x6y14E = {  "_ZN3ccc9CC13x6y14E", // class name
  bases__ZN3ccc9CC13x6y14E, 2,
  &(vtc__ZN3ccc9CC13x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x6y15  : ::ccc::AA13 , ::ccc::BB6 {
  ~CC13x6y15(); // tgen
  CC13x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x6y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x6y15 ::~CC13x6y15(){ note_dtor("_ZN3ccc9CC13x6y15E", this);} // tgen
ccc::CC13x6y15 ::CC13x6y15(){ note_ctor("_ZN3ccc9CC13x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x6y15E, buf);
    ::ccc::CC13x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x6y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC13x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x6y15E);
    dp->::ccc::CC13x6y15::~CC13x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x6y15E(Test__ZN3ccc9CC13x6y15E, "_ZN3ccc9CC13x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x6y15C1Ev();
extern void _ZN3ccc9CC13x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x6y15E[] = {
  NSPAIR(_ZN3ccc9CC13x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC13x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x6y15E[];
Class_Descriptor cd__ZN3ccc9CC13x6y15E = {  "_ZN3ccc9CC13x6y15E", // class name
  bases__ZN3ccc9CC13x6y15E, 2,
  &(vtc__ZN3ccc9CC13x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x6y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y0  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC13x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y03pqrEv
  ~CC13x7y0(); // tgen
  CC13x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y0E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y03abcEv");}
void  ccc::CC13x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y03efgEv");}
void  ccc::CC13x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y03pqrEv");}
ccc::CC13x7y0 ::~CC13x7y0(){ note_dtor("_ZN3ccc8CC13x7y0E", this);} // tgen
ccc::CC13x7y0 ::CC13x7y0(){ note_ctor("_ZN3ccc8CC13x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y0E, buf);
    ::ccc::CC13x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y0E);
    dp->::ccc::CC13x7y0::~CC13x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y0E(Test__ZN3ccc8CC13x7y0E, "_ZN3ccc8CC13x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y0C1Ev();
extern void _ZN3ccc8CC13x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y0E[] = {
  NSPAIR(_ZN3ccc8CC13x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y0E[];
extern void _ZN3ccc8CC13x7y03efgEv();
extern void _ZN3ccc8CC13x7y03abcEv();
extern void _ZN3ccc8CC13x7y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y03abcEv,_ZThn4_N3ccc8CC13x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y03pqrEv,_ZThn4_N3ccc8CC13x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y03abcEv,_ZThn4_N3ccc8CC13x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y03pqrEv,_ZThn4_N3ccc8CC13x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y0E[];
Class_Descriptor cd__ZN3ccc8CC13x7y0E = {  "_ZN3ccc8CC13x7y0E", // class name
  bases__ZN3ccc8CC13x7y0E, 2,
  &(vtc__ZN3ccc8CC13x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y1  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC13x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x7y13efgEv
  ~CC13x7y1(); // tgen
  CC13x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y1E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y13abcEv");}
void  ccc::CC13x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y13pqrEv");}
void  ccc::CC13x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y13efgEv");}
ccc::CC13x7y1 ::~CC13x7y1(){ note_dtor("_ZN3ccc8CC13x7y1E", this);} // tgen
ccc::CC13x7y1 ::CC13x7y1(){ note_ctor("_ZN3ccc8CC13x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y1E, buf);
    ::ccc::CC13x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y1E);
    dp->::ccc::CC13x7y1::~CC13x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y1E(Test__ZN3ccc8CC13x7y1E, "_ZN3ccc8CC13x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y1C1Ev();
extern void _ZN3ccc8CC13x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y1E[] = {
  NSPAIR(_ZN3ccc8CC13x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y1E[];
extern void _ZN3ccc8CC13x7y13efgEv();
extern void _ZN3ccc8CC13x7y13abcEv();
extern void _ZN3ccc8CC13x7y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y13abcEv,_ZThn4_N3ccc8CC13x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y13pqrEv,_ZThn4_N3ccc8CC13x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y13abcEv,_ZThn4_N3ccc8CC13x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y13pqrEv,_ZThn4_N3ccc8CC13x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y1E[];
Class_Descriptor cd__ZN3ccc8CC13x7y1E = {  "_ZN3ccc8CC13x7y1E", // class name
  bases__ZN3ccc8CC13x7y1E, 2,
  &(vtc__ZN3ccc8CC13x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y2  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC13x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y23pqrEv
  ~CC13x7y2(); // tgen
  CC13x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y2E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y23efgEv");}
void  ccc::CC13x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y23abcEv");}
void  ccc::CC13x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y23pqrEv");}
ccc::CC13x7y2 ::~CC13x7y2(){ note_dtor("_ZN3ccc8CC13x7y2E", this);} // tgen
ccc::CC13x7y2 ::CC13x7y2(){ note_ctor("_ZN3ccc8CC13x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y2E, buf);
    ::ccc::CC13x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y2E);
    dp->::ccc::CC13x7y2::~CC13x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y2E(Test__ZN3ccc8CC13x7y2E, "_ZN3ccc8CC13x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y2C1Ev();
extern void _ZN3ccc8CC13x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y2E[] = {
  NSPAIR(_ZN3ccc8CC13x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y2E[];
extern void _ZN3ccc8CC13x7y23efgEv();
extern void _ZN3ccc8CC13x7y23abcEv();
extern void _ZN3ccc8CC13x7y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y23abcEv,_ZThn4_N3ccc8CC13x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y23pqrEv,_ZThn4_N3ccc8CC13x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y23abcEv,_ZThn4_N3ccc8CC13x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y23pqrEv,_ZThn4_N3ccc8CC13x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y2E[];
Class_Descriptor cd__ZN3ccc8CC13x7y2E = {  "_ZN3ccc8CC13x7y2E", // class name
  bases__ZN3ccc8CC13x7y2E, 2,
  &(vtc__ZN3ccc8CC13x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y3  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC13x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x7y33abcEv
  ~CC13x7y3(); // tgen
  CC13x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y3E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y33efgEv");}
void  ccc::CC13x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y33pqrEv");}
void  ccc::CC13x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y33abcEv");}
ccc::CC13x7y3 ::~CC13x7y3(){ note_dtor("_ZN3ccc8CC13x7y3E", this);} // tgen
ccc::CC13x7y3 ::CC13x7y3(){ note_ctor("_ZN3ccc8CC13x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y3E, buf);
    ::ccc::CC13x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y3E);
    dp->::ccc::CC13x7y3::~CC13x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y3E(Test__ZN3ccc8CC13x7y3E, "_ZN3ccc8CC13x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y3C1Ev();
extern void _ZN3ccc8CC13x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y3E[] = {
  NSPAIR(_ZN3ccc8CC13x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y3E[];
extern void _ZN3ccc8CC13x7y33efgEv();
extern void _ZN3ccc8CC13x7y33pqrEv();
extern void _ZN3ccc8CC13x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y33abcEv,_ZThn4_N3ccc8CC13x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y33pqrEv,_ZThn4_N3ccc8CC13x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y33abcEv,_ZThn4_N3ccc8CC13x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y33pqrEv,_ZThn4_N3ccc8CC13x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y3E[];
Class_Descriptor cd__ZN3ccc8CC13x7y3E = {  "_ZN3ccc8CC13x7y3E", // class name
  bases__ZN3ccc8CC13x7y3E, 2,
  &(vtc__ZN3ccc8CC13x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y4  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC13x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x7y43efgEv
  ~CC13x7y4(); // tgen
  CC13x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y4E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y43pqrEv");}
void  ccc::CC13x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y43abcEv");}
void  ccc::CC13x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y43efgEv");}
ccc::CC13x7y4 ::~CC13x7y4(){ note_dtor("_ZN3ccc8CC13x7y4E", this);} // tgen
ccc::CC13x7y4 ::CC13x7y4(){ note_ctor("_ZN3ccc8CC13x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y4E, buf);
    ::ccc::CC13x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y4E);
    dp->::ccc::CC13x7y4::~CC13x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y4E(Test__ZN3ccc8CC13x7y4E, "_ZN3ccc8CC13x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y4C1Ev();
extern void _ZN3ccc8CC13x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y4E[] = {
  NSPAIR(_ZN3ccc8CC13x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y4E[];
extern void _ZN3ccc8CC13x7y43efgEv();
extern void _ZN3ccc8CC13x7y43pqrEv();
extern void _ZN3ccc8CC13x7y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y43abcEv,_ZThn4_N3ccc8CC13x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y43pqrEv,_ZThn4_N3ccc8CC13x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y43abcEv,_ZThn4_N3ccc8CC13x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y43pqrEv,_ZThn4_N3ccc8CC13x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y4E[];
Class_Descriptor cd__ZN3ccc8CC13x7y4E = {  "_ZN3ccc8CC13x7y4E", // class name
  bases__ZN3ccc8CC13x7y4E, 2,
  &(vtc__ZN3ccc8CC13x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y5  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC13x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x7y53abcEv
  ~CC13x7y5(); // tgen
  CC13x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y5E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y53pqrEv");}
void  ccc::CC13x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y53efgEv");}
void  ccc::CC13x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y53abcEv");}
ccc::CC13x7y5 ::~CC13x7y5(){ note_dtor("_ZN3ccc8CC13x7y5E", this);} // tgen
ccc::CC13x7y5 ::CC13x7y5(){ note_ctor("_ZN3ccc8CC13x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y5E, buf);
    ::ccc::CC13x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y5E);
    dp->::ccc::CC13x7y5::~CC13x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y5E(Test__ZN3ccc8CC13x7y5E, "_ZN3ccc8CC13x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y5C1Ev();
extern void _ZN3ccc8CC13x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y5E[] = {
  NSPAIR(_ZN3ccc8CC13x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y5E[];
extern void _ZN3ccc8CC13x7y53efgEv();
extern void _ZN3ccc8CC13x7y53pqrEv();
extern void _ZN3ccc8CC13x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y53abcEv,_ZThn4_N3ccc8CC13x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y53pqrEv,_ZThn4_N3ccc8CC13x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y53abcEv,_ZThn4_N3ccc8CC13x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y53pqrEv,_ZThn4_N3ccc8CC13x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y5E[];
Class_Descriptor cd__ZN3ccc8CC13x7y5E = {  "_ZN3ccc8CC13x7y5E", // class name
  bases__ZN3ccc8CC13x7y5E, 2,
  &(vtc__ZN3ccc8CC13x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y6  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC13x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x7y63efgEv
  ~CC13x7y6(); // tgen
  CC13x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y6E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y63abcEv");}
void  ccc::CC13x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y63efgEv");}
ccc::CC13x7y6 ::~CC13x7y6(){ note_dtor("_ZN3ccc8CC13x7y6E", this);} // tgen
ccc::CC13x7y6 ::CC13x7y6(){ note_ctor("_ZN3ccc8CC13x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y6E, buf);
    ::ccc::CC13x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y6E);
    dp->::ccc::CC13x7y6::~CC13x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y6E(Test__ZN3ccc8CC13x7y6E, "_ZN3ccc8CC13x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y6C1Ev();
extern void _ZN3ccc8CC13x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y6E[] = {
  NSPAIR(_ZN3ccc8CC13x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y6E[];
extern void _ZN3ccc8CC13x7y63efgEv();
extern void _ZN3ccc8CC13x7y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y63abcEv,_ZThn4_N3ccc8CC13x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y63abcEv,_ZThn4_N3ccc8CC13x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y6E[];
Class_Descriptor cd__ZN3ccc8CC13x7y6E = {  "_ZN3ccc8CC13x7y6E", // class name
  bases__ZN3ccc8CC13x7y6E, 2,
  &(vtc__ZN3ccc8CC13x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y7  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC13x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y73pqrEv
  ~CC13x7y7(); // tgen
  CC13x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y7E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y73abcEv");}
void  ccc::CC13x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y73pqrEv");}
ccc::CC13x7y7 ::~CC13x7y7(){ note_dtor("_ZN3ccc8CC13x7y7E", this);} // tgen
ccc::CC13x7y7 ::CC13x7y7(){ note_ctor("_ZN3ccc8CC13x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y7E, buf);
    ::ccc::CC13x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y7E);
    dp->::ccc::CC13x7y7::~CC13x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y7E(Test__ZN3ccc8CC13x7y7E, "_ZN3ccc8CC13x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y7C1Ev();
extern void _ZN3ccc8CC13x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y7E[] = {
  NSPAIR(_ZN3ccc8CC13x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x7y73abcEv();
extern void _ZN3ccc8CC13x7y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y73abcEv,_ZThn4_N3ccc8CC13x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y73pqrEv,_ZThn4_N3ccc8CC13x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y73abcEv,_ZThn4_N3ccc8CC13x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y73pqrEv,_ZThn4_N3ccc8CC13x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y7E[];
Class_Descriptor cd__ZN3ccc8CC13x7y7E = {  "_ZN3ccc8CC13x7y7E", // class name
  bases__ZN3ccc8CC13x7y7E, 2,
  &(vtc__ZN3ccc8CC13x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y8  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC13x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x7y83abcEv
  ~CC13x7y8(); // tgen
  CC13x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y8E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y83efgEv");}
void  ccc::CC13x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x7y83abcEv");}
ccc::CC13x7y8 ::~CC13x7y8(){ note_dtor("_ZN3ccc8CC13x7y8E", this);} // tgen
ccc::CC13x7y8 ::CC13x7y8(){ note_ctor("_ZN3ccc8CC13x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y8E, buf);
    ::ccc::CC13x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y8E);
    dp->::ccc::CC13x7y8::~CC13x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y8E(Test__ZN3ccc8CC13x7y8E, "_ZN3ccc8CC13x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y8C1Ev();
extern void _ZN3ccc8CC13x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y8E[] = {
  NSPAIR(_ZN3ccc8CC13x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y8E[];
extern void _ZN3ccc8CC13x7y83efgEv();
extern void _ZN3ccc8CC13x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y83abcEv,_ZThn4_N3ccc8CC13x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y83abcEv,_ZThn4_N3ccc8CC13x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y8E[];
Class_Descriptor cd__ZN3ccc8CC13x7y8E = {  "_ZN3ccc8CC13x7y8E", // class name
  bases__ZN3ccc8CC13x7y8E, 2,
  &(vtc__ZN3ccc8CC13x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y9  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC13x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x7y93pqrEv
  ~CC13x7y9(); // tgen
  CC13x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x7y9E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x7y93efgEv");}
void  ccc::CC13x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x7y93pqrEv");}
ccc::CC13x7y9 ::~CC13x7y9(){ note_dtor("_ZN3ccc8CC13x7y9E", this);} // tgen
ccc::CC13x7y9 ::CC13x7y9(){ note_ctor("_ZN3ccc8CC13x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x7y9E, buf);
    ::ccc::CC13x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x7y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC13x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x7y9E);
    dp->::ccc::CC13x7y9::~CC13x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x7y9E(Test__ZN3ccc8CC13x7y9E, "_ZN3ccc8CC13x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x7y9C1Ev();
extern void _ZN3ccc8CC13x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x7y9E[] = {
  NSPAIR(_ZN3ccc8CC13x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC13x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y9E[];
extern void _ZN3ccc8CC13x7y93efgEv();
extern void _ZN3ccc8CC13x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x7y93pqrEv,_ZThn4_N3ccc8CC13x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x7y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x7y93pqrEv,_ZThn4_N3ccc8CC13x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x7y9E[];
Class_Descriptor cd__ZN3ccc8CC13x7y9E = {  "_ZN3ccc8CC13x7y9E", // class name
  bases__ZN3ccc8CC13x7y9E, 2,
  &(vtc__ZN3ccc8CC13x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x7y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y10  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC13x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x7y103abcEv
  ~CC13x7y10(); // tgen
  CC13x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y10E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x7y103pqrEv");}
void  ccc::CC13x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x7y103abcEv");}
ccc::CC13x7y10 ::~CC13x7y10(){ note_dtor("_ZN3ccc9CC13x7y10E", this);} // tgen
ccc::CC13x7y10 ::CC13x7y10(){ note_ctor("_ZN3ccc9CC13x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y10E, buf);
    ::ccc::CC13x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y10E);
    dp->::ccc::CC13x7y10::~CC13x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y10E(Test__ZN3ccc9CC13x7y10E, "_ZN3ccc9CC13x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y10C1Ev();
extern void _ZN3ccc9CC13x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y10E[] = {
  NSPAIR(_ZN3ccc9CC13x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x7y103pqrEv();
extern void _ZN3ccc9CC13x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x7y103abcEv,_ZThn4_N3ccc9CC13x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x7y103pqrEv,_ZThn4_N3ccc9CC13x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x7y103abcEv,_ZThn4_N3ccc9CC13x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x7y103pqrEv,_ZThn4_N3ccc9CC13x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y10E[];
Class_Descriptor cd__ZN3ccc9CC13x7y10E = {  "_ZN3ccc9CC13x7y10E", // class name
  bases__ZN3ccc9CC13x7y10E, 2,
  &(vtc__ZN3ccc9CC13x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y11  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC13x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x7y113efgEv
  ~CC13x7y11(); // tgen
  CC13x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y11E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x7y113pqrEv");}
void  ccc::CC13x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x7y113efgEv");}
ccc::CC13x7y11 ::~CC13x7y11(){ note_dtor("_ZN3ccc9CC13x7y11E", this);} // tgen
ccc::CC13x7y11 ::CC13x7y11(){ note_ctor("_ZN3ccc9CC13x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y11E, buf);
    ::ccc::CC13x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y11E);
    dp->::ccc::CC13x7y11::~CC13x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y11E(Test__ZN3ccc9CC13x7y11E, "_ZN3ccc9CC13x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y11C1Ev();
extern void _ZN3ccc9CC13x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y11E[] = {
  NSPAIR(_ZN3ccc9CC13x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y11E[];
extern void _ZN3ccc9CC13x7y113efgEv();
extern void _ZN3ccc9CC13x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x7y113pqrEv,_ZThn4_N3ccc9CC13x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x7y113pqrEv,_ZThn4_N3ccc9CC13x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y11E[];
Class_Descriptor cd__ZN3ccc9CC13x7y11E = {  "_ZN3ccc9CC13x7y11E", // class name
  bases__ZN3ccc9CC13x7y11E, 2,
  &(vtc__ZN3ccc9CC13x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y12  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC13x7y123abcEv
  ~CC13x7y12(); // tgen
  CC13x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y12E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x7y123abcEv");}
ccc::CC13x7y12 ::~CC13x7y12(){ note_dtor("_ZN3ccc9CC13x7y12E", this);} // tgen
ccc::CC13x7y12 ::CC13x7y12(){ note_ctor("_ZN3ccc9CC13x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y12E, buf);
    ::ccc::CC13x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y12E);
    dp->::ccc::CC13x7y12::~CC13x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y12E(Test__ZN3ccc9CC13x7y12E, "_ZN3ccc9CC13x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y12C1Ev();
extern void _ZN3ccc9CC13x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y12E[] = {
  NSPAIR(_ZN3ccc9CC13x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x7y123abcEv,_ZThn4_N3ccc9CC13x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x7y123abcEv,_ZThn4_N3ccc9CC13x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y12E[];
Class_Descriptor cd__ZN3ccc9CC13x7y12E = {  "_ZN3ccc9CC13x7y12E", // class name
  bases__ZN3ccc9CC13x7y12E, 2,
  &(vtc__ZN3ccc9CC13x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y13  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC13x7y133efgEv
  ~CC13x7y13(); // tgen
  CC13x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y13E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC13x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x7y133efgEv");}
ccc::CC13x7y13 ::~CC13x7y13(){ note_dtor("_ZN3ccc9CC13x7y13E", this);} // tgen
ccc::CC13x7y13 ::CC13x7y13(){ note_ctor("_ZN3ccc9CC13x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y13E, buf);
    ::ccc::CC13x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y13E);
    dp->::ccc::CC13x7y13::~CC13x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y13E(Test__ZN3ccc9CC13x7y13E, "_ZN3ccc9CC13x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y13C1Ev();
extern void _ZN3ccc9CC13x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y13E[] = {
  NSPAIR(_ZN3ccc9CC13x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y13E[];
extern void _ZN3ccc9CC13x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y13E[];
Class_Descriptor cd__ZN3ccc9CC13x7y13E = {  "_ZN3ccc9CC13x7y13E", // class name
  bases__ZN3ccc9CC13x7y13E, 2,
  &(vtc__ZN3ccc9CC13x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y14  : ::ccc::AA13 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC13x7y143pqrEv
  ~CC13x7y14(); // tgen
  CC13x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y14E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x7y143pqrEv");}
ccc::CC13x7y14 ::~CC13x7y14(){ note_dtor("_ZN3ccc9CC13x7y14E", this);} // tgen
ccc::CC13x7y14 ::CC13x7y14(){ note_ctor("_ZN3ccc9CC13x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y14E, buf);
    ::ccc::CC13x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y14E);
    dp->::ccc::CC13x7y14::~CC13x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y14E(Test__ZN3ccc9CC13x7y14E, "_ZN3ccc9CC13x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y14C1Ev();
extern void _ZN3ccc9CC13x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y14E[] = {
  NSPAIR(_ZN3ccc9CC13x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x7y143pqrEv,_ZThn4_N3ccc9CC13x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x7y143pqrEv,_ZThn4_N3ccc9CC13x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y14E[];
Class_Descriptor cd__ZN3ccc9CC13x7y14E = {  "_ZN3ccc9CC13x7y14E", // class name
  bases__ZN3ccc9CC13x7y14E, 2,
  &(vtc__ZN3ccc9CC13x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x7y15  : ::ccc::AA13 , ::ccc::BB7 {
  ~CC13x7y15(); // tgen
  CC13x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x7y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x7y15 ::~CC13x7y15(){ note_dtor("_ZN3ccc9CC13x7y15E", this);} // tgen
ccc::CC13x7y15 ::CC13x7y15(){ note_ctor("_ZN3ccc9CC13x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x7y15E, buf);
    ::ccc::CC13x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x7y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC13x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x7y15E);
    dp->::ccc::CC13x7y15::~CC13x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x7y15E(Test__ZN3ccc9CC13x7y15E, "_ZN3ccc9CC13x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x7y15C1Ev();
extern void _ZN3ccc9CC13x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x7y15E[] = {
  NSPAIR(_ZN3ccc9CC13x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC13x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x7y15E[];
Class_Descriptor cd__ZN3ccc9CC13x7y15E = {  "_ZN3ccc9CC13x7y15E", // class name
  bases__ZN3ccc9CC13x7y15E, 2,
  &(vtc__ZN3ccc9CC13x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x7y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y0  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC13x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y03pqrEv
  ~CC13x8y0(); // tgen
  CC13x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y0E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y03abcEv");}
void  ccc::CC13x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y03efgEv");}
void  ccc::CC13x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y03pqrEv");}
ccc::CC13x8y0 ::~CC13x8y0(){ note_dtor("_ZN3ccc8CC13x8y0E", this);} // tgen
ccc::CC13x8y0 ::CC13x8y0(){ note_ctor("_ZN3ccc8CC13x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y0E, buf);
    ::ccc::CC13x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y0E);
    dp->::ccc::CC13x8y0::~CC13x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y0E(Test__ZN3ccc8CC13x8y0E, "_ZN3ccc8CC13x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y0C1Ev();
extern void _ZN3ccc8CC13x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y0E[] = {
  NSPAIR(_ZN3ccc8CC13x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y0E[];
extern void _ZN3ccc8CC13x8y03efgEv();
extern void _ZN3ccc8CC13x8y03abcEv();
extern void _ZN3ccc8CC13x8y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y03efgEv,_ZThn4_N3ccc8CC13x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y03abcEv,_ZThn4_N3ccc8CC13x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y03efgEv,_ZThn4_N3ccc8CC13x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y03abcEv,_ZThn4_N3ccc8CC13x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y0E[];
Class_Descriptor cd__ZN3ccc8CC13x8y0E = {  "_ZN3ccc8CC13x8y0E", // class name
  bases__ZN3ccc8CC13x8y0E, 2,
  &(vtc__ZN3ccc8CC13x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y1  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC13x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x8y13efgEv
  ~CC13x8y1(); // tgen
  CC13x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y1E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y13abcEv");}
void  ccc::CC13x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y13pqrEv");}
void  ccc::CC13x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y13efgEv");}
ccc::CC13x8y1 ::~CC13x8y1(){ note_dtor("_ZN3ccc8CC13x8y1E", this);} // tgen
ccc::CC13x8y1 ::CC13x8y1(){ note_ctor("_ZN3ccc8CC13x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y1E, buf);
    ::ccc::CC13x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y1E);
    dp->::ccc::CC13x8y1::~CC13x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y1E(Test__ZN3ccc8CC13x8y1E, "_ZN3ccc8CC13x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y1C1Ev();
extern void _ZN3ccc8CC13x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y1E[] = {
  NSPAIR(_ZN3ccc8CC13x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y1E[];
extern void _ZN3ccc8CC13x8y13efgEv();
extern void _ZN3ccc8CC13x8y13abcEv();
extern void _ZN3ccc8CC13x8y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y13efgEv,_ZThn4_N3ccc8CC13x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y13abcEv,_ZThn4_N3ccc8CC13x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y13efgEv,_ZThn4_N3ccc8CC13x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y13abcEv,_ZThn4_N3ccc8CC13x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y1E[];
Class_Descriptor cd__ZN3ccc8CC13x8y1E = {  "_ZN3ccc8CC13x8y1E", // class name
  bases__ZN3ccc8CC13x8y1E, 2,
  &(vtc__ZN3ccc8CC13x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y2  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC13x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y23pqrEv
  ~CC13x8y2(); // tgen
  CC13x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y2E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y23efgEv");}
void  ccc::CC13x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y23abcEv");}
void  ccc::CC13x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y23pqrEv");}
ccc::CC13x8y2 ::~CC13x8y2(){ note_dtor("_ZN3ccc8CC13x8y2E", this);} // tgen
ccc::CC13x8y2 ::CC13x8y2(){ note_ctor("_ZN3ccc8CC13x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y2E, buf);
    ::ccc::CC13x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y2E);
    dp->::ccc::CC13x8y2::~CC13x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y2E(Test__ZN3ccc8CC13x8y2E, "_ZN3ccc8CC13x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y2C1Ev();
extern void _ZN3ccc8CC13x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y2E[] = {
  NSPAIR(_ZN3ccc8CC13x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y2E[];
extern void _ZN3ccc8CC13x8y23efgEv();
extern void _ZN3ccc8CC13x8y23abcEv();
extern void _ZN3ccc8CC13x8y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y23efgEv,_ZThn4_N3ccc8CC13x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y23abcEv,_ZThn4_N3ccc8CC13x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y23efgEv,_ZThn4_N3ccc8CC13x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y23abcEv,_ZThn4_N3ccc8CC13x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y2E[];
Class_Descriptor cd__ZN3ccc8CC13x8y2E = {  "_ZN3ccc8CC13x8y2E", // class name
  bases__ZN3ccc8CC13x8y2E, 2,
  &(vtc__ZN3ccc8CC13x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y3  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC13x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x8y33abcEv
  ~CC13x8y3(); // tgen
  CC13x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y3E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y33efgEv");}
void  ccc::CC13x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y33pqrEv");}
void  ccc::CC13x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y33abcEv");}
ccc::CC13x8y3 ::~CC13x8y3(){ note_dtor("_ZN3ccc8CC13x8y3E", this);} // tgen
ccc::CC13x8y3 ::CC13x8y3(){ note_ctor("_ZN3ccc8CC13x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y3E, buf);
    ::ccc::CC13x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y3E);
    dp->::ccc::CC13x8y3::~CC13x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y3E(Test__ZN3ccc8CC13x8y3E, "_ZN3ccc8CC13x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y3C1Ev();
extern void _ZN3ccc8CC13x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y3E[] = {
  NSPAIR(_ZN3ccc8CC13x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y3E[];
extern void _ZN3ccc8CC13x8y33efgEv();
extern void _ZN3ccc8CC13x8y33pqrEv();
extern void _ZN3ccc8CC13x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y33efgEv,_ZThn4_N3ccc8CC13x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y33abcEv,_ZThn4_N3ccc8CC13x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y33efgEv,_ZThn4_N3ccc8CC13x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y33abcEv,_ZThn4_N3ccc8CC13x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y3E[];
Class_Descriptor cd__ZN3ccc8CC13x8y3E = {  "_ZN3ccc8CC13x8y3E", // class name
  bases__ZN3ccc8CC13x8y3E, 2,
  &(vtc__ZN3ccc8CC13x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y4  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC13x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x8y43efgEv
  ~CC13x8y4(); // tgen
  CC13x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y4E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y43pqrEv");}
void  ccc::CC13x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y43abcEv");}
void  ccc::CC13x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y43efgEv");}
ccc::CC13x8y4 ::~CC13x8y4(){ note_dtor("_ZN3ccc8CC13x8y4E", this);} // tgen
ccc::CC13x8y4 ::CC13x8y4(){ note_ctor("_ZN3ccc8CC13x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y4E, buf);
    ::ccc::CC13x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y4E);
    dp->::ccc::CC13x8y4::~CC13x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y4E(Test__ZN3ccc8CC13x8y4E, "_ZN3ccc8CC13x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y4C1Ev();
extern void _ZN3ccc8CC13x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y4E[] = {
  NSPAIR(_ZN3ccc8CC13x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y4E[];
extern void _ZN3ccc8CC13x8y43efgEv();
extern void _ZN3ccc8CC13x8y43pqrEv();
extern void _ZN3ccc8CC13x8y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y43efgEv,_ZThn4_N3ccc8CC13x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y43abcEv,_ZThn4_N3ccc8CC13x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y43efgEv,_ZThn4_N3ccc8CC13x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y43abcEv,_ZThn4_N3ccc8CC13x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y4E[];
Class_Descriptor cd__ZN3ccc8CC13x8y4E = {  "_ZN3ccc8CC13x8y4E", // class name
  bases__ZN3ccc8CC13x8y4E, 2,
  &(vtc__ZN3ccc8CC13x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y5  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC13x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x8y53abcEv
  ~CC13x8y5(); // tgen
  CC13x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y5E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y53pqrEv");}
void  ccc::CC13x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y53efgEv");}
void  ccc::CC13x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y53abcEv");}
ccc::CC13x8y5 ::~CC13x8y5(){ note_dtor("_ZN3ccc8CC13x8y5E", this);} // tgen
ccc::CC13x8y5 ::CC13x8y5(){ note_ctor("_ZN3ccc8CC13x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y5E, buf);
    ::ccc::CC13x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y5E);
    dp->::ccc::CC13x8y5::~CC13x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y5E(Test__ZN3ccc8CC13x8y5E, "_ZN3ccc8CC13x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y5C1Ev();
extern void _ZN3ccc8CC13x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y5E[] = {
  NSPAIR(_ZN3ccc8CC13x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y5E[];
extern void _ZN3ccc8CC13x8y53efgEv();
extern void _ZN3ccc8CC13x8y53pqrEv();
extern void _ZN3ccc8CC13x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y53efgEv,_ZThn4_N3ccc8CC13x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y53abcEv,_ZThn4_N3ccc8CC13x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y53efgEv,_ZThn4_N3ccc8CC13x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y53abcEv,_ZThn4_N3ccc8CC13x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y5E[];
Class_Descriptor cd__ZN3ccc8CC13x8y5E = {  "_ZN3ccc8CC13x8y5E", // class name
  bases__ZN3ccc8CC13x8y5E, 2,
  &(vtc__ZN3ccc8CC13x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y6  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC13x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x8y63efgEv
  ~CC13x8y6(); // tgen
  CC13x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y6E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y63abcEv");}
void  ccc::CC13x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y63efgEv");}
ccc::CC13x8y6 ::~CC13x8y6(){ note_dtor("_ZN3ccc8CC13x8y6E", this);} // tgen
ccc::CC13x8y6 ::CC13x8y6(){ note_ctor("_ZN3ccc8CC13x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y6E, buf);
    ::ccc::CC13x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y6E);
    dp->::ccc::CC13x8y6::~CC13x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y6E(Test__ZN3ccc8CC13x8y6E, "_ZN3ccc8CC13x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y6C1Ev();
extern void _ZN3ccc8CC13x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y6E[] = {
  NSPAIR(_ZN3ccc8CC13x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y6E[];
extern void _ZN3ccc8CC13x8y63efgEv();
extern void _ZN3ccc8CC13x8y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y63efgEv,_ZThn4_N3ccc8CC13x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y63abcEv,_ZThn4_N3ccc8CC13x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y63efgEv,_ZThn4_N3ccc8CC13x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y63abcEv,_ZThn4_N3ccc8CC13x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y6E[];
Class_Descriptor cd__ZN3ccc8CC13x8y6E = {  "_ZN3ccc8CC13x8y6E", // class name
  bases__ZN3ccc8CC13x8y6E, 2,
  &(vtc__ZN3ccc8CC13x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y7  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC13x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y73pqrEv
  ~CC13x8y7(); // tgen
  CC13x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y7E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y73abcEv");}
void  ccc::CC13x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y73pqrEv");}
ccc::CC13x8y7 ::~CC13x8y7(){ note_dtor("_ZN3ccc8CC13x8y7E", this);} // tgen
ccc::CC13x8y7 ::CC13x8y7(){ note_ctor("_ZN3ccc8CC13x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y7E, buf);
    ::ccc::CC13x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y7E);
    dp->::ccc::CC13x8y7::~CC13x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y7E(Test__ZN3ccc8CC13x8y7E, "_ZN3ccc8CC13x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y7C1Ev();
extern void _ZN3ccc8CC13x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y7E[] = {
  NSPAIR(_ZN3ccc8CC13x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x8y73abcEv();
extern void _ZN3ccc8CC13x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y73abcEv,_ZThn4_N3ccc8CC13x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y73abcEv,_ZThn4_N3ccc8CC13x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y7E[];
Class_Descriptor cd__ZN3ccc8CC13x8y7E = {  "_ZN3ccc8CC13x8y7E", // class name
  bases__ZN3ccc8CC13x8y7E, 2,
  &(vtc__ZN3ccc8CC13x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y8  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC13x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x8y83abcEv
  ~CC13x8y8(); // tgen
  CC13x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y8E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y83efgEv");}
void  ccc::CC13x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x8y83abcEv");}
ccc::CC13x8y8 ::~CC13x8y8(){ note_dtor("_ZN3ccc8CC13x8y8E", this);} // tgen
ccc::CC13x8y8 ::CC13x8y8(){ note_ctor("_ZN3ccc8CC13x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y8E, buf);
    ::ccc::CC13x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y8E);
    dp->::ccc::CC13x8y8::~CC13x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y8E(Test__ZN3ccc8CC13x8y8E, "_ZN3ccc8CC13x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y8C1Ev();
extern void _ZN3ccc8CC13x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y8E[] = {
  NSPAIR(_ZN3ccc8CC13x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y8E[];
extern void _ZN3ccc8CC13x8y83efgEv();
extern void _ZN3ccc8CC13x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y83efgEv,_ZThn4_N3ccc8CC13x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y83abcEv,_ZThn4_N3ccc8CC13x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y83efgEv,_ZThn4_N3ccc8CC13x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y83abcEv,_ZThn4_N3ccc8CC13x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y8E[];
Class_Descriptor cd__ZN3ccc8CC13x8y8E = {  "_ZN3ccc8CC13x8y8E", // class name
  bases__ZN3ccc8CC13x8y8E, 2,
  &(vtc__ZN3ccc8CC13x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y9  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC13x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x8y93pqrEv
  ~CC13x8y9(); // tgen
  CC13x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x8y9E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x8y93efgEv");}
void  ccc::CC13x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x8y93pqrEv");}
ccc::CC13x8y9 ::~CC13x8y9(){ note_dtor("_ZN3ccc8CC13x8y9E", this);} // tgen
ccc::CC13x8y9 ::CC13x8y9(){ note_ctor("_ZN3ccc8CC13x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x8y9E, buf);
    ::ccc::CC13x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x8y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC13x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x8y9E);
    dp->::ccc::CC13x8y9::~CC13x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x8y9E(Test__ZN3ccc8CC13x8y9E, "_ZN3ccc8CC13x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x8y9C1Ev();
extern void _ZN3ccc8CC13x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x8y9E[] = {
  NSPAIR(_ZN3ccc8CC13x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC13x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y9E[];
extern void _ZN3ccc8CC13x8y93efgEv();
extern void _ZN3ccc8CC13x8y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x8y93efgEv,_ZThn4_N3ccc8CC13x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x8y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x8y93efgEv,_ZThn4_N3ccc8CC13x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x8y9E[];
Class_Descriptor cd__ZN3ccc8CC13x8y9E = {  "_ZN3ccc8CC13x8y9E", // class name
  bases__ZN3ccc8CC13x8y9E, 2,
  &(vtc__ZN3ccc8CC13x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x8y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y10  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC13x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x8y103abcEv
  ~CC13x8y10(); // tgen
  CC13x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y10E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x8y103pqrEv");}
void  ccc::CC13x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x8y103abcEv");}
ccc::CC13x8y10 ::~CC13x8y10(){ note_dtor("_ZN3ccc9CC13x8y10E", this);} // tgen
ccc::CC13x8y10 ::CC13x8y10(){ note_ctor("_ZN3ccc9CC13x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y10E, buf);
    ::ccc::CC13x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y10E);
    dp->::ccc::CC13x8y10::~CC13x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y10E(Test__ZN3ccc9CC13x8y10E, "_ZN3ccc9CC13x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y10C1Ev();
extern void _ZN3ccc9CC13x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y10E[] = {
  NSPAIR(_ZN3ccc9CC13x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x8y103pqrEv();
extern void _ZN3ccc9CC13x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x8y103abcEv,_ZThn4_N3ccc9CC13x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x8y103abcEv,_ZThn4_N3ccc9CC13x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y10E[];
Class_Descriptor cd__ZN3ccc9CC13x8y10E = {  "_ZN3ccc9CC13x8y10E", // class name
  bases__ZN3ccc9CC13x8y10E, 2,
  &(vtc__ZN3ccc9CC13x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y11  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC13x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x8y113efgEv
  ~CC13x8y11(); // tgen
  CC13x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y11E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x8y113pqrEv");}
void  ccc::CC13x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x8y113efgEv");}
ccc::CC13x8y11 ::~CC13x8y11(){ note_dtor("_ZN3ccc9CC13x8y11E", this);} // tgen
ccc::CC13x8y11 ::CC13x8y11(){ note_ctor("_ZN3ccc9CC13x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y11E, buf);
    ::ccc::CC13x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y11E);
    dp->::ccc::CC13x8y11::~CC13x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y11E(Test__ZN3ccc9CC13x8y11E, "_ZN3ccc9CC13x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y11C1Ev();
extern void _ZN3ccc9CC13x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y11E[] = {
  NSPAIR(_ZN3ccc9CC13x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y11E[];
extern void _ZN3ccc9CC13x8y113efgEv();
extern void _ZN3ccc9CC13x8y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x8y113efgEv,_ZThn4_N3ccc9CC13x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x8y113efgEv,_ZThn4_N3ccc9CC13x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y11E[];
Class_Descriptor cd__ZN3ccc9CC13x8y11E = {  "_ZN3ccc9CC13x8y11E", // class name
  bases__ZN3ccc9CC13x8y11E, 2,
  &(vtc__ZN3ccc9CC13x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y12  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC13x8y123abcEv
  ~CC13x8y12(); // tgen
  CC13x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y12E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x8y123abcEv");}
ccc::CC13x8y12 ::~CC13x8y12(){ note_dtor("_ZN3ccc9CC13x8y12E", this);} // tgen
ccc::CC13x8y12 ::CC13x8y12(){ note_ctor("_ZN3ccc9CC13x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y12E, buf);
    ::ccc::CC13x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y12E);
    dp->::ccc::CC13x8y12::~CC13x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y12E(Test__ZN3ccc9CC13x8y12E, "_ZN3ccc9CC13x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y12C1Ev();
extern void _ZN3ccc9CC13x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y12E[] = {
  NSPAIR(_ZN3ccc9CC13x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x8y123abcEv,_ZThn4_N3ccc9CC13x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x8y123abcEv,_ZThn4_N3ccc9CC13x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y12E[];
Class_Descriptor cd__ZN3ccc9CC13x8y12E = {  "_ZN3ccc9CC13x8y12E", // class name
  bases__ZN3ccc9CC13x8y12E, 2,
  &(vtc__ZN3ccc9CC13x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y13  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC13x8y133efgEv
  ~CC13x8y13(); // tgen
  CC13x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y13E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC13x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x8y133efgEv");}
ccc::CC13x8y13 ::~CC13x8y13(){ note_dtor("_ZN3ccc9CC13x8y13E", this);} // tgen
ccc::CC13x8y13 ::CC13x8y13(){ note_ctor("_ZN3ccc9CC13x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y13E, buf);
    ::ccc::CC13x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y13E);
    dp->::ccc::CC13x8y13::~CC13x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y13E(Test__ZN3ccc9CC13x8y13E, "_ZN3ccc9CC13x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y13C1Ev();
extern void _ZN3ccc9CC13x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y13E[] = {
  NSPAIR(_ZN3ccc9CC13x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y13E[];
extern void _ZN3ccc9CC13x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x8y133efgEv,_ZThn4_N3ccc9CC13x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x8y133efgEv,_ZThn4_N3ccc9CC13x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y13E[];
Class_Descriptor cd__ZN3ccc9CC13x8y13E = {  "_ZN3ccc9CC13x8y13E", // class name
  bases__ZN3ccc9CC13x8y13E, 2,
  &(vtc__ZN3ccc9CC13x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y14  : ::ccc::AA13 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC13x8y143pqrEv
  ~CC13x8y14(); // tgen
  CC13x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y14E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x8y143pqrEv");}
ccc::CC13x8y14 ::~CC13x8y14(){ note_dtor("_ZN3ccc9CC13x8y14E", this);} // tgen
ccc::CC13x8y14 ::CC13x8y14(){ note_ctor("_ZN3ccc9CC13x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y14E, buf);
    ::ccc::CC13x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y14E);
    dp->::ccc::CC13x8y14::~CC13x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y14E(Test__ZN3ccc9CC13x8y14E, "_ZN3ccc9CC13x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y14C1Ev();
extern void _ZN3ccc9CC13x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y14E[] = {
  NSPAIR(_ZN3ccc9CC13x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y14E[];
Class_Descriptor cd__ZN3ccc9CC13x8y14E = {  "_ZN3ccc9CC13x8y14E", // class name
  bases__ZN3ccc9CC13x8y14E, 2,
  &(vtc__ZN3ccc9CC13x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x8y15  : ::ccc::AA13 , ::ccc::BB8 {
  ~CC13x8y15(); // tgen
  CC13x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x8y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x8y15 ::~CC13x8y15(){ note_dtor("_ZN3ccc9CC13x8y15E", this);} // tgen
ccc::CC13x8y15 ::CC13x8y15(){ note_ctor("_ZN3ccc9CC13x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x8y15E, buf);
    ::ccc::CC13x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x8y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC13x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x8y15E);
    dp->::ccc::CC13x8y15::~CC13x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x8y15E(Test__ZN3ccc9CC13x8y15E, "_ZN3ccc9CC13x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x8y15C1Ev();
extern void _ZN3ccc9CC13x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x8y15E[] = {
  NSPAIR(_ZN3ccc9CC13x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC13x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x8y15E[];
Class_Descriptor cd__ZN3ccc9CC13x8y15E = {  "_ZN3ccc9CC13x8y15E", // class name
  bases__ZN3ccc9CC13x8y15E, 2,
  &(vtc__ZN3ccc9CC13x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x8y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y0  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC13x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC13x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y03pqrEv
  ~CC13x9y0(); // tgen
  CC13x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y0E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y03abcEv");}
void  ccc::CC13x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y03efgEv");}
void  ccc::CC13x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y03pqrEv");}
ccc::CC13x9y0 ::~CC13x9y0(){ note_dtor("_ZN3ccc8CC13x9y0E", this);} // tgen
ccc::CC13x9y0 ::CC13x9y0(){ note_ctor("_ZN3ccc8CC13x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y0E, buf);
    ::ccc::CC13x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y0E);
    dp->::ccc::CC13x9y0::~CC13x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y0E(Test__ZN3ccc8CC13x9y0E, "_ZN3ccc8CC13x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y0C1Ev();
extern void _ZN3ccc8CC13x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y0E[] = {
  NSPAIR(_ZN3ccc8CC13x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y0E[];
extern void _ZN3ccc8CC13x9y03efgEv();
extern void _ZN3ccc8CC13x9y03abcEv();
extern void _ZN3ccc8CC13x9y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y03efgEv,_ZThn4_N3ccc8CC13x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y03pqrEv,_ZThn4_N3ccc8CC13x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y03efgEv,_ZThn4_N3ccc8CC13x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y03pqrEv,_ZThn4_N3ccc8CC13x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y0E[];
Class_Descriptor cd__ZN3ccc8CC13x9y0E = {  "_ZN3ccc8CC13x9y0E", // class name
  bases__ZN3ccc8CC13x9y0E, 2,
  &(vtc__ZN3ccc8CC13x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y1  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC13x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x9y13efgEv
  ~CC13x9y1(); // tgen
  CC13x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y1E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y13abcEv");}
void  ccc::CC13x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y13pqrEv");}
void  ccc::CC13x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y13efgEv");}
ccc::CC13x9y1 ::~CC13x9y1(){ note_dtor("_ZN3ccc8CC13x9y1E", this);} // tgen
ccc::CC13x9y1 ::CC13x9y1(){ note_ctor("_ZN3ccc8CC13x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y1E, buf);
    ::ccc::CC13x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y1E);
    dp->::ccc::CC13x9y1::~CC13x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y1E(Test__ZN3ccc8CC13x9y1E, "_ZN3ccc8CC13x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y1C1Ev();
extern void _ZN3ccc8CC13x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y1E[] = {
  NSPAIR(_ZN3ccc8CC13x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y1E[];
extern void _ZN3ccc8CC13x9y13efgEv();
extern void _ZN3ccc8CC13x9y13abcEv();
extern void _ZN3ccc8CC13x9y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y13efgEv,_ZThn4_N3ccc8CC13x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y13pqrEv,_ZThn4_N3ccc8CC13x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y13efgEv,_ZThn4_N3ccc8CC13x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y13pqrEv,_ZThn4_N3ccc8CC13x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y1E[];
Class_Descriptor cd__ZN3ccc8CC13x9y1E = {  "_ZN3ccc8CC13x9y1E", // class name
  bases__ZN3ccc8CC13x9y1E, 2,
  &(vtc__ZN3ccc8CC13x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y2  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC13x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC13x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y23pqrEv
  ~CC13x9y2(); // tgen
  CC13x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y2E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y23efgEv");}
void  ccc::CC13x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y23abcEv");}
void  ccc::CC13x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y23pqrEv");}
ccc::CC13x9y2 ::~CC13x9y2(){ note_dtor("_ZN3ccc8CC13x9y2E", this);} // tgen
ccc::CC13x9y2 ::CC13x9y2(){ note_ctor("_ZN3ccc8CC13x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y2E, buf);
    ::ccc::CC13x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y2E);
    dp->::ccc::CC13x9y2::~CC13x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y2E(Test__ZN3ccc8CC13x9y2E, "_ZN3ccc8CC13x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y2C1Ev();
extern void _ZN3ccc8CC13x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y2E[] = {
  NSPAIR(_ZN3ccc8CC13x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y2E[];
extern void _ZN3ccc8CC13x9y23efgEv();
extern void _ZN3ccc8CC13x9y23abcEv();
extern void _ZN3ccc8CC13x9y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y23efgEv,_ZThn4_N3ccc8CC13x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y23pqrEv,_ZThn4_N3ccc8CC13x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y23efgEv,_ZThn4_N3ccc8CC13x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y23pqrEv,_ZThn4_N3ccc8CC13x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y2E[];
Class_Descriptor cd__ZN3ccc8CC13x9y2E = {  "_ZN3ccc8CC13x9y2E", // class name
  bases__ZN3ccc8CC13x9y2E, 2,
  &(vtc__ZN3ccc8CC13x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y3  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC13x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x9y33abcEv
  ~CC13x9y3(); // tgen
  CC13x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y3E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y33efgEv");}
void  ccc::CC13x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y33pqrEv");}
void  ccc::CC13x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y33abcEv");}
ccc::CC13x9y3 ::~CC13x9y3(){ note_dtor("_ZN3ccc8CC13x9y3E", this);} // tgen
ccc::CC13x9y3 ::CC13x9y3(){ note_ctor("_ZN3ccc8CC13x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y3E, buf);
    ::ccc::CC13x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y3E);
    dp->::ccc::CC13x9y3::~CC13x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y3E(Test__ZN3ccc8CC13x9y3E, "_ZN3ccc8CC13x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y3C1Ev();
extern void _ZN3ccc8CC13x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y3E[] = {
  NSPAIR(_ZN3ccc8CC13x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y3E[];
extern void _ZN3ccc8CC13x9y33efgEv();
extern void _ZN3ccc8CC13x9y33pqrEv();
extern void _ZN3ccc8CC13x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y33efgEv,_ZThn4_N3ccc8CC13x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y33pqrEv,_ZThn4_N3ccc8CC13x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y33efgEv,_ZThn4_N3ccc8CC13x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y33pqrEv,_ZThn4_N3ccc8CC13x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y3E[];
Class_Descriptor cd__ZN3ccc8CC13x9y3E = {  "_ZN3ccc8CC13x9y3E", // class name
  bases__ZN3ccc8CC13x9y3E, 2,
  &(vtc__ZN3ccc8CC13x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y4  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC13x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC13x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC13x9y43efgEv
  ~CC13x9y4(); // tgen
  CC13x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y4E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y43pqrEv");}
void  ccc::CC13x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y43abcEv");}
void  ccc::CC13x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y43efgEv");}
ccc::CC13x9y4 ::~CC13x9y4(){ note_dtor("_ZN3ccc8CC13x9y4E", this);} // tgen
ccc::CC13x9y4 ::CC13x9y4(){ note_ctor("_ZN3ccc8CC13x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y4E, buf);
    ::ccc::CC13x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y4E);
    dp->::ccc::CC13x9y4::~CC13x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y4E(Test__ZN3ccc8CC13x9y4E, "_ZN3ccc8CC13x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y4C1Ev();
extern void _ZN3ccc8CC13x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y4E[] = {
  NSPAIR(_ZN3ccc8CC13x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y4E[];
extern void _ZN3ccc8CC13x9y43efgEv();
extern void _ZN3ccc8CC13x9y43pqrEv();
extern void _ZN3ccc8CC13x9y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y43efgEv,_ZThn4_N3ccc8CC13x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y43pqrEv,_ZThn4_N3ccc8CC13x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y43efgEv,_ZThn4_N3ccc8CC13x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y43pqrEv,_ZThn4_N3ccc8CC13x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y4E[];
Class_Descriptor cd__ZN3ccc8CC13x9y4E = {  "_ZN3ccc8CC13x9y4E", // class name
  bases__ZN3ccc8CC13x9y4E, 2,
  &(vtc__ZN3ccc8CC13x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y5  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC13x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC13x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC13x9y53abcEv
  ~CC13x9y5(); // tgen
  CC13x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y5E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y53pqrEv");}
void  ccc::CC13x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y53efgEv");}
void  ccc::CC13x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y53abcEv");}
ccc::CC13x9y5 ::~CC13x9y5(){ note_dtor("_ZN3ccc8CC13x9y5E", this);} // tgen
ccc::CC13x9y5 ::CC13x9y5(){ note_ctor("_ZN3ccc8CC13x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y5E, buf);
    ::ccc::CC13x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y5E);
    dp->::ccc::CC13x9y5::~CC13x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y5E(Test__ZN3ccc8CC13x9y5E, "_ZN3ccc8CC13x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y5C1Ev();
extern void _ZN3ccc8CC13x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y5E[] = {
  NSPAIR(_ZN3ccc8CC13x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y5E[];
extern void _ZN3ccc8CC13x9y53efgEv();
extern void _ZN3ccc8CC13x9y53pqrEv();
extern void _ZN3ccc8CC13x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y53efgEv,_ZThn4_N3ccc8CC13x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y53pqrEv,_ZThn4_N3ccc8CC13x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y53efgEv,_ZThn4_N3ccc8CC13x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y53pqrEv,_ZThn4_N3ccc8CC13x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y5E[];
Class_Descriptor cd__ZN3ccc8CC13x9y5E = {  "_ZN3ccc8CC13x9y5E", // class name
  bases__ZN3ccc8CC13x9y5E, 2,
  &(vtc__ZN3ccc8CC13x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y6  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC13x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC13x9y63efgEv
  ~CC13x9y6(); // tgen
  CC13x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y6E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y63abcEv");}
void  ccc::CC13x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y63efgEv");}
ccc::CC13x9y6 ::~CC13x9y6(){ note_dtor("_ZN3ccc8CC13x9y6E", this);} // tgen
ccc::CC13x9y6 ::CC13x9y6(){ note_ctor("_ZN3ccc8CC13x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y6E, buf);
    ::ccc::CC13x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y6E);
    dp->::ccc::CC13x9y6::~CC13x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y6E(Test__ZN3ccc8CC13x9y6E, "_ZN3ccc8CC13x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y6C1Ev();
extern void _ZN3ccc8CC13x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y6E[] = {
  NSPAIR(_ZN3ccc8CC13x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y6E[];
extern void _ZN3ccc8CC13x9y63efgEv();
extern void _ZN3ccc8CC13x9y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y63efgEv,_ZThn4_N3ccc8CC13x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y63efgEv,_ZThn4_N3ccc8CC13x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y6E[];
Class_Descriptor cd__ZN3ccc8CC13x9y6E = {  "_ZN3ccc8CC13x9y6E", // class name
  bases__ZN3ccc8CC13x9y6E, 2,
  &(vtc__ZN3ccc8CC13x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y7  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC13x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y73pqrEv
  ~CC13x9y7(); // tgen
  CC13x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y7E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y73abcEv");}
void  ccc::CC13x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y73pqrEv");}
ccc::CC13x9y7 ::~CC13x9y7(){ note_dtor("_ZN3ccc8CC13x9y7E", this);} // tgen
ccc::CC13x9y7 ::CC13x9y7(){ note_ctor("_ZN3ccc8CC13x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y7E, buf);
    ::ccc::CC13x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y7E);
    dp->::ccc::CC13x9y7::~CC13x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y7E(Test__ZN3ccc8CC13x9y7E, "_ZN3ccc8CC13x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y7C1Ev();
extern void _ZN3ccc8CC13x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y7E[] = {
  NSPAIR(_ZN3ccc8CC13x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc8CC13x9y73abcEv();
extern void _ZN3ccc8CC13x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y73pqrEv,_ZThn4_N3ccc8CC13x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y73pqrEv,_ZThn4_N3ccc8CC13x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y7E[];
Class_Descriptor cd__ZN3ccc8CC13x9y7E = {  "_ZN3ccc8CC13x9y7E", // class name
  bases__ZN3ccc8CC13x9y7E, 2,
  &(vtc__ZN3ccc8CC13x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y8  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC13x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC13x9y83abcEv
  ~CC13x9y8(); // tgen
  CC13x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y8E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y83efgEv");}
void  ccc::CC13x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC13x9y83abcEv");}
ccc::CC13x9y8 ::~CC13x9y8(){ note_dtor("_ZN3ccc8CC13x9y8E", this);} // tgen
ccc::CC13x9y8 ::CC13x9y8(){ note_ctor("_ZN3ccc8CC13x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y8E, buf);
    ::ccc::CC13x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y8E);
    dp->::ccc::CC13x9y8::~CC13x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y8E(Test__ZN3ccc8CC13x9y8E, "_ZN3ccc8CC13x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y8C1Ev();
extern void _ZN3ccc8CC13x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y8E[] = {
  NSPAIR(_ZN3ccc8CC13x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y8E[];
extern void _ZN3ccc8CC13x9y83efgEv();
extern void _ZN3ccc8CC13x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y83efgEv,_ZThn4_N3ccc8CC13x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y83efgEv,_ZThn4_N3ccc8CC13x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y8E[];
Class_Descriptor cd__ZN3ccc8CC13x9y8E = {  "_ZN3ccc8CC13x9y8E", // class name
  bases__ZN3ccc8CC13x9y8E, 2,
  &(vtc__ZN3ccc8CC13x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y9  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC13x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC13x9y93pqrEv
  ~CC13x9y9(); // tgen
  CC13x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC13x9y9E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC13x9y93efgEv");}
void  ccc::CC13x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC13x9y93pqrEv");}
ccc::CC13x9y9 ::~CC13x9y9(){ note_dtor("_ZN3ccc8CC13x9y9E", this);} // tgen
ccc::CC13x9y9 ::CC13x9y9(){ note_ctor("_ZN3ccc8CC13x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC13x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC13x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC13x9y9E, buf);
    ::ccc::CC13x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC13x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC13x9y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc8CC13x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC13x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC13x9y9E);
    dp->::ccc::CC13x9y9::~CC13x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC13x9y9E(Test__ZN3ccc8CC13x9y9E, "_ZN3ccc8CC13x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC13x9y9C1Ev();
extern void _ZN3ccc8CC13x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC13x9y9E[] = {
  NSPAIR(_ZN3ccc8CC13x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC13x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC13x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y9E[];
extern void _ZN3ccc8CC13x9y93efgEv();
extern void _ZN3ccc8CC13x9y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y93efgEv,_ZThn4_N3ccc8CC13x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC13x9y93pqrEv,_ZThn4_N3ccc8CC13x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC13x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC13x9y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC13x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y93efgEv,_ZThn4_N3ccc8CC13x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC13x9y93pqrEv,_ZThn4_N3ccc8CC13x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC13x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC13x9y9E[];
Class_Descriptor cd__ZN3ccc8CC13x9y9E = {  "_ZN3ccc8CC13x9y9E", // class name
  bases__ZN3ccc8CC13x9y9E, 2,
  &(vtc__ZN3ccc8CC13x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC13x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC13x9y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y10  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC13x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x9y103abcEv
  ~CC13x9y10(); // tgen
  CC13x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y10E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x9y103pqrEv");}
void  ccc::CC13x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x9y103abcEv");}
ccc::CC13x9y10 ::~CC13x9y10(){ note_dtor("_ZN3ccc9CC13x9y10E", this);} // tgen
ccc::CC13x9y10 ::CC13x9y10(){ note_ctor("_ZN3ccc9CC13x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y10E, buf);
    ::ccc::CC13x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y10E);
    dp->::ccc::CC13x9y10::~CC13x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y10E(Test__ZN3ccc9CC13x9y10E, "_ZN3ccc9CC13x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y10C1Ev();
extern void _ZN3ccc9CC13x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y10E[] = {
  NSPAIR(_ZN3ccc9CC13x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x9y103pqrEv();
extern void _ZN3ccc9CC13x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x9y103pqrEv,_ZThn4_N3ccc9CC13x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x9y103pqrEv,_ZThn4_N3ccc9CC13x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y10E[];
Class_Descriptor cd__ZN3ccc9CC13x9y10E = {  "_ZN3ccc9CC13x9y10E", // class name
  bases__ZN3ccc9CC13x9y10E, 2,
  &(vtc__ZN3ccc9CC13x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y11  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC13x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x9y113efgEv
  ~CC13x9y11(); // tgen
  CC13x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y11E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x9y113pqrEv");}
void  ccc::CC13x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x9y113efgEv");}
ccc::CC13x9y11 ::~CC13x9y11(){ note_dtor("_ZN3ccc9CC13x9y11E", this);} // tgen
ccc::CC13x9y11 ::CC13x9y11(){ note_ctor("_ZN3ccc9CC13x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y11E, buf);
    ::ccc::CC13x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y11E);
    dp->::ccc::CC13x9y11::~CC13x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y11E(Test__ZN3ccc9CC13x9y11E, "_ZN3ccc9CC13x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y11C1Ev();
extern void _ZN3ccc9CC13x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y11E[] = {
  NSPAIR(_ZN3ccc9CC13x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y11E[];
extern void _ZN3ccc9CC13x9y113efgEv();
extern void _ZN3ccc9CC13x9y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x9y113efgEv,_ZThn4_N3ccc9CC13x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x9y113pqrEv,_ZThn4_N3ccc9CC13x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x9y113efgEv,_ZThn4_N3ccc9CC13x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x9y113pqrEv,_ZThn4_N3ccc9CC13x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y11E[];
Class_Descriptor cd__ZN3ccc9CC13x9y11E = {  "_ZN3ccc9CC13x9y11E", // class name
  bases__ZN3ccc9CC13x9y11E, 2,
  &(vtc__ZN3ccc9CC13x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y12  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC13x9y123abcEv
  ~CC13x9y12(); // tgen
  CC13x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y12E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x9y123abcEv");}
ccc::CC13x9y12 ::~CC13x9y12(){ note_dtor("_ZN3ccc9CC13x9y12E", this);} // tgen
ccc::CC13x9y12 ::CC13x9y12(){ note_ctor("_ZN3ccc9CC13x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y12E, buf);
    ::ccc::CC13x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y12E);
    dp->::ccc::CC13x9y12::~CC13x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y12E(Test__ZN3ccc9CC13x9y12E, "_ZN3ccc9CC13x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y12C1Ev();
extern void _ZN3ccc9CC13x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y12E[] = {
  NSPAIR(_ZN3ccc9CC13x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y12E[];
Class_Descriptor cd__ZN3ccc9CC13x9y12E = {  "_ZN3ccc9CC13x9y12E", // class name
  bases__ZN3ccc9CC13x9y12E, 2,
  &(vtc__ZN3ccc9CC13x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y13  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC13x9y133efgEv
  ~CC13x9y13(); // tgen
  CC13x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y13E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC13x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x9y133efgEv");}
ccc::CC13x9y13 ::~CC13x9y13(){ note_dtor("_ZN3ccc9CC13x9y13E", this);} // tgen
ccc::CC13x9y13 ::CC13x9y13(){ note_ctor("_ZN3ccc9CC13x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y13E, buf);
    ::ccc::CC13x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y13E);
    dp->::ccc::CC13x9y13::~CC13x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y13E(Test__ZN3ccc9CC13x9y13E, "_ZN3ccc9CC13x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y13C1Ev();
extern void _ZN3ccc9CC13x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y13E[] = {
  NSPAIR(_ZN3ccc9CC13x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y13E[];
extern void _ZN3ccc9CC13x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x9y133efgEv,_ZThn4_N3ccc9CC13x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x9y133efgEv,_ZThn4_N3ccc9CC13x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y13E[];
Class_Descriptor cd__ZN3ccc9CC13x9y13E = {  "_ZN3ccc9CC13x9y13E", // class name
  bases__ZN3ccc9CC13x9y13E, 2,
  &(vtc__ZN3ccc9CC13x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y14  : ::ccc::AA13 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC13x9y143pqrEv
  ~CC13x9y14(); // tgen
  CC13x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y14E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x9y143pqrEv");}
ccc::CC13x9y14 ::~CC13x9y14(){ note_dtor("_ZN3ccc9CC13x9y14E", this);} // tgen
ccc::CC13x9y14 ::CC13x9y14(){ note_ctor("_ZN3ccc9CC13x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y14E, buf);
    ::ccc::CC13x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y14E);
    dp->::ccc::CC13x9y14::~CC13x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y14E(Test__ZN3ccc9CC13x9y14E, "_ZN3ccc9CC13x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y14C1Ev();
extern void _ZN3ccc9CC13x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y14E[] = {
  NSPAIR(_ZN3ccc9CC13x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x9y143pqrEv,_ZThn4_N3ccc9CC13x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x9y143pqrEv,_ZThn4_N3ccc9CC13x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y14E[];
Class_Descriptor cd__ZN3ccc9CC13x9y14E = {  "_ZN3ccc9CC13x9y14E", // class name
  bases__ZN3ccc9CC13x9y14E, 2,
  &(vtc__ZN3ccc9CC13x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x9y15  : ::ccc::AA13 , ::ccc::BB9 {
  ~CC13x9y15(); // tgen
  CC13x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC13x9y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x9y15 ::~CC13x9y15(){ note_dtor("_ZN3ccc9CC13x9y15E", this);} // tgen
ccc::CC13x9y15 ::CC13x9y15(){ note_ctor("_ZN3ccc9CC13x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC13x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x9y15E, buf);
    ::ccc::CC13x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x9y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC13x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x9y15E);
    dp->::ccc::CC13x9y15::~CC13x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x9y15E(Test__ZN3ccc9CC13x9y15E, "_ZN3ccc9CC13x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x9y15C1Ev();
extern void _ZN3ccc9CC13x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC13x9y15E[] = {
  NSPAIR(_ZN3ccc9CC13x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC13x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC13x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x9y15E[];
Class_Descriptor cd__ZN3ccc9CC13x9y15E = {  "_ZN3ccc9CC13x9y15E", // class name
  bases__ZN3ccc9CC13x9y15E, 2,
  &(vtc__ZN3ccc9CC13x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x9y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y0  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC13x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y03pqrEv
  ~CC13x10y0(); // tgen
  CC13x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y0E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y03abcEv");}
void  ccc::CC13x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y03efgEv");}
void  ccc::CC13x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y03pqrEv");}
ccc::CC13x10y0 ::~CC13x10y0(){ note_dtor("_ZN3ccc9CC13x10y0E", this);} // tgen
ccc::CC13x10y0 ::CC13x10y0(){ note_ctor("_ZN3ccc9CC13x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y0E, buf);
    ::ccc::CC13x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y0E);
    dp->::ccc::CC13x10y0::~CC13x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y0E(Test__ZN3ccc9CC13x10y0E, "_ZN3ccc9CC13x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y0C1Ev();
extern void _ZN3ccc9CC13x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y0E[] = {
  NSPAIR(_ZN3ccc9CC13x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y0E[];
extern void _ZN3ccc9CC13x10y03efgEv();
extern void _ZN3ccc9CC13x10y03abcEv();
extern void _ZN3ccc9CC13x10y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y03pqrEv,_ZThn4_N3ccc9CC13x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y03abcEv,_ZThn4_N3ccc9CC13x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y03pqrEv,_ZThn4_N3ccc9CC13x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y03abcEv,_ZThn4_N3ccc9CC13x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y0E[];
Class_Descriptor cd__ZN3ccc9CC13x10y0E = {  "_ZN3ccc9CC13x10y0E", // class name
  bases__ZN3ccc9CC13x10y0E, 2,
  &(vtc__ZN3ccc9CC13x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y1  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC13x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x10y13efgEv
  ~CC13x10y1(); // tgen
  CC13x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y1E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y13abcEv");}
void  ccc::CC13x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y13pqrEv");}
void  ccc::CC13x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y13efgEv");}
ccc::CC13x10y1 ::~CC13x10y1(){ note_dtor("_ZN3ccc9CC13x10y1E", this);} // tgen
ccc::CC13x10y1 ::CC13x10y1(){ note_ctor("_ZN3ccc9CC13x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y1E, buf);
    ::ccc::CC13x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y1E);
    dp->::ccc::CC13x10y1::~CC13x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y1E(Test__ZN3ccc9CC13x10y1E, "_ZN3ccc9CC13x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y1C1Ev();
extern void _ZN3ccc9CC13x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y1E[] = {
  NSPAIR(_ZN3ccc9CC13x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y1E[];
extern void _ZN3ccc9CC13x10y13efgEv();
extern void _ZN3ccc9CC13x10y13abcEv();
extern void _ZN3ccc9CC13x10y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y13pqrEv,_ZThn4_N3ccc9CC13x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y13abcEv,_ZThn4_N3ccc9CC13x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y13pqrEv,_ZThn4_N3ccc9CC13x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y13abcEv,_ZThn4_N3ccc9CC13x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y1E[];
Class_Descriptor cd__ZN3ccc9CC13x10y1E = {  "_ZN3ccc9CC13x10y1E", // class name
  bases__ZN3ccc9CC13x10y1E, 2,
  &(vtc__ZN3ccc9CC13x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y2  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC13x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y23pqrEv
  ~CC13x10y2(); // tgen
  CC13x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y2E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y23efgEv");}
void  ccc::CC13x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y23abcEv");}
void  ccc::CC13x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y23pqrEv");}
ccc::CC13x10y2 ::~CC13x10y2(){ note_dtor("_ZN3ccc9CC13x10y2E", this);} // tgen
ccc::CC13x10y2 ::CC13x10y2(){ note_ctor("_ZN3ccc9CC13x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y2E, buf);
    ::ccc::CC13x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y2E);
    dp->::ccc::CC13x10y2::~CC13x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y2E(Test__ZN3ccc9CC13x10y2E, "_ZN3ccc9CC13x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y2C1Ev();
extern void _ZN3ccc9CC13x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y2E[] = {
  NSPAIR(_ZN3ccc9CC13x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y2E[];
extern void _ZN3ccc9CC13x10y23efgEv();
extern void _ZN3ccc9CC13x10y23abcEv();
extern void _ZN3ccc9CC13x10y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y23pqrEv,_ZThn4_N3ccc9CC13x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y23abcEv,_ZThn4_N3ccc9CC13x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y23pqrEv,_ZThn4_N3ccc9CC13x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y23abcEv,_ZThn4_N3ccc9CC13x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y2E[];
Class_Descriptor cd__ZN3ccc9CC13x10y2E = {  "_ZN3ccc9CC13x10y2E", // class name
  bases__ZN3ccc9CC13x10y2E, 2,
  &(vtc__ZN3ccc9CC13x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y3  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC13x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x10y33abcEv
  ~CC13x10y3(); // tgen
  CC13x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y3E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y33efgEv");}
void  ccc::CC13x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y33pqrEv");}
void  ccc::CC13x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y33abcEv");}
ccc::CC13x10y3 ::~CC13x10y3(){ note_dtor("_ZN3ccc9CC13x10y3E", this);} // tgen
ccc::CC13x10y3 ::CC13x10y3(){ note_ctor("_ZN3ccc9CC13x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y3E, buf);
    ::ccc::CC13x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y3E);
    dp->::ccc::CC13x10y3::~CC13x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y3E(Test__ZN3ccc9CC13x10y3E, "_ZN3ccc9CC13x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y3C1Ev();
extern void _ZN3ccc9CC13x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y3E[] = {
  NSPAIR(_ZN3ccc9CC13x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y3E[];
extern void _ZN3ccc9CC13x10y33efgEv();
extern void _ZN3ccc9CC13x10y33pqrEv();
extern void _ZN3ccc9CC13x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y33pqrEv,_ZThn4_N3ccc9CC13x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y33abcEv,_ZThn4_N3ccc9CC13x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y33pqrEv,_ZThn4_N3ccc9CC13x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y33abcEv,_ZThn4_N3ccc9CC13x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y3E[];
Class_Descriptor cd__ZN3ccc9CC13x10y3E = {  "_ZN3ccc9CC13x10y3E", // class name
  bases__ZN3ccc9CC13x10y3E, 2,
  &(vtc__ZN3ccc9CC13x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y4  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC13x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x10y43efgEv
  ~CC13x10y4(); // tgen
  CC13x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y4E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y43pqrEv");}
void  ccc::CC13x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y43abcEv");}
void  ccc::CC13x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y43efgEv");}
ccc::CC13x10y4 ::~CC13x10y4(){ note_dtor("_ZN3ccc9CC13x10y4E", this);} // tgen
ccc::CC13x10y4 ::CC13x10y4(){ note_ctor("_ZN3ccc9CC13x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y4E, buf);
    ::ccc::CC13x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y4E);
    dp->::ccc::CC13x10y4::~CC13x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y4E(Test__ZN3ccc9CC13x10y4E, "_ZN3ccc9CC13x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y4C1Ev();
extern void _ZN3ccc9CC13x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y4E[] = {
  NSPAIR(_ZN3ccc9CC13x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y4E[];
extern void _ZN3ccc9CC13x10y43efgEv();
extern void _ZN3ccc9CC13x10y43pqrEv();
extern void _ZN3ccc9CC13x10y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y43pqrEv,_ZThn4_N3ccc9CC13x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y43abcEv,_ZThn4_N3ccc9CC13x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y43pqrEv,_ZThn4_N3ccc9CC13x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y43abcEv,_ZThn4_N3ccc9CC13x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y4E[];
Class_Descriptor cd__ZN3ccc9CC13x10y4E = {  "_ZN3ccc9CC13x10y4E", // class name
  bases__ZN3ccc9CC13x10y4E, 2,
  &(vtc__ZN3ccc9CC13x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y5  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC13x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x10y53abcEv
  ~CC13x10y5(); // tgen
  CC13x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y5E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y53pqrEv");}
void  ccc::CC13x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y53efgEv");}
void  ccc::CC13x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y53abcEv");}
ccc::CC13x10y5 ::~CC13x10y5(){ note_dtor("_ZN3ccc9CC13x10y5E", this);} // tgen
ccc::CC13x10y5 ::CC13x10y5(){ note_ctor("_ZN3ccc9CC13x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y5E, buf);
    ::ccc::CC13x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y5E);
    dp->::ccc::CC13x10y5::~CC13x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y5E(Test__ZN3ccc9CC13x10y5E, "_ZN3ccc9CC13x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y5C1Ev();
extern void _ZN3ccc9CC13x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y5E[] = {
  NSPAIR(_ZN3ccc9CC13x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y5E[];
extern void _ZN3ccc9CC13x10y53efgEv();
extern void _ZN3ccc9CC13x10y53pqrEv();
extern void _ZN3ccc9CC13x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y53pqrEv,_ZThn4_N3ccc9CC13x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y53abcEv,_ZThn4_N3ccc9CC13x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y53pqrEv,_ZThn4_N3ccc9CC13x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y53abcEv,_ZThn4_N3ccc9CC13x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y5E[];
Class_Descriptor cd__ZN3ccc9CC13x10y5E = {  "_ZN3ccc9CC13x10y5E", // class name
  bases__ZN3ccc9CC13x10y5E, 2,
  &(vtc__ZN3ccc9CC13x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y6  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC13x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x10y63efgEv
  ~CC13x10y6(); // tgen
  CC13x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y6E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y63abcEv");}
void  ccc::CC13x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y63efgEv");}
ccc::CC13x10y6 ::~CC13x10y6(){ note_dtor("_ZN3ccc9CC13x10y6E", this);} // tgen
ccc::CC13x10y6 ::CC13x10y6(){ note_ctor("_ZN3ccc9CC13x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y6E, buf);
    ::ccc::CC13x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y6E);
    dp->::ccc::CC13x10y6::~CC13x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y6E(Test__ZN3ccc9CC13x10y6E, "_ZN3ccc9CC13x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y6C1Ev();
extern void _ZN3ccc9CC13x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y6E[] = {
  NSPAIR(_ZN3ccc9CC13x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y6E[];
extern void _ZN3ccc9CC13x10y63efgEv();
extern void _ZN3ccc9CC13x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y63abcEv,_ZThn4_N3ccc9CC13x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y63abcEv,_ZThn4_N3ccc9CC13x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y6E[];
Class_Descriptor cd__ZN3ccc9CC13x10y6E = {  "_ZN3ccc9CC13x10y6E", // class name
  bases__ZN3ccc9CC13x10y6E, 2,
  &(vtc__ZN3ccc9CC13x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y7  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC13x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y73pqrEv
  ~CC13x10y7(); // tgen
  CC13x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y7E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y73abcEv");}
void  ccc::CC13x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y73pqrEv");}
ccc::CC13x10y7 ::~CC13x10y7(){ note_dtor("_ZN3ccc9CC13x10y7E", this);} // tgen
ccc::CC13x10y7 ::CC13x10y7(){ note_ctor("_ZN3ccc9CC13x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y7E, buf);
    ::ccc::CC13x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y7E);
    dp->::ccc::CC13x10y7::~CC13x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y7E(Test__ZN3ccc9CC13x10y7E, "_ZN3ccc9CC13x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y7C1Ev();
extern void _ZN3ccc9CC13x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y7E[] = {
  NSPAIR(_ZN3ccc9CC13x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x10y73abcEv();
extern void _ZN3ccc9CC13x10y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y73pqrEv,_ZThn4_N3ccc9CC13x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y73abcEv,_ZThn4_N3ccc9CC13x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y73pqrEv,_ZThn4_N3ccc9CC13x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y73abcEv,_ZThn4_N3ccc9CC13x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y7E[];
Class_Descriptor cd__ZN3ccc9CC13x10y7E = {  "_ZN3ccc9CC13x10y7E", // class name
  bases__ZN3ccc9CC13x10y7E, 2,
  &(vtc__ZN3ccc9CC13x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y8  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC13x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x10y83abcEv
  ~CC13x10y8(); // tgen
  CC13x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y8E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y83efgEv");}
void  ccc::CC13x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x10y83abcEv");}
ccc::CC13x10y8 ::~CC13x10y8(){ note_dtor("_ZN3ccc9CC13x10y8E", this);} // tgen
ccc::CC13x10y8 ::CC13x10y8(){ note_ctor("_ZN3ccc9CC13x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y8E, buf);
    ::ccc::CC13x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y8E);
    dp->::ccc::CC13x10y8::~CC13x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y8E(Test__ZN3ccc9CC13x10y8E, "_ZN3ccc9CC13x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y8C1Ev();
extern void _ZN3ccc9CC13x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y8E[] = {
  NSPAIR(_ZN3ccc9CC13x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y8E[];
extern void _ZN3ccc9CC13x10y83efgEv();
extern void _ZN3ccc9CC13x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y83abcEv,_ZThn4_N3ccc9CC13x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y83abcEv,_ZThn4_N3ccc9CC13x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y8E[];
Class_Descriptor cd__ZN3ccc9CC13x10y8E = {  "_ZN3ccc9CC13x10y8E", // class name
  bases__ZN3ccc9CC13x10y8E, 2,
  &(vtc__ZN3ccc9CC13x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y9  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC13x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x10y93pqrEv
  ~CC13x10y9(); // tgen
  CC13x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x10y9E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x10y93efgEv");}
void  ccc::CC13x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x10y93pqrEv");}
ccc::CC13x10y9 ::~CC13x10y9(){ note_dtor("_ZN3ccc9CC13x10y9E", this);} // tgen
ccc::CC13x10y9 ::CC13x10y9(){ note_ctor("_ZN3ccc9CC13x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x10y9E, buf);
    ::ccc::CC13x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x10y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC13x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x10y9E);
    dp->::ccc::CC13x10y9::~CC13x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x10y9E(Test__ZN3ccc9CC13x10y9E, "_ZN3ccc9CC13x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x10y9C1Ev();
extern void _ZN3ccc9CC13x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x10y9E[] = {
  NSPAIR(_ZN3ccc9CC13x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC13x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y9E[];
extern void _ZN3ccc9CC13x10y93efgEv();
extern void _ZN3ccc9CC13x10y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x10y93pqrEv,_ZThn4_N3ccc9CC13x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x10y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x10y93pqrEv,_ZThn4_N3ccc9CC13x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x10y9E[];
Class_Descriptor cd__ZN3ccc9CC13x10y9E = {  "_ZN3ccc9CC13x10y9E", // class name
  bases__ZN3ccc9CC13x10y9E, 2,
  &(vtc__ZN3ccc9CC13x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x10y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y10  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC13x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x10y103abcEv
  ~CC13x10y10(); // tgen
  CC13x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y10E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x10y103pqrEv");}
void  ccc::CC13x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x10y103abcEv");}
ccc::CC13x10y10 ::~CC13x10y10(){ note_dtor("_ZN3ccc10CC13x10y10E", this);} // tgen
ccc::CC13x10y10 ::CC13x10y10(){ note_ctor("_ZN3ccc10CC13x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y10E, buf);
    ::ccc::CC13x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y10E);
    dp->::ccc::CC13x10y10::~CC13x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y10E(Test__ZN3ccc10CC13x10y10E, "_ZN3ccc10CC13x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y10C1Ev();
extern void _ZN3ccc10CC13x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y10E[] = {
  NSPAIR(_ZN3ccc10CC13x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x10y103pqrEv();
extern void _ZN3ccc10CC13x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x10y103pqrEv,_ZThn4_N3ccc10CC13x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC13x10y103abcEv,_ZThn4_N3ccc10CC13x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x10y103pqrEv,_ZThn4_N3ccc10CC13x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x10y103abcEv,_ZThn4_N3ccc10CC13x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y10E[];
Class_Descriptor cd__ZN3ccc10CC13x10y10E = {  "_ZN3ccc10CC13x10y10E", // class name
  bases__ZN3ccc10CC13x10y10E, 2,
  &(vtc__ZN3ccc10CC13x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y11  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC13x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x10y113efgEv
  ~CC13x10y11(); // tgen
  CC13x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y11E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x10y113pqrEv");}
void  ccc::CC13x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x10y113efgEv");}
ccc::CC13x10y11 ::~CC13x10y11(){ note_dtor("_ZN3ccc10CC13x10y11E", this);} // tgen
ccc::CC13x10y11 ::CC13x10y11(){ note_ctor("_ZN3ccc10CC13x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y11E, buf);
    ::ccc::CC13x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y11E);
    dp->::ccc::CC13x10y11::~CC13x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y11E(Test__ZN3ccc10CC13x10y11E, "_ZN3ccc10CC13x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y11C1Ev();
extern void _ZN3ccc10CC13x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y11E[] = {
  NSPAIR(_ZN3ccc10CC13x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y11E[];
extern void _ZN3ccc10CC13x10y113efgEv();
extern void _ZN3ccc10CC13x10y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x10y113pqrEv,_ZThn4_N3ccc10CC13x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x10y113pqrEv,_ZThn4_N3ccc10CC13x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y11E[];
Class_Descriptor cd__ZN3ccc10CC13x10y11E = {  "_ZN3ccc10CC13x10y11E", // class name
  bases__ZN3ccc10CC13x10y11E, 2,
  &(vtc__ZN3ccc10CC13x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y12  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC13x10y123abcEv
  ~CC13x10y12(); // tgen
  CC13x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y12E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC13x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x10y123abcEv");}
ccc::CC13x10y12 ::~CC13x10y12(){ note_dtor("_ZN3ccc10CC13x10y12E", this);} // tgen
ccc::CC13x10y12 ::CC13x10y12(){ note_ctor("_ZN3ccc10CC13x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y12E, buf);
    ::ccc::CC13x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y12E);
    dp->::ccc::CC13x10y12::~CC13x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y12E(Test__ZN3ccc10CC13x10y12E, "_ZN3ccc10CC13x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y12C1Ev();
extern void _ZN3ccc10CC13x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y12E[] = {
  NSPAIR(_ZN3ccc10CC13x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x10y123abcEv,_ZThn4_N3ccc10CC13x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x10y123abcEv,_ZThn4_N3ccc10CC13x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y12E[];
Class_Descriptor cd__ZN3ccc10CC13x10y12E = {  "_ZN3ccc10CC13x10y12E", // class name
  bases__ZN3ccc10CC13x10y12E, 2,
  &(vtc__ZN3ccc10CC13x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y13  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC13x10y133efgEv
  ~CC13x10y13(); // tgen
  CC13x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y13E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC13x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x10y133efgEv");}
ccc::CC13x10y13 ::~CC13x10y13(){ note_dtor("_ZN3ccc10CC13x10y13E", this);} // tgen
ccc::CC13x10y13 ::CC13x10y13(){ note_ctor("_ZN3ccc10CC13x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y13E, buf);
    ::ccc::CC13x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y13E);
    dp->::ccc::CC13x10y13::~CC13x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y13E(Test__ZN3ccc10CC13x10y13E, "_ZN3ccc10CC13x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y13C1Ev();
extern void _ZN3ccc10CC13x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y13E[] = {
  NSPAIR(_ZN3ccc10CC13x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y13E[];
extern void _ZN3ccc10CC13x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y13E[];
Class_Descriptor cd__ZN3ccc10CC13x10y13E = {  "_ZN3ccc10CC13x10y13E", // class name
  bases__ZN3ccc10CC13x10y13E, 2,
  &(vtc__ZN3ccc10CC13x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y14  : ::ccc::AA13 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC13x10y143pqrEv
  ~CC13x10y14(); // tgen
  CC13x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y14E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x10y143pqrEv");}
ccc::CC13x10y14 ::~CC13x10y14(){ note_dtor("_ZN3ccc10CC13x10y14E", this);} // tgen
ccc::CC13x10y14 ::CC13x10y14(){ note_ctor("_ZN3ccc10CC13x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y14E, buf);
    ::ccc::CC13x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y14E);
    dp->::ccc::CC13x10y14::~CC13x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y14E(Test__ZN3ccc10CC13x10y14E, "_ZN3ccc10CC13x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y14C1Ev();
extern void _ZN3ccc10CC13x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y14E[] = {
  NSPAIR(_ZN3ccc10CC13x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x10y143pqrEv,_ZThn4_N3ccc10CC13x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x10y143pqrEv,_ZThn4_N3ccc10CC13x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y14E[];
Class_Descriptor cd__ZN3ccc10CC13x10y14E = {  "_ZN3ccc10CC13x10y14E", // class name
  bases__ZN3ccc10CC13x10y14E, 2,
  &(vtc__ZN3ccc10CC13x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x10y15  : ::ccc::AA13 , ::ccc::BB10 {
  ~CC13x10y15(); // tgen
  CC13x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x10y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x10y15 ::~CC13x10y15(){ note_dtor("_ZN3ccc10CC13x10y15E", this);} // tgen
ccc::CC13x10y15 ::CC13x10y15(){ note_ctor("_ZN3ccc10CC13x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x10y15E, buf);
    ::ccc::CC13x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x10y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC13x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x10y15E);
    dp->::ccc::CC13x10y15::~CC13x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x10y15E(Test__ZN3ccc10CC13x10y15E, "_ZN3ccc10CC13x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x10y15C1Ev();
extern void _ZN3ccc10CC13x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x10y15E[] = {
  NSPAIR(_ZN3ccc10CC13x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC13x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x10y15E[];
Class_Descriptor cd__ZN3ccc10CC13x10y15E = {  "_ZN3ccc10CC13x10y15E", // class name
  bases__ZN3ccc10CC13x10y15E, 2,
  &(vtc__ZN3ccc10CC13x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x10y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y0  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC13x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y03pqrEv
  ~CC13x11y0(); // tgen
  CC13x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y0E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y03abcEv");}
void  ccc::CC13x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y03efgEv");}
void  ccc::CC13x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y03pqrEv");}
ccc::CC13x11y0 ::~CC13x11y0(){ note_dtor("_ZN3ccc9CC13x11y0E", this);} // tgen
ccc::CC13x11y0 ::CC13x11y0(){ note_ctor("_ZN3ccc9CC13x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y0E, buf);
    ::ccc::CC13x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y0E);
    dp->::ccc::CC13x11y0::~CC13x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y0E(Test__ZN3ccc9CC13x11y0E, "_ZN3ccc9CC13x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y0C1Ev();
extern void _ZN3ccc9CC13x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y0E[] = {
  NSPAIR(_ZN3ccc9CC13x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y0E[];
extern void _ZN3ccc9CC13x11y03efgEv();
extern void _ZN3ccc9CC13x11y03abcEv();
extern void _ZN3ccc9CC13x11y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y03pqrEv,_ZThn4_N3ccc9CC13x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y03efgEv,_ZThn4_N3ccc9CC13x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y03pqrEv,_ZThn4_N3ccc9CC13x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y03efgEv,_ZThn4_N3ccc9CC13x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y0E[];
Class_Descriptor cd__ZN3ccc9CC13x11y0E = {  "_ZN3ccc9CC13x11y0E", // class name
  bases__ZN3ccc9CC13x11y0E, 2,
  &(vtc__ZN3ccc9CC13x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y1  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC13x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x11y13efgEv
  ~CC13x11y1(); // tgen
  CC13x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y1E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y13abcEv");}
void  ccc::CC13x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y13pqrEv");}
void  ccc::CC13x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y13efgEv");}
ccc::CC13x11y1 ::~CC13x11y1(){ note_dtor("_ZN3ccc9CC13x11y1E", this);} // tgen
ccc::CC13x11y1 ::CC13x11y1(){ note_ctor("_ZN3ccc9CC13x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y1E, buf);
    ::ccc::CC13x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y1E);
    dp->::ccc::CC13x11y1::~CC13x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y1E(Test__ZN3ccc9CC13x11y1E, "_ZN3ccc9CC13x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y1C1Ev();
extern void _ZN3ccc9CC13x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y1E[] = {
  NSPAIR(_ZN3ccc9CC13x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y1E[];
extern void _ZN3ccc9CC13x11y13efgEv();
extern void _ZN3ccc9CC13x11y13abcEv();
extern void _ZN3ccc9CC13x11y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y13pqrEv,_ZThn4_N3ccc9CC13x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y13efgEv,_ZThn4_N3ccc9CC13x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y13pqrEv,_ZThn4_N3ccc9CC13x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y13efgEv,_ZThn4_N3ccc9CC13x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y1E[];
Class_Descriptor cd__ZN3ccc9CC13x11y1E = {  "_ZN3ccc9CC13x11y1E", // class name
  bases__ZN3ccc9CC13x11y1E, 2,
  &(vtc__ZN3ccc9CC13x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y2  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC13x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y23pqrEv
  ~CC13x11y2(); // tgen
  CC13x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y2E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y23efgEv");}
void  ccc::CC13x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y23abcEv");}
void  ccc::CC13x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y23pqrEv");}
ccc::CC13x11y2 ::~CC13x11y2(){ note_dtor("_ZN3ccc9CC13x11y2E", this);} // tgen
ccc::CC13x11y2 ::CC13x11y2(){ note_ctor("_ZN3ccc9CC13x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y2E, buf);
    ::ccc::CC13x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y2E);
    dp->::ccc::CC13x11y2::~CC13x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y2E(Test__ZN3ccc9CC13x11y2E, "_ZN3ccc9CC13x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y2C1Ev();
extern void _ZN3ccc9CC13x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y2E[] = {
  NSPAIR(_ZN3ccc9CC13x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y2E[];
extern void _ZN3ccc9CC13x11y23efgEv();
extern void _ZN3ccc9CC13x11y23abcEv();
extern void _ZN3ccc9CC13x11y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y23pqrEv,_ZThn4_N3ccc9CC13x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y23efgEv,_ZThn4_N3ccc9CC13x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y23pqrEv,_ZThn4_N3ccc9CC13x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y23efgEv,_ZThn4_N3ccc9CC13x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y2E[];
Class_Descriptor cd__ZN3ccc9CC13x11y2E = {  "_ZN3ccc9CC13x11y2E", // class name
  bases__ZN3ccc9CC13x11y2E, 2,
  &(vtc__ZN3ccc9CC13x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y3  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC13x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x11y33abcEv
  ~CC13x11y3(); // tgen
  CC13x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y3E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y33efgEv");}
void  ccc::CC13x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y33pqrEv");}
void  ccc::CC13x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y33abcEv");}
ccc::CC13x11y3 ::~CC13x11y3(){ note_dtor("_ZN3ccc9CC13x11y3E", this);} // tgen
ccc::CC13x11y3 ::CC13x11y3(){ note_ctor("_ZN3ccc9CC13x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y3E, buf);
    ::ccc::CC13x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y3E);
    dp->::ccc::CC13x11y3::~CC13x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y3E(Test__ZN3ccc9CC13x11y3E, "_ZN3ccc9CC13x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y3C1Ev();
extern void _ZN3ccc9CC13x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y3E[] = {
  NSPAIR(_ZN3ccc9CC13x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y3E[];
extern void _ZN3ccc9CC13x11y33efgEv();
extern void _ZN3ccc9CC13x11y33pqrEv();
extern void _ZN3ccc9CC13x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y33pqrEv,_ZThn4_N3ccc9CC13x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y33efgEv,_ZThn4_N3ccc9CC13x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y33pqrEv,_ZThn4_N3ccc9CC13x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y33efgEv,_ZThn4_N3ccc9CC13x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y3E[];
Class_Descriptor cd__ZN3ccc9CC13x11y3E = {  "_ZN3ccc9CC13x11y3E", // class name
  bases__ZN3ccc9CC13x11y3E, 2,
  &(vtc__ZN3ccc9CC13x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y4  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC13x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x11y43efgEv
  ~CC13x11y4(); // tgen
  CC13x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y4E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y43pqrEv");}
void  ccc::CC13x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y43abcEv");}
void  ccc::CC13x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y43efgEv");}
ccc::CC13x11y4 ::~CC13x11y4(){ note_dtor("_ZN3ccc9CC13x11y4E", this);} // tgen
ccc::CC13x11y4 ::CC13x11y4(){ note_ctor("_ZN3ccc9CC13x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y4E, buf);
    ::ccc::CC13x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y4E);
    dp->::ccc::CC13x11y4::~CC13x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y4E(Test__ZN3ccc9CC13x11y4E, "_ZN3ccc9CC13x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y4C1Ev();
extern void _ZN3ccc9CC13x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y4E[] = {
  NSPAIR(_ZN3ccc9CC13x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y4E[];
extern void _ZN3ccc9CC13x11y43efgEv();
extern void _ZN3ccc9CC13x11y43pqrEv();
extern void _ZN3ccc9CC13x11y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y43pqrEv,_ZThn4_N3ccc9CC13x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y43efgEv,_ZThn4_N3ccc9CC13x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y43pqrEv,_ZThn4_N3ccc9CC13x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y43efgEv,_ZThn4_N3ccc9CC13x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y4E[];
Class_Descriptor cd__ZN3ccc9CC13x11y4E = {  "_ZN3ccc9CC13x11y4E", // class name
  bases__ZN3ccc9CC13x11y4E, 2,
  &(vtc__ZN3ccc9CC13x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y5  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC13x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x11y53abcEv
  ~CC13x11y5(); // tgen
  CC13x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y5E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y53pqrEv");}
void  ccc::CC13x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y53efgEv");}
void  ccc::CC13x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y53abcEv");}
ccc::CC13x11y5 ::~CC13x11y5(){ note_dtor("_ZN3ccc9CC13x11y5E", this);} // tgen
ccc::CC13x11y5 ::CC13x11y5(){ note_ctor("_ZN3ccc9CC13x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y5E, buf);
    ::ccc::CC13x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y5E);
    dp->::ccc::CC13x11y5::~CC13x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y5E(Test__ZN3ccc9CC13x11y5E, "_ZN3ccc9CC13x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y5C1Ev();
extern void _ZN3ccc9CC13x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y5E[] = {
  NSPAIR(_ZN3ccc9CC13x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y5E[];
extern void _ZN3ccc9CC13x11y53efgEv();
extern void _ZN3ccc9CC13x11y53pqrEv();
extern void _ZN3ccc9CC13x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y53pqrEv,_ZThn4_N3ccc9CC13x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y53efgEv,_ZThn4_N3ccc9CC13x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y53pqrEv,_ZThn4_N3ccc9CC13x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y53efgEv,_ZThn4_N3ccc9CC13x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y5E[];
Class_Descriptor cd__ZN3ccc9CC13x11y5E = {  "_ZN3ccc9CC13x11y5E", // class name
  bases__ZN3ccc9CC13x11y5E, 2,
  &(vtc__ZN3ccc9CC13x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y6  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC13x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x11y63efgEv
  ~CC13x11y6(); // tgen
  CC13x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y6E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y63abcEv");}
void  ccc::CC13x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y63efgEv");}
ccc::CC13x11y6 ::~CC13x11y6(){ note_dtor("_ZN3ccc9CC13x11y6E", this);} // tgen
ccc::CC13x11y6 ::CC13x11y6(){ note_ctor("_ZN3ccc9CC13x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y6E, buf);
    ::ccc::CC13x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y6E);
    dp->::ccc::CC13x11y6::~CC13x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y6E(Test__ZN3ccc9CC13x11y6E, "_ZN3ccc9CC13x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y6C1Ev();
extern void _ZN3ccc9CC13x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y6E[] = {
  NSPAIR(_ZN3ccc9CC13x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y6E[];
extern void _ZN3ccc9CC13x11y63efgEv();
extern void _ZN3ccc9CC13x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y63efgEv,_ZThn4_N3ccc9CC13x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y63efgEv,_ZThn4_N3ccc9CC13x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y6E[];
Class_Descriptor cd__ZN3ccc9CC13x11y6E = {  "_ZN3ccc9CC13x11y6E", // class name
  bases__ZN3ccc9CC13x11y6E, 2,
  &(vtc__ZN3ccc9CC13x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y7  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC13x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y73pqrEv
  ~CC13x11y7(); // tgen
  CC13x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y7E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y73abcEv");}
void  ccc::CC13x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y73pqrEv");}
ccc::CC13x11y7 ::~CC13x11y7(){ note_dtor("_ZN3ccc9CC13x11y7E", this);} // tgen
ccc::CC13x11y7 ::CC13x11y7(){ note_ctor("_ZN3ccc9CC13x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y7E, buf);
    ::ccc::CC13x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y7E);
    dp->::ccc::CC13x11y7::~CC13x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y7E(Test__ZN3ccc9CC13x11y7E, "_ZN3ccc9CC13x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y7C1Ev();
extern void _ZN3ccc9CC13x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y7E[] = {
  NSPAIR(_ZN3ccc9CC13x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x11y73abcEv();
extern void _ZN3ccc9CC13x11y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y73pqrEv,_ZThn4_N3ccc9CC13x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y73pqrEv,_ZThn4_N3ccc9CC13x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y7E[];
Class_Descriptor cd__ZN3ccc9CC13x11y7E = {  "_ZN3ccc9CC13x11y7E", // class name
  bases__ZN3ccc9CC13x11y7E, 2,
  &(vtc__ZN3ccc9CC13x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y8  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC13x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x11y83abcEv
  ~CC13x11y8(); // tgen
  CC13x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y8E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y83efgEv");}
void  ccc::CC13x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x11y83abcEv");}
ccc::CC13x11y8 ::~CC13x11y8(){ note_dtor("_ZN3ccc9CC13x11y8E", this);} // tgen
ccc::CC13x11y8 ::CC13x11y8(){ note_ctor("_ZN3ccc9CC13x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y8E, buf);
    ::ccc::CC13x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y8E);
    dp->::ccc::CC13x11y8::~CC13x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y8E(Test__ZN3ccc9CC13x11y8E, "_ZN3ccc9CC13x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y8C1Ev();
extern void _ZN3ccc9CC13x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y8E[] = {
  NSPAIR(_ZN3ccc9CC13x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y8E[];
extern void _ZN3ccc9CC13x11y83efgEv();
extern void _ZN3ccc9CC13x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y83efgEv,_ZThn4_N3ccc9CC13x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y83efgEv,_ZThn4_N3ccc9CC13x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y8E[];
Class_Descriptor cd__ZN3ccc9CC13x11y8E = {  "_ZN3ccc9CC13x11y8E", // class name
  bases__ZN3ccc9CC13x11y8E, 2,
  &(vtc__ZN3ccc9CC13x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y9  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC13x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x11y93pqrEv
  ~CC13x11y9(); // tgen
  CC13x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x11y9E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x11y93efgEv");}
void  ccc::CC13x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x11y93pqrEv");}
ccc::CC13x11y9 ::~CC13x11y9(){ note_dtor("_ZN3ccc9CC13x11y9E", this);} // tgen
ccc::CC13x11y9 ::CC13x11y9(){ note_ctor("_ZN3ccc9CC13x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x11y9E, buf);
    ::ccc::CC13x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x11y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC13x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x11y9E);
    dp->::ccc::CC13x11y9::~CC13x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x11y9E(Test__ZN3ccc9CC13x11y9E, "_ZN3ccc9CC13x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x11y9C1Ev();
extern void _ZN3ccc9CC13x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x11y9E[] = {
  NSPAIR(_ZN3ccc9CC13x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC13x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y9E[];
extern void _ZN3ccc9CC13x11y93efgEv();
extern void _ZN3ccc9CC13x11y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y93pqrEv,_ZThn4_N3ccc9CC13x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC13x11y93efgEv,_ZThn4_N3ccc9CC13x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x11y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y93pqrEv,_ZThn4_N3ccc9CC13x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x11y93efgEv,_ZThn4_N3ccc9CC13x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x11y9E[];
Class_Descriptor cd__ZN3ccc9CC13x11y9E = {  "_ZN3ccc9CC13x11y9E", // class name
  bases__ZN3ccc9CC13x11y9E, 2,
  &(vtc__ZN3ccc9CC13x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x11y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y10  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC13x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x11y103abcEv
  ~CC13x11y10(); // tgen
  CC13x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y10E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x11y103pqrEv");}
void  ccc::CC13x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x11y103abcEv");}
ccc::CC13x11y10 ::~CC13x11y10(){ note_dtor("_ZN3ccc10CC13x11y10E", this);} // tgen
ccc::CC13x11y10 ::CC13x11y10(){ note_ctor("_ZN3ccc10CC13x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y10E, buf);
    ::ccc::CC13x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y10E);
    dp->::ccc::CC13x11y10::~CC13x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y10E(Test__ZN3ccc10CC13x11y10E, "_ZN3ccc10CC13x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y10C1Ev();
extern void _ZN3ccc10CC13x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y10E[] = {
  NSPAIR(_ZN3ccc10CC13x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x11y103pqrEv();
extern void _ZN3ccc10CC13x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x11y103pqrEv,_ZThn4_N3ccc10CC13x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x11y103pqrEv,_ZThn4_N3ccc10CC13x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y10E[];
Class_Descriptor cd__ZN3ccc10CC13x11y10E = {  "_ZN3ccc10CC13x11y10E", // class name
  bases__ZN3ccc10CC13x11y10E, 2,
  &(vtc__ZN3ccc10CC13x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y11  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC13x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x11y113efgEv
  ~CC13x11y11(); // tgen
  CC13x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y11E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x11y113pqrEv");}
void  ccc::CC13x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x11y113efgEv");}
ccc::CC13x11y11 ::~CC13x11y11(){ note_dtor("_ZN3ccc10CC13x11y11E", this);} // tgen
ccc::CC13x11y11 ::CC13x11y11(){ note_ctor("_ZN3ccc10CC13x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y11E, buf);
    ::ccc::CC13x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y11E);
    dp->::ccc::CC13x11y11::~CC13x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y11E(Test__ZN3ccc10CC13x11y11E, "_ZN3ccc10CC13x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y11C1Ev();
extern void _ZN3ccc10CC13x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y11E[] = {
  NSPAIR(_ZN3ccc10CC13x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y11E[];
extern void _ZN3ccc10CC13x11y113efgEv();
extern void _ZN3ccc10CC13x11y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x11y113pqrEv,_ZThn4_N3ccc10CC13x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC13x11y113efgEv,_ZThn4_N3ccc10CC13x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x11y113pqrEv,_ZThn4_N3ccc10CC13x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x11y113efgEv,_ZThn4_N3ccc10CC13x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y11E[];
Class_Descriptor cd__ZN3ccc10CC13x11y11E = {  "_ZN3ccc10CC13x11y11E", // class name
  bases__ZN3ccc10CC13x11y11E, 2,
  &(vtc__ZN3ccc10CC13x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y12  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC13x11y123abcEv
  ~CC13x11y12(); // tgen
  CC13x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y12E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC13x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x11y123abcEv");}
ccc::CC13x11y12 ::~CC13x11y12(){ note_dtor("_ZN3ccc10CC13x11y12E", this);} // tgen
ccc::CC13x11y12 ::CC13x11y12(){ note_ctor("_ZN3ccc10CC13x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y12E, buf);
    ::ccc::CC13x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y12E);
    dp->::ccc::CC13x11y12::~CC13x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y12E(Test__ZN3ccc10CC13x11y12E, "_ZN3ccc10CC13x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y12C1Ev();
extern void _ZN3ccc10CC13x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y12E[] = {
  NSPAIR(_ZN3ccc10CC13x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y12E[];
Class_Descriptor cd__ZN3ccc10CC13x11y12E = {  "_ZN3ccc10CC13x11y12E", // class name
  bases__ZN3ccc10CC13x11y12E, 2,
  &(vtc__ZN3ccc10CC13x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y13  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC13x11y133efgEv
  ~CC13x11y13(); // tgen
  CC13x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y13E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC13x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x11y133efgEv");}
ccc::CC13x11y13 ::~CC13x11y13(){ note_dtor("_ZN3ccc10CC13x11y13E", this);} // tgen
ccc::CC13x11y13 ::CC13x11y13(){ note_ctor("_ZN3ccc10CC13x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y13E, buf);
    ::ccc::CC13x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y13E);
    dp->::ccc::CC13x11y13::~CC13x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y13E(Test__ZN3ccc10CC13x11y13E, "_ZN3ccc10CC13x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y13C1Ev();
extern void _ZN3ccc10CC13x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y13E[] = {
  NSPAIR(_ZN3ccc10CC13x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y13E[];
extern void _ZN3ccc10CC13x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x11y133efgEv,_ZThn4_N3ccc10CC13x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x11y133efgEv,_ZThn4_N3ccc10CC13x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y13E[];
Class_Descriptor cd__ZN3ccc10CC13x11y13E = {  "_ZN3ccc10CC13x11y13E", // class name
  bases__ZN3ccc10CC13x11y13E, 2,
  &(vtc__ZN3ccc10CC13x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y14  : ::ccc::AA13 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC13x11y143pqrEv
  ~CC13x11y14(); // tgen
  CC13x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y14E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC13x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x11y143pqrEv");}
ccc::CC13x11y14 ::~CC13x11y14(){ note_dtor("_ZN3ccc10CC13x11y14E", this);} // tgen
ccc::CC13x11y14 ::CC13x11y14(){ note_ctor("_ZN3ccc10CC13x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y14E, buf);
    ::ccc::CC13x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y14E);
    dp->::ccc::CC13x11y14::~CC13x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y14E(Test__ZN3ccc10CC13x11y14E, "_ZN3ccc10CC13x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y14C1Ev();
extern void _ZN3ccc10CC13x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y14E[] = {
  NSPAIR(_ZN3ccc10CC13x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x11y143pqrEv,_ZThn4_N3ccc10CC13x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x11y143pqrEv,_ZThn4_N3ccc10CC13x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y14E[];
Class_Descriptor cd__ZN3ccc10CC13x11y14E = {  "_ZN3ccc10CC13x11y14E", // class name
  bases__ZN3ccc10CC13x11y14E, 2,
  &(vtc__ZN3ccc10CC13x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x11y15  : ::ccc::AA13 , ::ccc::BB11 {
  ~CC13x11y15(); // tgen
  CC13x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x11y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC13x11y15 ::~CC13x11y15(){ note_dtor("_ZN3ccc10CC13x11y15E", this);} // tgen
ccc::CC13x11y15 ::CC13x11y15(){ note_ctor("_ZN3ccc10CC13x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x11y15E, buf);
    ::ccc::CC13x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x11y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC13x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x11y15E);
    dp->::ccc::CC13x11y15::~CC13x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x11y15E(Test__ZN3ccc10CC13x11y15E, "_ZN3ccc10CC13x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x11y15C1Ev();
extern void _ZN3ccc10CC13x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x11y15E[] = {
  NSPAIR(_ZN3ccc10CC13x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC13x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x11y15E[];
Class_Descriptor cd__ZN3ccc10CC13x11y15E = {  "_ZN3ccc10CC13x11y15E", // class name
  bases__ZN3ccc10CC13x11y15E, 2,
  &(vtc__ZN3ccc10CC13x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x11y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y0  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC13x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y03pqrEv
  ~CC13x12y0(); // tgen
  CC13x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y0E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y03abcEv");}
void  ccc::CC13x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y03efgEv");}
void  ccc::CC13x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y03pqrEv");}
ccc::CC13x12y0 ::~CC13x12y0(){ note_dtor("_ZN3ccc9CC13x12y0E", this);} // tgen
ccc::CC13x12y0 ::CC13x12y0(){ note_ctor("_ZN3ccc9CC13x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y0E, buf);
    ::ccc::CC13x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y0E);
    dp->::ccc::CC13x12y0::~CC13x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y0E(Test__ZN3ccc9CC13x12y0E, "_ZN3ccc9CC13x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y0C1Ev();
extern void _ZN3ccc9CC13x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y0E[] = {
  NSPAIR(_ZN3ccc9CC13x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y0E[];
extern void _ZN3ccc9CC13x12y03efgEv();
extern void _ZN3ccc9CC13x12y03abcEv();
extern void _ZN3ccc9CC13x12y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y03abcEv,_ZThn4_N3ccc9CC13x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y03abcEv,_ZThn4_N3ccc9CC13x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y0E[];
Class_Descriptor cd__ZN3ccc9CC13x12y0E = {  "_ZN3ccc9CC13x12y0E", // class name
  bases__ZN3ccc9CC13x12y0E, 2,
  &(vtc__ZN3ccc9CC13x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y1  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC13x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x12y13efgEv
  ~CC13x12y1(); // tgen
  CC13x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y1E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y13abcEv");}
void  ccc::CC13x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y13pqrEv");}
void  ccc::CC13x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y13efgEv");}
ccc::CC13x12y1 ::~CC13x12y1(){ note_dtor("_ZN3ccc9CC13x12y1E", this);} // tgen
ccc::CC13x12y1 ::CC13x12y1(){ note_ctor("_ZN3ccc9CC13x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y1E, buf);
    ::ccc::CC13x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y1E);
    dp->::ccc::CC13x12y1::~CC13x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y1E(Test__ZN3ccc9CC13x12y1E, "_ZN3ccc9CC13x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y1C1Ev();
extern void _ZN3ccc9CC13x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y1E[] = {
  NSPAIR(_ZN3ccc9CC13x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y1E[];
extern void _ZN3ccc9CC13x12y13efgEv();
extern void _ZN3ccc9CC13x12y13abcEv();
extern void _ZN3ccc9CC13x12y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y13abcEv,_ZThn4_N3ccc9CC13x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y13abcEv,_ZThn4_N3ccc9CC13x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y1E[];
Class_Descriptor cd__ZN3ccc9CC13x12y1E = {  "_ZN3ccc9CC13x12y1E", // class name
  bases__ZN3ccc9CC13x12y1E, 2,
  &(vtc__ZN3ccc9CC13x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y2  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC13x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y23pqrEv
  ~CC13x12y2(); // tgen
  CC13x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y2E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y23efgEv");}
void  ccc::CC13x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y23abcEv");}
void  ccc::CC13x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y23pqrEv");}
ccc::CC13x12y2 ::~CC13x12y2(){ note_dtor("_ZN3ccc9CC13x12y2E", this);} // tgen
ccc::CC13x12y2 ::CC13x12y2(){ note_ctor("_ZN3ccc9CC13x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y2E, buf);
    ::ccc::CC13x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y2E);
    dp->::ccc::CC13x12y2::~CC13x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y2E(Test__ZN3ccc9CC13x12y2E, "_ZN3ccc9CC13x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y2C1Ev();
extern void _ZN3ccc9CC13x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y2E[] = {
  NSPAIR(_ZN3ccc9CC13x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y2E[];
extern void _ZN3ccc9CC13x12y23efgEv();
extern void _ZN3ccc9CC13x12y23abcEv();
extern void _ZN3ccc9CC13x12y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y23abcEv,_ZThn4_N3ccc9CC13x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y23abcEv,_ZThn4_N3ccc9CC13x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y2E[];
Class_Descriptor cd__ZN3ccc9CC13x12y2E = {  "_ZN3ccc9CC13x12y2E", // class name
  bases__ZN3ccc9CC13x12y2E, 2,
  &(vtc__ZN3ccc9CC13x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y3  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC13x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x12y33abcEv
  ~CC13x12y3(); // tgen
  CC13x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y3E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y33efgEv");}
void  ccc::CC13x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y33pqrEv");}
void  ccc::CC13x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y33abcEv");}
ccc::CC13x12y3 ::~CC13x12y3(){ note_dtor("_ZN3ccc9CC13x12y3E", this);} // tgen
ccc::CC13x12y3 ::CC13x12y3(){ note_ctor("_ZN3ccc9CC13x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y3E, buf);
    ::ccc::CC13x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y3E);
    dp->::ccc::CC13x12y3::~CC13x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y3E(Test__ZN3ccc9CC13x12y3E, "_ZN3ccc9CC13x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y3C1Ev();
extern void _ZN3ccc9CC13x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y3E[] = {
  NSPAIR(_ZN3ccc9CC13x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y3E[];
extern void _ZN3ccc9CC13x12y33efgEv();
extern void _ZN3ccc9CC13x12y33pqrEv();
extern void _ZN3ccc9CC13x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y33abcEv,_ZThn4_N3ccc9CC13x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y33abcEv,_ZThn4_N3ccc9CC13x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y3E[];
Class_Descriptor cd__ZN3ccc9CC13x12y3E = {  "_ZN3ccc9CC13x12y3E", // class name
  bases__ZN3ccc9CC13x12y3E, 2,
  &(vtc__ZN3ccc9CC13x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y4  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC13x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x12y43efgEv
  ~CC13x12y4(); // tgen
  CC13x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y4E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y43pqrEv");}
void  ccc::CC13x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y43abcEv");}
void  ccc::CC13x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y43efgEv");}
ccc::CC13x12y4 ::~CC13x12y4(){ note_dtor("_ZN3ccc9CC13x12y4E", this);} // tgen
ccc::CC13x12y4 ::CC13x12y4(){ note_ctor("_ZN3ccc9CC13x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y4E, buf);
    ::ccc::CC13x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y4E);
    dp->::ccc::CC13x12y4::~CC13x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y4E(Test__ZN3ccc9CC13x12y4E, "_ZN3ccc9CC13x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y4C1Ev();
extern void _ZN3ccc9CC13x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y4E[] = {
  NSPAIR(_ZN3ccc9CC13x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y4E[];
extern void _ZN3ccc9CC13x12y43efgEv();
extern void _ZN3ccc9CC13x12y43pqrEv();
extern void _ZN3ccc9CC13x12y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y43abcEv,_ZThn4_N3ccc9CC13x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y43abcEv,_ZThn4_N3ccc9CC13x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y4E[];
Class_Descriptor cd__ZN3ccc9CC13x12y4E = {  "_ZN3ccc9CC13x12y4E", // class name
  bases__ZN3ccc9CC13x12y4E, 2,
  &(vtc__ZN3ccc9CC13x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y5  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC13x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x12y53abcEv
  ~CC13x12y5(); // tgen
  CC13x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y5E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y53pqrEv");}
void  ccc::CC13x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y53efgEv");}
void  ccc::CC13x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y53abcEv");}
ccc::CC13x12y5 ::~CC13x12y5(){ note_dtor("_ZN3ccc9CC13x12y5E", this);} // tgen
ccc::CC13x12y5 ::CC13x12y5(){ note_ctor("_ZN3ccc9CC13x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y5E, buf);
    ::ccc::CC13x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y5E);
    dp->::ccc::CC13x12y5::~CC13x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y5E(Test__ZN3ccc9CC13x12y5E, "_ZN3ccc9CC13x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y5C1Ev();
extern void _ZN3ccc9CC13x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y5E[] = {
  NSPAIR(_ZN3ccc9CC13x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y5E[];
extern void _ZN3ccc9CC13x12y53efgEv();
extern void _ZN3ccc9CC13x12y53pqrEv();
extern void _ZN3ccc9CC13x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y53abcEv,_ZThn4_N3ccc9CC13x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y53abcEv,_ZThn4_N3ccc9CC13x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y5E[];
Class_Descriptor cd__ZN3ccc9CC13x12y5E = {  "_ZN3ccc9CC13x12y5E", // class name
  bases__ZN3ccc9CC13x12y5E, 2,
  &(vtc__ZN3ccc9CC13x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y6  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC13x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x12y63efgEv
  ~CC13x12y6(); // tgen
  CC13x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y6E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y63abcEv");}
void  ccc::CC13x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y63efgEv");}
ccc::CC13x12y6 ::~CC13x12y6(){ note_dtor("_ZN3ccc9CC13x12y6E", this);} // tgen
ccc::CC13x12y6 ::CC13x12y6(){ note_ctor("_ZN3ccc9CC13x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y6E, buf);
    ::ccc::CC13x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y6E);
    dp->::ccc::CC13x12y6::~CC13x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y6E(Test__ZN3ccc9CC13x12y6E, "_ZN3ccc9CC13x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y6C1Ev();
extern void _ZN3ccc9CC13x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y6E[] = {
  NSPAIR(_ZN3ccc9CC13x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y6E[];
extern void _ZN3ccc9CC13x12y63efgEv();
extern void _ZN3ccc9CC13x12y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y63abcEv,_ZThn4_N3ccc9CC13x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y63abcEv,_ZThn4_N3ccc9CC13x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y6E[];
Class_Descriptor cd__ZN3ccc9CC13x12y6E = {  "_ZN3ccc9CC13x12y6E", // class name
  bases__ZN3ccc9CC13x12y6E, 2,
  &(vtc__ZN3ccc9CC13x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y7  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC13x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y73pqrEv
  ~CC13x12y7(); // tgen
  CC13x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y7E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y73abcEv");}
void  ccc::CC13x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y73pqrEv");}
ccc::CC13x12y7 ::~CC13x12y7(){ note_dtor("_ZN3ccc9CC13x12y7E", this);} // tgen
ccc::CC13x12y7 ::CC13x12y7(){ note_ctor("_ZN3ccc9CC13x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y7E, buf);
    ::ccc::CC13x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y7E);
    dp->::ccc::CC13x12y7::~CC13x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y7E(Test__ZN3ccc9CC13x12y7E, "_ZN3ccc9CC13x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y7C1Ev();
extern void _ZN3ccc9CC13x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y7E[] = {
  NSPAIR(_ZN3ccc9CC13x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x12y73abcEv();
extern void _ZN3ccc9CC13x12y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y73abcEv,_ZThn4_N3ccc9CC13x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y73abcEv,_ZThn4_N3ccc9CC13x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y7E[];
Class_Descriptor cd__ZN3ccc9CC13x12y7E = {  "_ZN3ccc9CC13x12y7E", // class name
  bases__ZN3ccc9CC13x12y7E, 2,
  &(vtc__ZN3ccc9CC13x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y8  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC13x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x12y83abcEv
  ~CC13x12y8(); // tgen
  CC13x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y8E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y83efgEv");}
void  ccc::CC13x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x12y83abcEv");}
ccc::CC13x12y8 ::~CC13x12y8(){ note_dtor("_ZN3ccc9CC13x12y8E", this);} // tgen
ccc::CC13x12y8 ::CC13x12y8(){ note_ctor("_ZN3ccc9CC13x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y8E, buf);
    ::ccc::CC13x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y8E);
    dp->::ccc::CC13x12y8::~CC13x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y8E(Test__ZN3ccc9CC13x12y8E, "_ZN3ccc9CC13x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y8C1Ev();
extern void _ZN3ccc9CC13x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y8E[] = {
  NSPAIR(_ZN3ccc9CC13x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y8E[];
extern void _ZN3ccc9CC13x12y83efgEv();
extern void _ZN3ccc9CC13x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x12y83abcEv,_ZThn4_N3ccc9CC13x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x12y83abcEv,_ZThn4_N3ccc9CC13x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y8E[];
Class_Descriptor cd__ZN3ccc9CC13x12y8E = {  "_ZN3ccc9CC13x12y8E", // class name
  bases__ZN3ccc9CC13x12y8E, 2,
  &(vtc__ZN3ccc9CC13x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y9  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC13x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x12y93pqrEv
  ~CC13x12y9(); // tgen
  CC13x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x12y9E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x12y93efgEv");}
void  ccc::CC13x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x12y93pqrEv");}
ccc::CC13x12y9 ::~CC13x12y9(){ note_dtor("_ZN3ccc9CC13x12y9E", this);} // tgen
ccc::CC13x12y9 ::CC13x12y9(){ note_ctor("_ZN3ccc9CC13x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x12y9E, buf);
    ::ccc::CC13x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x12y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC13x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x12y9E);
    dp->::ccc::CC13x12y9::~CC13x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x12y9E(Test__ZN3ccc9CC13x12y9E, "_ZN3ccc9CC13x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x12y9C1Ev();
extern void _ZN3ccc9CC13x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x12y9E[] = {
  NSPAIR(_ZN3ccc9CC13x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC13x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y9E[];
extern void _ZN3ccc9CC13x12y93efgEv();
extern void _ZN3ccc9CC13x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x12y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x12y9E[];
Class_Descriptor cd__ZN3ccc9CC13x12y9E = {  "_ZN3ccc9CC13x12y9E", // class name
  bases__ZN3ccc9CC13x12y9E, 2,
  &(vtc__ZN3ccc9CC13x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x12y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y10  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC13x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x12y103abcEv
  ~CC13x12y10(); // tgen
  CC13x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y10E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x12y103pqrEv");}
void  ccc::CC13x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x12y103abcEv");}
ccc::CC13x12y10 ::~CC13x12y10(){ note_dtor("_ZN3ccc10CC13x12y10E", this);} // tgen
ccc::CC13x12y10 ::CC13x12y10(){ note_ctor("_ZN3ccc10CC13x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y10E, buf);
    ::ccc::CC13x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y10E);
    dp->::ccc::CC13x12y10::~CC13x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y10E(Test__ZN3ccc10CC13x12y10E, "_ZN3ccc10CC13x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y10C1Ev();
extern void _ZN3ccc10CC13x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y10E[] = {
  NSPAIR(_ZN3ccc10CC13x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x12y103pqrEv();
extern void _ZN3ccc10CC13x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x12y103abcEv,_ZThn4_N3ccc10CC13x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x12y103abcEv,_ZThn4_N3ccc10CC13x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y10E[];
Class_Descriptor cd__ZN3ccc10CC13x12y10E = {  "_ZN3ccc10CC13x12y10E", // class name
  bases__ZN3ccc10CC13x12y10E, 2,
  &(vtc__ZN3ccc10CC13x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y11  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC13x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x12y113efgEv
  ~CC13x12y11(); // tgen
  CC13x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y11E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x12y113pqrEv");}
void  ccc::CC13x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x12y113efgEv");}
ccc::CC13x12y11 ::~CC13x12y11(){ note_dtor("_ZN3ccc10CC13x12y11E", this);} // tgen
ccc::CC13x12y11 ::CC13x12y11(){ note_ctor("_ZN3ccc10CC13x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y11E, buf);
    ::ccc::CC13x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y11E);
    dp->::ccc::CC13x12y11::~CC13x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y11E(Test__ZN3ccc10CC13x12y11E, "_ZN3ccc10CC13x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y11C1Ev();
extern void _ZN3ccc10CC13x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y11E[] = {
  NSPAIR(_ZN3ccc10CC13x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y11E[];
extern void _ZN3ccc10CC13x12y113efgEv();
extern void _ZN3ccc10CC13x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y11E[];
Class_Descriptor cd__ZN3ccc10CC13x12y11E = {  "_ZN3ccc10CC13x12y11E", // class name
  bases__ZN3ccc10CC13x12y11E, 2,
  &(vtc__ZN3ccc10CC13x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y12  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC13x12y123abcEv
  ~CC13x12y12(); // tgen
  CC13x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y12E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC13x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x12y123abcEv");}
ccc::CC13x12y12 ::~CC13x12y12(){ note_dtor("_ZN3ccc10CC13x12y12E", this);} // tgen
ccc::CC13x12y12 ::CC13x12y12(){ note_ctor("_ZN3ccc10CC13x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y12E, buf);
    ::ccc::CC13x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y12E);
    dp->::ccc::CC13x12y12::~CC13x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y12E(Test__ZN3ccc10CC13x12y12E, "_ZN3ccc10CC13x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y12C1Ev();
extern void _ZN3ccc10CC13x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y12E[] = {
  NSPAIR(_ZN3ccc10CC13x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x12y123abcEv,_ZThn4_N3ccc10CC13x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x12y123abcEv,_ZThn4_N3ccc10CC13x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y12E[];
Class_Descriptor cd__ZN3ccc10CC13x12y12E = {  "_ZN3ccc10CC13x12y12E", // class name
  bases__ZN3ccc10CC13x12y12E, 2,
  &(vtc__ZN3ccc10CC13x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y13  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC13x12y133efgEv
  ~CC13x12y13(); // tgen
  CC13x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y13E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC13x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x12y133efgEv");}
ccc::CC13x12y13 ::~CC13x12y13(){ note_dtor("_ZN3ccc10CC13x12y13E", this);} // tgen
ccc::CC13x12y13 ::CC13x12y13(){ note_ctor("_ZN3ccc10CC13x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y13E, buf);
    ::ccc::CC13x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y13E);
    dp->::ccc::CC13x12y13::~CC13x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y13E(Test__ZN3ccc10CC13x12y13E, "_ZN3ccc10CC13x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y13C1Ev();
extern void _ZN3ccc10CC13x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y13E[] = {
  NSPAIR(_ZN3ccc10CC13x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y13E[];
extern void _ZN3ccc10CC13x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y13E[];
Class_Descriptor cd__ZN3ccc10CC13x12y13E = {  "_ZN3ccc10CC13x12y13E", // class name
  bases__ZN3ccc10CC13x12y13E, 2,
  &(vtc__ZN3ccc10CC13x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y13E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y14  : ::ccc::AA13 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC13x12y143pqrEv
  ~CC13x12y14(); // tgen
  CC13x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y14E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC13x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x12y143pqrEv");}
ccc::CC13x12y14 ::~CC13x12y14(){ note_dtor("_ZN3ccc10CC13x12y14E", this);} // tgen
ccc::CC13x12y14 ::CC13x12y14(){ note_ctor("_ZN3ccc10CC13x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y14E, buf);
    ::ccc::CC13x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y14E);
    dp->::ccc::CC13x12y14::~CC13x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y14E(Test__ZN3ccc10CC13x12y14E, "_ZN3ccc10CC13x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y14C1Ev();
extern void _ZN3ccc10CC13x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y14E[] = {
  NSPAIR(_ZN3ccc10CC13x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y14E[];
Class_Descriptor cd__ZN3ccc10CC13x12y14E = {  "_ZN3ccc10CC13x12y14E", // class name
  bases__ZN3ccc10CC13x12y14E, 2,
  &(vtc__ZN3ccc10CC13x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x12y15  : ::ccc::AA13 , ::ccc::BB12 {
  ~CC13x12y15(); // tgen
  CC13x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x12y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC13x12y15 ::~CC13x12y15(){ note_dtor("_ZN3ccc10CC13x12y15E", this);} // tgen
ccc::CC13x12y15 ::CC13x12y15(){ note_ctor("_ZN3ccc10CC13x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x12y15E, buf);
    ::ccc::CC13x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x12y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC13x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x12y15E);
    dp->::ccc::CC13x12y15::~CC13x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x12y15E(Test__ZN3ccc10CC13x12y15E, "_ZN3ccc10CC13x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x12y15C1Ev();
extern void _ZN3ccc10CC13x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x12y15E[] = {
  NSPAIR(_ZN3ccc10CC13x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC13x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x12y15E[];
Class_Descriptor cd__ZN3ccc10CC13x12y15E = {  "_ZN3ccc10CC13x12y15E", // class name
  bases__ZN3ccc10CC13x12y15E, 2,
  &(vtc__ZN3ccc10CC13x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x12y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y0  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC13x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y03pqrEv
  ~CC13x13y0(); // tgen
  CC13x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y0E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y03abcEv");}
void  ccc::CC13x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y03efgEv");}
void  ccc::CC13x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y03pqrEv");}
ccc::CC13x13y0 ::~CC13x13y0(){ note_dtor("_ZN3ccc9CC13x13y0E", this);} // tgen
ccc::CC13x13y0 ::CC13x13y0(){ note_ctor("_ZN3ccc9CC13x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y0E, buf);
    ::ccc::CC13x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y0E);
    dp->::ccc::CC13x13y0::~CC13x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y0E(Test__ZN3ccc9CC13x13y0E, "_ZN3ccc9CC13x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y0C1Ev();
extern void _ZN3ccc9CC13x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y0E[] = {
  NSPAIR(_ZN3ccc9CC13x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y0E[];
extern void _ZN3ccc9CC13x13y03efgEv();
extern void _ZN3ccc9CC13x13y03abcEv();
extern void _ZN3ccc9CC13x13y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y03efgEv,_ZThn4_N3ccc9CC13x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y03efgEv,_ZThn4_N3ccc9CC13x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y0E[];
Class_Descriptor cd__ZN3ccc9CC13x13y0E = {  "_ZN3ccc9CC13x13y0E", // class name
  bases__ZN3ccc9CC13x13y0E, 2,
  &(vtc__ZN3ccc9CC13x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y1  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC13x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x13y13efgEv
  ~CC13x13y1(); // tgen
  CC13x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y1E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y13abcEv");}
void  ccc::CC13x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y13pqrEv");}
void  ccc::CC13x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y13efgEv");}
ccc::CC13x13y1 ::~CC13x13y1(){ note_dtor("_ZN3ccc9CC13x13y1E", this);} // tgen
ccc::CC13x13y1 ::CC13x13y1(){ note_ctor("_ZN3ccc9CC13x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y1E, buf);
    ::ccc::CC13x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y1E);
    dp->::ccc::CC13x13y1::~CC13x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y1E(Test__ZN3ccc9CC13x13y1E, "_ZN3ccc9CC13x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y1C1Ev();
extern void _ZN3ccc9CC13x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y1E[] = {
  NSPAIR(_ZN3ccc9CC13x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y1E[];
extern void _ZN3ccc9CC13x13y13efgEv();
extern void _ZN3ccc9CC13x13y13abcEv();
extern void _ZN3ccc9CC13x13y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y13efgEv,_ZThn4_N3ccc9CC13x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y13efgEv,_ZThn4_N3ccc9CC13x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y1E[];
Class_Descriptor cd__ZN3ccc9CC13x13y1E = {  "_ZN3ccc9CC13x13y1E", // class name
  bases__ZN3ccc9CC13x13y1E, 2,
  &(vtc__ZN3ccc9CC13x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y2  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC13x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y23pqrEv
  ~CC13x13y2(); // tgen
  CC13x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y2E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y23efgEv");}
void  ccc::CC13x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y23abcEv");}
void  ccc::CC13x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y23pqrEv");}
ccc::CC13x13y2 ::~CC13x13y2(){ note_dtor("_ZN3ccc9CC13x13y2E", this);} // tgen
ccc::CC13x13y2 ::CC13x13y2(){ note_ctor("_ZN3ccc9CC13x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y2E, buf);
    ::ccc::CC13x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y2E);
    dp->::ccc::CC13x13y2::~CC13x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y2E(Test__ZN3ccc9CC13x13y2E, "_ZN3ccc9CC13x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y2C1Ev();
extern void _ZN3ccc9CC13x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y2E[] = {
  NSPAIR(_ZN3ccc9CC13x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y2E[];
extern void _ZN3ccc9CC13x13y23efgEv();
extern void _ZN3ccc9CC13x13y23abcEv();
extern void _ZN3ccc9CC13x13y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y23efgEv,_ZThn4_N3ccc9CC13x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y23efgEv,_ZThn4_N3ccc9CC13x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y2E[];
Class_Descriptor cd__ZN3ccc9CC13x13y2E = {  "_ZN3ccc9CC13x13y2E", // class name
  bases__ZN3ccc9CC13x13y2E, 2,
  &(vtc__ZN3ccc9CC13x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y3  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC13x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x13y33abcEv
  ~CC13x13y3(); // tgen
  CC13x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y3E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y33efgEv");}
void  ccc::CC13x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y33pqrEv");}
void  ccc::CC13x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y33abcEv");}
ccc::CC13x13y3 ::~CC13x13y3(){ note_dtor("_ZN3ccc9CC13x13y3E", this);} // tgen
ccc::CC13x13y3 ::CC13x13y3(){ note_ctor("_ZN3ccc9CC13x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y3E, buf);
    ::ccc::CC13x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y3E);
    dp->::ccc::CC13x13y3::~CC13x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y3E(Test__ZN3ccc9CC13x13y3E, "_ZN3ccc9CC13x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y3C1Ev();
extern void _ZN3ccc9CC13x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y3E[] = {
  NSPAIR(_ZN3ccc9CC13x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y3E[];
extern void _ZN3ccc9CC13x13y33efgEv();
extern void _ZN3ccc9CC13x13y33pqrEv();
extern void _ZN3ccc9CC13x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y33efgEv,_ZThn4_N3ccc9CC13x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y33efgEv,_ZThn4_N3ccc9CC13x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y3E[];
Class_Descriptor cd__ZN3ccc9CC13x13y3E = {  "_ZN3ccc9CC13x13y3E", // class name
  bases__ZN3ccc9CC13x13y3E, 2,
  &(vtc__ZN3ccc9CC13x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y4  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC13x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x13y43efgEv
  ~CC13x13y4(); // tgen
  CC13x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y4E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y43pqrEv");}
void  ccc::CC13x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y43abcEv");}
void  ccc::CC13x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y43efgEv");}
ccc::CC13x13y4 ::~CC13x13y4(){ note_dtor("_ZN3ccc9CC13x13y4E", this);} // tgen
ccc::CC13x13y4 ::CC13x13y4(){ note_ctor("_ZN3ccc9CC13x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y4E, buf);
    ::ccc::CC13x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y4E);
    dp->::ccc::CC13x13y4::~CC13x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y4E(Test__ZN3ccc9CC13x13y4E, "_ZN3ccc9CC13x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y4C1Ev();
extern void _ZN3ccc9CC13x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y4E[] = {
  NSPAIR(_ZN3ccc9CC13x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y4E[];
extern void _ZN3ccc9CC13x13y43efgEv();
extern void _ZN3ccc9CC13x13y43pqrEv();
extern void _ZN3ccc9CC13x13y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y43efgEv,_ZThn4_N3ccc9CC13x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y43efgEv,_ZThn4_N3ccc9CC13x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y4E[];
Class_Descriptor cd__ZN3ccc9CC13x13y4E = {  "_ZN3ccc9CC13x13y4E", // class name
  bases__ZN3ccc9CC13x13y4E, 2,
  &(vtc__ZN3ccc9CC13x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y5  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC13x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x13y53abcEv
  ~CC13x13y5(); // tgen
  CC13x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y5E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y53pqrEv");}
void  ccc::CC13x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y53efgEv");}
void  ccc::CC13x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y53abcEv");}
ccc::CC13x13y5 ::~CC13x13y5(){ note_dtor("_ZN3ccc9CC13x13y5E", this);} // tgen
ccc::CC13x13y5 ::CC13x13y5(){ note_ctor("_ZN3ccc9CC13x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y5E, buf);
    ::ccc::CC13x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y5E);
    dp->::ccc::CC13x13y5::~CC13x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y5E(Test__ZN3ccc9CC13x13y5E, "_ZN3ccc9CC13x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y5C1Ev();
extern void _ZN3ccc9CC13x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y5E[] = {
  NSPAIR(_ZN3ccc9CC13x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y5E[];
extern void _ZN3ccc9CC13x13y53efgEv();
extern void _ZN3ccc9CC13x13y53pqrEv();
extern void _ZN3ccc9CC13x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y53efgEv,_ZThn4_N3ccc9CC13x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y53efgEv,_ZThn4_N3ccc9CC13x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y5E[];
Class_Descriptor cd__ZN3ccc9CC13x13y5E = {  "_ZN3ccc9CC13x13y5E", // class name
  bases__ZN3ccc9CC13x13y5E, 2,
  &(vtc__ZN3ccc9CC13x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y6  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC13x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x13y63efgEv
  ~CC13x13y6(); // tgen
  CC13x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y6E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y63abcEv");}
void  ccc::CC13x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y63efgEv");}
ccc::CC13x13y6 ::~CC13x13y6(){ note_dtor("_ZN3ccc9CC13x13y6E", this);} // tgen
ccc::CC13x13y6 ::CC13x13y6(){ note_ctor("_ZN3ccc9CC13x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y6E, buf);
    ::ccc::CC13x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y6E);
    dp->::ccc::CC13x13y6::~CC13x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y6E(Test__ZN3ccc9CC13x13y6E, "_ZN3ccc9CC13x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y6C1Ev();
extern void _ZN3ccc9CC13x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y6E[] = {
  NSPAIR(_ZN3ccc9CC13x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y6E[];
extern void _ZN3ccc9CC13x13y63efgEv();
extern void _ZN3ccc9CC13x13y63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y63efgEv,_ZThn4_N3ccc9CC13x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y63efgEv,_ZThn4_N3ccc9CC13x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y6E[];
Class_Descriptor cd__ZN3ccc9CC13x13y6E = {  "_ZN3ccc9CC13x13y6E", // class name
  bases__ZN3ccc9CC13x13y6E, 2,
  &(vtc__ZN3ccc9CC13x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y7  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC13x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y73pqrEv
  ~CC13x13y7(); // tgen
  CC13x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y7E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y73abcEv");}
void  ccc::CC13x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y73pqrEv");}
ccc::CC13x13y7 ::~CC13x13y7(){ note_dtor("_ZN3ccc9CC13x13y7E", this);} // tgen
ccc::CC13x13y7 ::CC13x13y7(){ note_ctor("_ZN3ccc9CC13x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y7E, buf);
    ::ccc::CC13x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y7E);
    dp->::ccc::CC13x13y7::~CC13x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y7E(Test__ZN3ccc9CC13x13y7E, "_ZN3ccc9CC13x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y7C1Ev();
extern void _ZN3ccc9CC13x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y7E[] = {
  NSPAIR(_ZN3ccc9CC13x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x13y73abcEv();
extern void _ZN3ccc9CC13x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y7E[];
Class_Descriptor cd__ZN3ccc9CC13x13y7E = {  "_ZN3ccc9CC13x13y7E", // class name
  bases__ZN3ccc9CC13x13y7E, 2,
  &(vtc__ZN3ccc9CC13x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y8  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC13x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x13y83abcEv
  ~CC13x13y8(); // tgen
  CC13x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y8E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y83efgEv");}
void  ccc::CC13x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x13y83abcEv");}
ccc::CC13x13y8 ::~CC13x13y8(){ note_dtor("_ZN3ccc9CC13x13y8E", this);} // tgen
ccc::CC13x13y8 ::CC13x13y8(){ note_ctor("_ZN3ccc9CC13x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y8E, buf);
    ::ccc::CC13x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y8E);
    dp->::ccc::CC13x13y8::~CC13x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y8E(Test__ZN3ccc9CC13x13y8E, "_ZN3ccc9CC13x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y8C1Ev();
extern void _ZN3ccc9CC13x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y8E[] = {
  NSPAIR(_ZN3ccc9CC13x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y8E[];
extern void _ZN3ccc9CC13x13y83efgEv();
extern void _ZN3ccc9CC13x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y83efgEv,_ZThn4_N3ccc9CC13x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y83efgEv,_ZThn4_N3ccc9CC13x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y8E[];
Class_Descriptor cd__ZN3ccc9CC13x13y8E = {  "_ZN3ccc9CC13x13y8E", // class name
  bases__ZN3ccc9CC13x13y8E, 2,
  &(vtc__ZN3ccc9CC13x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y9  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC13x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x13y93pqrEv
  ~CC13x13y9(); // tgen
  CC13x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x13y9E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x13y93efgEv");}
void  ccc::CC13x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x13y93pqrEv");}
ccc::CC13x13y9 ::~CC13x13y9(){ note_dtor("_ZN3ccc9CC13x13y9E", this);} // tgen
ccc::CC13x13y9 ::CC13x13y9(){ note_ctor("_ZN3ccc9CC13x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x13y9E, buf);
    ::ccc::CC13x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x13y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC13x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x13y9E);
    dp->::ccc::CC13x13y9::~CC13x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x13y9E(Test__ZN3ccc9CC13x13y9E, "_ZN3ccc9CC13x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x13y9C1Ev();
extern void _ZN3ccc9CC13x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x13y9E[] = {
  NSPAIR(_ZN3ccc9CC13x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC13x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y9E[];
extern void _ZN3ccc9CC13x13y93efgEv();
extern void _ZN3ccc9CC13x13y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x13y93efgEv,_ZThn4_N3ccc9CC13x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x13y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x13y93efgEv,_ZThn4_N3ccc9CC13x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x13y9E[];
Class_Descriptor cd__ZN3ccc9CC13x13y9E = {  "_ZN3ccc9CC13x13y9E", // class name
  bases__ZN3ccc9CC13x13y9E, 2,
  &(vtc__ZN3ccc9CC13x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x13y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y10  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC13x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x13y103abcEv
  ~CC13x13y10(); // tgen
  CC13x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y10E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x13y103pqrEv");}
void  ccc::CC13x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x13y103abcEv");}
ccc::CC13x13y10 ::~CC13x13y10(){ note_dtor("_ZN3ccc10CC13x13y10E", this);} // tgen
ccc::CC13x13y10 ::CC13x13y10(){ note_ctor("_ZN3ccc10CC13x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y10E, buf);
    ::ccc::CC13x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y10E);
    dp->::ccc::CC13x13y10::~CC13x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y10E(Test__ZN3ccc10CC13x13y10E, "_ZN3ccc10CC13x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y10C1Ev();
extern void _ZN3ccc10CC13x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y10E[] = {
  NSPAIR(_ZN3ccc10CC13x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x13y103pqrEv();
extern void _ZN3ccc10CC13x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y10E[];
Class_Descriptor cd__ZN3ccc10CC13x13y10E = {  "_ZN3ccc10CC13x13y10E", // class name
  bases__ZN3ccc10CC13x13y10E, 2,
  &(vtc__ZN3ccc10CC13x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y11  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC13x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x13y113efgEv
  ~CC13x13y11(); // tgen
  CC13x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y11E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x13y113pqrEv");}
void  ccc::CC13x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x13y113efgEv");}
ccc::CC13x13y11 ::~CC13x13y11(){ note_dtor("_ZN3ccc10CC13x13y11E", this);} // tgen
ccc::CC13x13y11 ::CC13x13y11(){ note_ctor("_ZN3ccc10CC13x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y11E, buf);
    ::ccc::CC13x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y11E);
    dp->::ccc::CC13x13y11::~CC13x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y11E(Test__ZN3ccc10CC13x13y11E, "_ZN3ccc10CC13x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y11C1Ev();
extern void _ZN3ccc10CC13x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y11E[] = {
  NSPAIR(_ZN3ccc10CC13x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y11E[];
extern void _ZN3ccc10CC13x13y113efgEv();
extern void _ZN3ccc10CC13x13y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x13y113efgEv,_ZThn4_N3ccc10CC13x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x13y113efgEv,_ZThn4_N3ccc10CC13x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y11E[];
Class_Descriptor cd__ZN3ccc10CC13x13y11E = {  "_ZN3ccc10CC13x13y11E", // class name
  bases__ZN3ccc10CC13x13y11E, 2,
  &(vtc__ZN3ccc10CC13x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y12  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC13x13y123abcEv
  ~CC13x13y12(); // tgen
  CC13x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y12E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC13x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x13y123abcEv");}
ccc::CC13x13y12 ::~CC13x13y12(){ note_dtor("_ZN3ccc10CC13x13y12E", this);} // tgen
ccc::CC13x13y12 ::CC13x13y12(){ note_ctor("_ZN3ccc10CC13x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y12E, buf);
    ::ccc::CC13x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y12E);
    dp->::ccc::CC13x13y12::~CC13x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y12E(Test__ZN3ccc10CC13x13y12E, "_ZN3ccc10CC13x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y12C1Ev();
extern void _ZN3ccc10CC13x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y12E[] = {
  NSPAIR(_ZN3ccc10CC13x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y12E[];
Class_Descriptor cd__ZN3ccc10CC13x13y12E = {  "_ZN3ccc10CC13x13y12E", // class name
  bases__ZN3ccc10CC13x13y12E, 2,
  &(vtc__ZN3ccc10CC13x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y13  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC13x13y133efgEv
  ~CC13x13y13(); // tgen
  CC13x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y13E) C1{ BC2{ v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC13x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x13y133efgEv");}
ccc::CC13x13y13 ::~CC13x13y13(){ note_dtor("_ZN3ccc10CC13x13y13E", this);} // tgen
ccc::CC13x13y13 ::CC13x13y13(){ note_ctor("_ZN3ccc10CC13x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y13E, buf);
    ::ccc::CC13x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y13E);
    dp->::ccc::CC13x13y13::~CC13x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y13E(Test__ZN3ccc10CC13x13y13E, "_ZN3ccc10CC13x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y13C1Ev();
extern void _ZN3ccc10CC13x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y13E[] = {
  NSPAIR(_ZN3ccc10CC13x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y13E[];
extern void _ZN3ccc10CC13x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x13y133efgEv,_ZThn4_N3ccc10CC13x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x13y133efgEv,_ZThn4_N3ccc10CC13x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y13E[];
Class_Descriptor cd__ZN3ccc10CC13x13y13E = {  "_ZN3ccc10CC13x13y13E", // class name
  bases__ZN3ccc10CC13x13y13E, 2,
  &(vtc__ZN3ccc10CC13x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y13E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y14  : ::ccc::AA13 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC13x13y143pqrEv
  ~CC13x13y14(); // tgen
  CC13x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y14E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC13x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x13y143pqrEv");}
ccc::CC13x13y14 ::~CC13x13y14(){ note_dtor("_ZN3ccc10CC13x13y14E", this);} // tgen
ccc::CC13x13y14 ::CC13x13y14(){ note_ctor("_ZN3ccc10CC13x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y14E, buf);
    ::ccc::CC13x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y14E);
    dp->::ccc::CC13x13y14::~CC13x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y14E(Test__ZN3ccc10CC13x13y14E, "_ZN3ccc10CC13x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y14C1Ev();
extern void _ZN3ccc10CC13x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y14E[] = {
  NSPAIR(_ZN3ccc10CC13x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y14E[];
Class_Descriptor cd__ZN3ccc10CC13x13y14E = {  "_ZN3ccc10CC13x13y14E", // class name
  bases__ZN3ccc10CC13x13y14E, 2,
  &(vtc__ZN3ccc10CC13x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x13y15  : ::ccc::AA13 , ::ccc::BB13 {
  ~CC13x13y15(); // tgen
  CC13x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x13y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC13x13y15 ::~CC13x13y15(){ note_dtor("_ZN3ccc10CC13x13y15E", this);} // tgen
ccc::CC13x13y15 ::CC13x13y15(){ note_ctor("_ZN3ccc10CC13x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x13y15E, buf);
    ::ccc::CC13x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x13y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC13x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x13y15E);
    dp->::ccc::CC13x13y15::~CC13x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x13y15E(Test__ZN3ccc10CC13x13y15E, "_ZN3ccc10CC13x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x13y15C1Ev();
extern void _ZN3ccc10CC13x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x13y15E[] = {
  NSPAIR(_ZN3ccc10CC13x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC13x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x13y15E[];
Class_Descriptor cd__ZN3ccc10CC13x13y15E = {  "_ZN3ccc10CC13x13y15E", // class name
  bases__ZN3ccc10CC13x13y15E, 2,
  &(vtc__ZN3ccc10CC13x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x13y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y0  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC13x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y03pqrEv
  ~CC13x14y0(); // tgen
  CC13x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y0E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y03abcEv");}
void  ccc::CC13x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y03efgEv");}
void  ccc::CC13x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y03pqrEv");}
ccc::CC13x14y0 ::~CC13x14y0(){ note_dtor("_ZN3ccc9CC13x14y0E", this);} // tgen
ccc::CC13x14y0 ::CC13x14y0(){ note_ctor("_ZN3ccc9CC13x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y0E, buf);
    ::ccc::CC13x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y0E);
    dp->::ccc::CC13x14y0::~CC13x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y0E(Test__ZN3ccc9CC13x14y0E, "_ZN3ccc9CC13x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y0C1Ev();
extern void _ZN3ccc9CC13x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y0E[] = {
  NSPAIR(_ZN3ccc9CC13x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y0E[];
extern void _ZN3ccc9CC13x14y03efgEv();
extern void _ZN3ccc9CC13x14y03abcEv();
extern void _ZN3ccc9CC13x14y03pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y03pqrEv,_ZThn4_N3ccc9CC13x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y03pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y03pqrEv,_ZThn4_N3ccc9CC13x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y0E[];
Class_Descriptor cd__ZN3ccc9CC13x14y0E = {  "_ZN3ccc9CC13x14y0E", // class name
  bases__ZN3ccc9CC13x14y0E, 2,
  &(vtc__ZN3ccc9CC13x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y1  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC13x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x14y13efgEv
  ~CC13x14y1(); // tgen
  CC13x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y1E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y13abcEv");}
void  ccc::CC13x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y13pqrEv");}
void  ccc::CC13x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y13efgEv");}
ccc::CC13x14y1 ::~CC13x14y1(){ note_dtor("_ZN3ccc9CC13x14y1E", this);} // tgen
ccc::CC13x14y1 ::CC13x14y1(){ note_ctor("_ZN3ccc9CC13x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y1E, buf);
    ::ccc::CC13x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y1E);
    dp->::ccc::CC13x14y1::~CC13x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y1E(Test__ZN3ccc9CC13x14y1E, "_ZN3ccc9CC13x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y1C1Ev();
extern void _ZN3ccc9CC13x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y1E[] = {
  NSPAIR(_ZN3ccc9CC13x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y1E[];
extern void _ZN3ccc9CC13x14y13efgEv();
extern void _ZN3ccc9CC13x14y13abcEv();
extern void _ZN3ccc9CC13x14y13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y13pqrEv,_ZThn4_N3ccc9CC13x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y13pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y13pqrEv,_ZThn4_N3ccc9CC13x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y1E[];
Class_Descriptor cd__ZN3ccc9CC13x14y1E = {  "_ZN3ccc9CC13x14y1E", // class name
  bases__ZN3ccc9CC13x14y1E, 2,
  &(vtc__ZN3ccc9CC13x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y2  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC13x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y23pqrEv
  ~CC13x14y2(); // tgen
  CC13x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y2E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y23efgEv");}
void  ccc::CC13x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y23abcEv");}
void  ccc::CC13x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y23pqrEv");}
ccc::CC13x14y2 ::~CC13x14y2(){ note_dtor("_ZN3ccc9CC13x14y2E", this);} // tgen
ccc::CC13x14y2 ::CC13x14y2(){ note_ctor("_ZN3ccc9CC13x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y2E, buf);
    ::ccc::CC13x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y2E);
    dp->::ccc::CC13x14y2::~CC13x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y2E(Test__ZN3ccc9CC13x14y2E, "_ZN3ccc9CC13x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y2C1Ev();
extern void _ZN3ccc9CC13x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y2E[] = {
  NSPAIR(_ZN3ccc9CC13x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y2E[];
extern void _ZN3ccc9CC13x14y23efgEv();
extern void _ZN3ccc9CC13x14y23abcEv();
extern void _ZN3ccc9CC13x14y23pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y23pqrEv,_ZThn4_N3ccc9CC13x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y23pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y23pqrEv,_ZThn4_N3ccc9CC13x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y2E[];
Class_Descriptor cd__ZN3ccc9CC13x14y2E = {  "_ZN3ccc9CC13x14y2E", // class name
  bases__ZN3ccc9CC13x14y2E, 2,
  &(vtc__ZN3ccc9CC13x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y3  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC13x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x14y33abcEv
  ~CC13x14y3(); // tgen
  CC13x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y3E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y33efgEv");}
void  ccc::CC13x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y33pqrEv");}
void  ccc::CC13x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y33abcEv");}
ccc::CC13x14y3 ::~CC13x14y3(){ note_dtor("_ZN3ccc9CC13x14y3E", this);} // tgen
ccc::CC13x14y3 ::CC13x14y3(){ note_ctor("_ZN3ccc9CC13x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y3E, buf);
    ::ccc::CC13x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y3E);
    dp->::ccc::CC13x14y3::~CC13x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y3E(Test__ZN3ccc9CC13x14y3E, "_ZN3ccc9CC13x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y3C1Ev();
extern void _ZN3ccc9CC13x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y3E[] = {
  NSPAIR(_ZN3ccc9CC13x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y3E[];
extern void _ZN3ccc9CC13x14y33efgEv();
extern void _ZN3ccc9CC13x14y33pqrEv();
extern void _ZN3ccc9CC13x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y33pqrEv,_ZThn4_N3ccc9CC13x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y33pqrEv,_ZThn4_N3ccc9CC13x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y3E[];
Class_Descriptor cd__ZN3ccc9CC13x14y3E = {  "_ZN3ccc9CC13x14y3E", // class name
  bases__ZN3ccc9CC13x14y3E, 2,
  &(vtc__ZN3ccc9CC13x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y4  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC13x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x14y43efgEv
  ~CC13x14y4(); // tgen
  CC13x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y4E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y43pqrEv");}
void  ccc::CC13x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y43abcEv");}
void  ccc::CC13x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y43efgEv");}
ccc::CC13x14y4 ::~CC13x14y4(){ note_dtor("_ZN3ccc9CC13x14y4E", this);} // tgen
ccc::CC13x14y4 ::CC13x14y4(){ note_ctor("_ZN3ccc9CC13x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y4E, buf);
    ::ccc::CC13x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y4E);
    dp->::ccc::CC13x14y4::~CC13x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y4E(Test__ZN3ccc9CC13x14y4E, "_ZN3ccc9CC13x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y4C1Ev();
extern void _ZN3ccc9CC13x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y4E[] = {
  NSPAIR(_ZN3ccc9CC13x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y4E[];
extern void _ZN3ccc9CC13x14y43efgEv();
extern void _ZN3ccc9CC13x14y43pqrEv();
extern void _ZN3ccc9CC13x14y43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y43pqrEv,_ZThn4_N3ccc9CC13x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y43abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y43pqrEv,_ZThn4_N3ccc9CC13x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y4E[];
Class_Descriptor cd__ZN3ccc9CC13x14y4E = {  "_ZN3ccc9CC13x14y4E", // class name
  bases__ZN3ccc9CC13x14y4E, 2,
  &(vtc__ZN3ccc9CC13x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y5  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC13x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x14y53abcEv
  ~CC13x14y5(); // tgen
  CC13x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y5E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y53pqrEv");}
void  ccc::CC13x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y53efgEv");}
void  ccc::CC13x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y53abcEv");}
ccc::CC13x14y5 ::~CC13x14y5(){ note_dtor("_ZN3ccc9CC13x14y5E", this);} // tgen
ccc::CC13x14y5 ::CC13x14y5(){ note_ctor("_ZN3ccc9CC13x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y5E, buf);
    ::ccc::CC13x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y5E);
    dp->::ccc::CC13x14y5::~CC13x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y5E(Test__ZN3ccc9CC13x14y5E, "_ZN3ccc9CC13x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y5C1Ev();
extern void _ZN3ccc9CC13x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y5E[] = {
  NSPAIR(_ZN3ccc9CC13x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y5E[];
extern void _ZN3ccc9CC13x14y53efgEv();
extern void _ZN3ccc9CC13x14y53pqrEv();
extern void _ZN3ccc9CC13x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y53pqrEv,_ZThn4_N3ccc9CC13x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y53pqrEv,_ZThn4_N3ccc9CC13x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y5E[];
Class_Descriptor cd__ZN3ccc9CC13x14y5E = {  "_ZN3ccc9CC13x14y5E", // class name
  bases__ZN3ccc9CC13x14y5E, 2,
  &(vtc__ZN3ccc9CC13x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y6  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC13x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x14y63efgEv
  ~CC13x14y6(); // tgen
  CC13x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y6E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y63abcEv");}
void  ccc::CC13x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y63efgEv");}
ccc::CC13x14y6 ::~CC13x14y6(){ note_dtor("_ZN3ccc9CC13x14y6E", this);} // tgen
ccc::CC13x14y6 ::CC13x14y6(){ note_ctor("_ZN3ccc9CC13x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y6E, buf);
    ::ccc::CC13x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y6E);
    dp->::ccc::CC13x14y6::~CC13x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y6E(Test__ZN3ccc9CC13x14y6E, "_ZN3ccc9CC13x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y6C1Ev();
extern void _ZN3ccc9CC13x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y6E[] = {
  NSPAIR(_ZN3ccc9CC13x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y6E[];
extern void _ZN3ccc9CC13x14y63efgEv();
extern void _ZN3ccc9CC13x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y63abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y6E[];
Class_Descriptor cd__ZN3ccc9CC13x14y6E = {  "_ZN3ccc9CC13x14y6E", // class name
  bases__ZN3ccc9CC13x14y6E, 2,
  &(vtc__ZN3ccc9CC13x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y6E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y7  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC13x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y73pqrEv
  ~CC13x14y7(); // tgen
  CC13x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y7E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y73abcEv");}
void  ccc::CC13x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y73pqrEv");}
ccc::CC13x14y7 ::~CC13x14y7(){ note_dtor("_ZN3ccc9CC13x14y7E", this);} // tgen
ccc::CC13x14y7 ::CC13x14y7(){ note_ctor("_ZN3ccc9CC13x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y7E, buf);
    ::ccc::CC13x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y7E);
    dp->::ccc::CC13x14y7::~CC13x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y7E(Test__ZN3ccc9CC13x14y7E, "_ZN3ccc9CC13x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y7C1Ev();
extern void _ZN3ccc9CC13x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y7E[] = {
  NSPAIR(_ZN3ccc9CC13x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x14y73abcEv();
extern void _ZN3ccc9CC13x14y73pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y73pqrEv,_ZThn4_N3ccc9CC13x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y73pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y73pqrEv,_ZThn4_N3ccc9CC13x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y7E[];
Class_Descriptor cd__ZN3ccc9CC13x14y7E = {  "_ZN3ccc9CC13x14y7E", // class name
  bases__ZN3ccc9CC13x14y7E, 2,
  &(vtc__ZN3ccc9CC13x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y8  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC13x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x14y83abcEv
  ~CC13x14y8(); // tgen
  CC13x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y8E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y83efgEv");}
void  ccc::CC13x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x14y83abcEv");}
ccc::CC13x14y8 ::~CC13x14y8(){ note_dtor("_ZN3ccc9CC13x14y8E", this);} // tgen
ccc::CC13x14y8 ::CC13x14y8(){ note_ctor("_ZN3ccc9CC13x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y8E, buf);
    ::ccc::CC13x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y8E);
    dp->::ccc::CC13x14y8::~CC13x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y8E(Test__ZN3ccc9CC13x14y8E, "_ZN3ccc9CC13x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y8C1Ev();
extern void _ZN3ccc9CC13x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y8E[] = {
  NSPAIR(_ZN3ccc9CC13x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y8E[];
extern void _ZN3ccc9CC13x14y83efgEv();
extern void _ZN3ccc9CC13x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y8E[];
Class_Descriptor cd__ZN3ccc9CC13x14y8E = {  "_ZN3ccc9CC13x14y8E", // class name
  bases__ZN3ccc9CC13x14y8E, 2,
  &(vtc__ZN3ccc9CC13x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y8E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y9  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC13x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x14y93pqrEv
  ~CC13x14y9(); // tgen
  CC13x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x14y9E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x14y93efgEv");}
void  ccc::CC13x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x14y93pqrEv");}
ccc::CC13x14y9 ::~CC13x14y9(){ note_dtor("_ZN3ccc9CC13x14y9E", this);} // tgen
ccc::CC13x14y9 ::CC13x14y9(){ note_ctor("_ZN3ccc9CC13x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC13x14y9E, buf);
    ::ccc::CC13x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC13x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x14y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC13x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x14y9E);
    dp->::ccc::CC13x14y9::~CC13x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x14y9E(Test__ZN3ccc9CC13x14y9E, "_ZN3ccc9CC13x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC13x14y9C1Ev();
extern void _ZN3ccc9CC13x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x14y9E[] = {
  NSPAIR(_ZN3ccc9CC13x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC13x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y9E[];
extern void _ZN3ccc9CC13x14y93efgEv();
extern void _ZN3ccc9CC13x14y93pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC13x14y93pqrEv,_ZThn4_N3ccc9CC13x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x14y93pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC13x14y93pqrEv,_ZThn4_N3ccc9CC13x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x14y9E[];
Class_Descriptor cd__ZN3ccc9CC13x14y9E = {  "_ZN3ccc9CC13x14y9E", // class name
  bases__ZN3ccc9CC13x14y9E, 2,
  &(vtc__ZN3ccc9CC13x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC13x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x14y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y10  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC13x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x14y103abcEv
  ~CC13x14y10(); // tgen
  CC13x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y10E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x14y103pqrEv");}
void  ccc::CC13x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x14y103abcEv");}
ccc::CC13x14y10 ::~CC13x14y10(){ note_dtor("_ZN3ccc10CC13x14y10E", this);} // tgen
ccc::CC13x14y10 ::CC13x14y10(){ note_ctor("_ZN3ccc10CC13x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y10E, buf);
    ::ccc::CC13x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y10E);
    dp->::ccc::CC13x14y10::~CC13x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y10E(Test__ZN3ccc10CC13x14y10E, "_ZN3ccc10CC13x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y10C1Ev();
extern void _ZN3ccc10CC13x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y10E[] = {
  NSPAIR(_ZN3ccc10CC13x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x14y103pqrEv();
extern void _ZN3ccc10CC13x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x14y103pqrEv,_ZThn4_N3ccc10CC13x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x14y103pqrEv,_ZThn4_N3ccc10CC13x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y10E[];
Class_Descriptor cd__ZN3ccc10CC13x14y10E = {  "_ZN3ccc10CC13x14y10E", // class name
  bases__ZN3ccc10CC13x14y10E, 2,
  &(vtc__ZN3ccc10CC13x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y11  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC13x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x14y113efgEv
  ~CC13x14y11(); // tgen
  CC13x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y11E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC13x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x14y113pqrEv");}
void  ccc::CC13x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x14y113efgEv");}
ccc::CC13x14y11 ::~CC13x14y11(){ note_dtor("_ZN3ccc10CC13x14y11E", this);} // tgen
ccc::CC13x14y11 ::CC13x14y11(){ note_ctor("_ZN3ccc10CC13x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y11E, buf);
    ::ccc::CC13x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y11E);
    dp->::ccc::CC13x14y11::~CC13x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y11E(Test__ZN3ccc10CC13x14y11E, "_ZN3ccc10CC13x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y11C1Ev();
extern void _ZN3ccc10CC13x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y11E[] = {
  NSPAIR(_ZN3ccc10CC13x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y11E[];
extern void _ZN3ccc10CC13x14y113efgEv();
extern void _ZN3ccc10CC13x14y113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x14y113pqrEv,_ZThn4_N3ccc10CC13x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y113pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x14y113pqrEv,_ZThn4_N3ccc10CC13x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y11E[];
Class_Descriptor cd__ZN3ccc10CC13x14y11E = {  "_ZN3ccc10CC13x14y11E", // class name
  bases__ZN3ccc10CC13x14y11E, 2,
  &(vtc__ZN3ccc10CC13x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y12  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC13x14y123abcEv
  ~CC13x14y12(); // tgen
  CC13x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y12E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC13x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x14y123abcEv");}
ccc::CC13x14y12 ::~CC13x14y12(){ note_dtor("_ZN3ccc10CC13x14y12E", this);} // tgen
ccc::CC13x14y12 ::CC13x14y12(){ note_ctor("_ZN3ccc10CC13x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y12E, buf);
    ::ccc::CC13x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y12E);
    dp->::ccc::CC13x14y12::~CC13x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y12E(Test__ZN3ccc10CC13x14y12E, "_ZN3ccc10CC13x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y12C1Ev();
extern void _ZN3ccc10CC13x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y12E[] = {
  NSPAIR(_ZN3ccc10CC13x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y12E[];
Class_Descriptor cd__ZN3ccc10CC13x14y12E = {  "_ZN3ccc10CC13x14y12E", // class name
  bases__ZN3ccc10CC13x14y12E, 2,
  &(vtc__ZN3ccc10CC13x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y13  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC13x14y133efgEv
  ~CC13x14y13(); // tgen
  CC13x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y13E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC13x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x14y133efgEv");}
ccc::CC13x14y13 ::~CC13x14y13(){ note_dtor("_ZN3ccc10CC13x14y13E", this);} // tgen
ccc::CC13x14y13 ::CC13x14y13(){ note_ctor("_ZN3ccc10CC13x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y13E, buf);
    ::ccc::CC13x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y13E);
    dp->::ccc::CC13x14y13::~CC13x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y13E(Test__ZN3ccc10CC13x14y13E, "_ZN3ccc10CC13x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y13C1Ev();
extern void _ZN3ccc10CC13x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y13E[] = {
  NSPAIR(_ZN3ccc10CC13x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y13E[];
extern void _ZN3ccc10CC13x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y13E[];
Class_Descriptor cd__ZN3ccc10CC13x14y13E = {  "_ZN3ccc10CC13x14y13E", // class name
  bases__ZN3ccc10CC13x14y13E, 2,
  &(vtc__ZN3ccc10CC13x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y13E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y14  : ::ccc::AA13 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC13x14y143pqrEv
  ~CC13x14y14(); // tgen
  CC13x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y14E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC13x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x14y143pqrEv");}
ccc::CC13x14y14 ::~CC13x14y14(){ note_dtor("_ZN3ccc10CC13x14y14E", this);} // tgen
ccc::CC13x14y14 ::CC13x14y14(){ note_ctor("_ZN3ccc10CC13x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y14E, buf);
    ::ccc::CC13x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y14E);
    dp->::ccc::CC13x14y14::~CC13x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y14E(Test__ZN3ccc10CC13x14y14E, "_ZN3ccc10CC13x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y14C1Ev();
extern void _ZN3ccc10CC13x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y14E[] = {
  NSPAIR(_ZN3ccc10CC13x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC13x14y143pqrEv,_ZThn4_N3ccc10CC13x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC13x14y143pqrEv,_ZThn4_N3ccc10CC13x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y14E[];
Class_Descriptor cd__ZN3ccc10CC13x14y14E = {  "_ZN3ccc10CC13x14y14E", // class name
  bases__ZN3ccc10CC13x14y14E, 2,
  &(vtc__ZN3ccc10CC13x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x14y15  : ::ccc::AA13 , ::ccc::BB14 {
  ~CC13x14y15(); // tgen
  CC13x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x14y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC13x14y15 ::~CC13x14y15(){ note_dtor("_ZN3ccc10CC13x14y15E", this);} // tgen
ccc::CC13x14y15 ::CC13x14y15(){ note_ctor("_ZN3ccc10CC13x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC13x14y15E, buf);
    ::ccc::CC13x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC13x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x14y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC13x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x14y15E);
    dp->::ccc::CC13x14y15::~CC13x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x14y15E(Test__ZN3ccc10CC13x14y15E, "_ZN3ccc10CC13x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC13x14y15C1Ev();
extern void _ZN3ccc10CC13x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x14y15E[] = {
  NSPAIR(_ZN3ccc10CC13x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC13x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y15E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x14y15E[];
Class_Descriptor cd__ZN3ccc10CC13x14y15E = {  "_ZN3ccc10CC13x14y15E", // class name
  bases__ZN3ccc10CC13x14y15E, 2,
  &(vtc__ZN3ccc10CC13x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC13x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x14y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y0  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC13x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC13x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y03pqrEv
  ~CC13x15y0(); // tgen
  CC13x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y0E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y03abcEv");}
void  ccc::CC13x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y03efgEv");}
void  ccc::CC13x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y03pqrEv");}
ccc::CC13x15y0 ::~CC13x15y0(){ note_dtor("_ZN3ccc9CC13x15y0E", this);} // tgen
ccc::CC13x15y0 ::CC13x15y0(){ note_ctor("_ZN3ccc9CC13x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y0E, buf);
    ::ccc::CC13x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y0E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y0E);
    dp->::ccc::CC13x15y0::~CC13x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y0E(Test__ZN3ccc9CC13x15y0E, "_ZN3ccc9CC13x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y0C1Ev();
extern void _ZN3ccc9CC13x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y0E[] = {
  NSPAIR(_ZN3ccc9CC13x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y0E[];
extern void _ZN3ccc9CC13x15y03efgEv();
extern void _ZN3ccc9CC13x15y03abcEv();
extern void _ZN3ccc9CC13x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y0E[];
Class_Descriptor cd__ZN3ccc9CC13x15y0E = {  "_ZN3ccc9CC13x15y0E", // class name
  bases__ZN3ccc9CC13x15y0E, 2,
  &(vtc__ZN3ccc9CC13x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y1  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC13x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x15y13efgEv
  ~CC13x15y1(); // tgen
  CC13x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y1E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y13abcEv");}
void  ccc::CC13x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y13pqrEv");}
void  ccc::CC13x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y13efgEv");}
ccc::CC13x15y1 ::~CC13x15y1(){ note_dtor("_ZN3ccc9CC13x15y1E", this);} // tgen
ccc::CC13x15y1 ::CC13x15y1(){ note_ctor("_ZN3ccc9CC13x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y1E, buf);
    ::ccc::CC13x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y1E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y1E);
    dp->::ccc::CC13x15y1::~CC13x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y1E(Test__ZN3ccc9CC13x15y1E, "_ZN3ccc9CC13x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y1C1Ev();
extern void _ZN3ccc9CC13x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y1E[] = {
  NSPAIR(_ZN3ccc9CC13x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y1E[];
extern void _ZN3ccc9CC13x15y13efgEv();
extern void _ZN3ccc9CC13x15y13abcEv();
extern void _ZN3ccc9CC13x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y1E[];
Class_Descriptor cd__ZN3ccc9CC13x15y1E = {  "_ZN3ccc9CC13x15y1E", // class name
  bases__ZN3ccc9CC13x15y1E, 2,
  &(vtc__ZN3ccc9CC13x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y2  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC13x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC13x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y23pqrEv
  ~CC13x15y2(); // tgen
  CC13x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y2E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y23efgEv");}
void  ccc::CC13x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y23abcEv");}
void  ccc::CC13x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y23pqrEv");}
ccc::CC13x15y2 ::~CC13x15y2(){ note_dtor("_ZN3ccc9CC13x15y2E", this);} // tgen
ccc::CC13x15y2 ::CC13x15y2(){ note_ctor("_ZN3ccc9CC13x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y2E, buf);
    ::ccc::CC13x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y2E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y2E);
    dp->::ccc::CC13x15y2::~CC13x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y2E(Test__ZN3ccc9CC13x15y2E, "_ZN3ccc9CC13x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y2C1Ev();
extern void _ZN3ccc9CC13x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y2E[] = {
  NSPAIR(_ZN3ccc9CC13x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y2E[];
extern void _ZN3ccc9CC13x15y23efgEv();
extern void _ZN3ccc9CC13x15y23abcEv();
extern void _ZN3ccc9CC13x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y2E[];
Class_Descriptor cd__ZN3ccc9CC13x15y2E = {  "_ZN3ccc9CC13x15y2E", // class name
  bases__ZN3ccc9CC13x15y2E, 2,
  &(vtc__ZN3ccc9CC13x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y3  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC13x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x15y33abcEv
  ~CC13x15y3(); // tgen
  CC13x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y3E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y33efgEv");}
void  ccc::CC13x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y33pqrEv");}
void  ccc::CC13x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y33abcEv");}
ccc::CC13x15y3 ::~CC13x15y3(){ note_dtor("_ZN3ccc9CC13x15y3E", this);} // tgen
ccc::CC13x15y3 ::CC13x15y3(){ note_ctor("_ZN3ccc9CC13x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y3E, buf);
    ::ccc::CC13x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y3E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y3E);
    dp->::ccc::CC13x15y3::~CC13x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y3E(Test__ZN3ccc9CC13x15y3E, "_ZN3ccc9CC13x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y3C1Ev();
extern void _ZN3ccc9CC13x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y3E[] = {
  NSPAIR(_ZN3ccc9CC13x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y3E[];
extern void _ZN3ccc9CC13x15y33efgEv();
extern void _ZN3ccc9CC13x15y33pqrEv();
extern void _ZN3ccc9CC13x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y3E[];
Class_Descriptor cd__ZN3ccc9CC13x15y3E = {  "_ZN3ccc9CC13x15y3E", // class name
  bases__ZN3ccc9CC13x15y3E, 2,
  &(vtc__ZN3ccc9CC13x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y4  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC13x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC13x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC13x15y43efgEv
  ~CC13x15y4(); // tgen
  CC13x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y4E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y43pqrEv");}
void  ccc::CC13x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y43abcEv");}
void  ccc::CC13x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y43efgEv");}
ccc::CC13x15y4 ::~CC13x15y4(){ note_dtor("_ZN3ccc9CC13x15y4E", this);} // tgen
ccc::CC13x15y4 ::CC13x15y4(){ note_ctor("_ZN3ccc9CC13x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y4E, buf);
    ::ccc::CC13x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y4E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y4E);
    dp->::ccc::CC13x15y4::~CC13x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y4E(Test__ZN3ccc9CC13x15y4E, "_ZN3ccc9CC13x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y4C1Ev();
extern void _ZN3ccc9CC13x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y4E[] = {
  NSPAIR(_ZN3ccc9CC13x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y4E[];
extern void _ZN3ccc9CC13x15y43efgEv();
extern void _ZN3ccc9CC13x15y43pqrEv();
extern void _ZN3ccc9CC13x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y4E[];
Class_Descriptor cd__ZN3ccc9CC13x15y4E = {  "_ZN3ccc9CC13x15y4E", // class name
  bases__ZN3ccc9CC13x15y4E, 2,
  &(vtc__ZN3ccc9CC13x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y5  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC13x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC13x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC13x15y53abcEv
  ~CC13x15y5(); // tgen
  CC13x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y5E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC13x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y53pqrEv");}
void  ccc::CC13x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y53efgEv");}
void  ccc::CC13x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y53abcEv");}
ccc::CC13x15y5 ::~CC13x15y5(){ note_dtor("_ZN3ccc9CC13x15y5E", this);} // tgen
ccc::CC13x15y5 ::CC13x15y5(){ note_ctor("_ZN3ccc9CC13x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y5E, buf);
    ::ccc::CC13x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y5E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y5E);
    dp->::ccc::CC13x15y5::~CC13x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y5E(Test__ZN3ccc9CC13x15y5E, "_ZN3ccc9CC13x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y5C1Ev();
extern void _ZN3ccc9CC13x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y5E[] = {
  NSPAIR(_ZN3ccc9CC13x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y5E[];
extern void _ZN3ccc9CC13x15y53efgEv();
extern void _ZN3ccc9CC13x15y53pqrEv();
extern void _ZN3ccc9CC13x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y5E[];
Class_Descriptor cd__ZN3ccc9CC13x15y5E = {  "_ZN3ccc9CC13x15y5E", // class name
  bases__ZN3ccc9CC13x15y5E, 2,
  &(vtc__ZN3ccc9CC13x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y6  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC13x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC13x15y63efgEv
  ~CC13x15y6(); // tgen
  CC13x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y6E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y63abcEv");}
void  ccc::CC13x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y63efgEv");}
ccc::CC13x15y6 ::~CC13x15y6(){ note_dtor("_ZN3ccc9CC13x15y6E", this);} // tgen
ccc::CC13x15y6 ::CC13x15y6(){ note_ctor("_ZN3ccc9CC13x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y6E, buf);
    ::ccc::CC13x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y6E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y6E);
    dp->::ccc::CC13x15y6::~CC13x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y6E(Test__ZN3ccc9CC13x15y6E, "_ZN3ccc9CC13x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y6C1Ev();
extern void _ZN3ccc9CC13x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y6E[] = {
  NSPAIR(_ZN3ccc9CC13x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y6E[];
extern void _ZN3ccc9CC13x15y63efgEv();
extern void _ZN3ccc9CC13x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y6E[];
Class_Descriptor cd__ZN3ccc9CC13x15y6E = {  "_ZN3ccc9CC13x15y6E", // class name
  bases__ZN3ccc9CC13x15y6E, 2,
  &(vtc__ZN3ccc9CC13x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y7  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC13x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y73pqrEv
  ~CC13x15y7(); // tgen
  CC13x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y7E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y73abcEv");}
void  ccc::CC13x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y73pqrEv");}
ccc::CC13x15y7 ::~CC13x15y7(){ note_dtor("_ZN3ccc9CC13x15y7E", this);} // tgen
ccc::CC13x15y7 ::CC13x15y7(){ note_ctor("_ZN3ccc9CC13x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y7E, buf);
    ::ccc::CC13x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y7E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y7E);
    dp->::ccc::CC13x15y7::~CC13x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y7E(Test__ZN3ccc9CC13x15y7E, "_ZN3ccc9CC13x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y7C1Ev();
extern void _ZN3ccc9CC13x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y7E[] = {
  NSPAIR(_ZN3ccc9CC13x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y7E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc9CC13x15y73abcEv();
extern void _ZN3ccc9CC13x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y7E[];
Class_Descriptor cd__ZN3ccc9CC13x15y7E = {  "_ZN3ccc9CC13x15y7E", // class name
  bases__ZN3ccc9CC13x15y7E, 2,
  &(vtc__ZN3ccc9CC13x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y8  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC13x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC13x15y83abcEv
  ~CC13x15y8(); // tgen
  CC13x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y8E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y83efgEv");}
void  ccc::CC13x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC13x15y83abcEv");}
ccc::CC13x15y8 ::~CC13x15y8(){ note_dtor("_ZN3ccc9CC13x15y8E", this);} // tgen
ccc::CC13x15y8 ::CC13x15y8(){ note_ctor("_ZN3ccc9CC13x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y8E, buf);
    ::ccc::CC13x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y8E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y8E);
    dp->::ccc::CC13x15y8::~CC13x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y8E(Test__ZN3ccc9CC13x15y8E, "_ZN3ccc9CC13x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y8C1Ev();
extern void _ZN3ccc9CC13x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y8E[] = {
  NSPAIR(_ZN3ccc9CC13x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y8E[];
extern void _ZN3ccc9CC13x15y83efgEv();
extern void _ZN3ccc9CC13x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y8E[];
Class_Descriptor cd__ZN3ccc9CC13x15y8E = {  "_ZN3ccc9CC13x15y8E", // class name
  bases__ZN3ccc9CC13x15y8E, 2,
  &(vtc__ZN3ccc9CC13x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y9  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC13x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC13x15y93pqrEv
  ~CC13x15y9(); // tgen
  CC13x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC13x15y9E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC13x15y93efgEv");}
void  ccc::CC13x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC13x15y93pqrEv");}
ccc::CC13x15y9 ::~CC13x15y9(){ note_dtor("_ZN3ccc9CC13x15y9E", this);} // tgen
ccc::CC13x15y9 ::CC13x15y9(){ note_ctor("_ZN3ccc9CC13x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC13x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC13x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC13x15y9E, buf);
    ::ccc::CC13x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC13x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC13x15y9E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc9CC13x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC13x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC13x15y9E);
    dp->::ccc::CC13x15y9::~CC13x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC13x15y9E(Test__ZN3ccc9CC13x15y9E, "_ZN3ccc9CC13x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC13x15y9C1Ev();
extern void _ZN3ccc9CC13x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC13x15y9E[] = {
  NSPAIR(_ZN3ccc9CC13x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC13x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC13x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y9E[];
extern void _ZN3ccc9CC13x15y93efgEv();
extern void _ZN3ccc9CC13x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC13x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC13x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC13x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC13x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC13x15y9E[];
Class_Descriptor cd__ZN3ccc9CC13x15y9E = {  "_ZN3ccc9CC13x15y9E", // class name
  bases__ZN3ccc9CC13x15y9E, 2,
  &(vtc__ZN3ccc9CC13x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC13x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC13x15y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y10  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC13x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC13x15y103abcEv
  ~CC13x15y10(); // tgen
  CC13x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y10E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x15y103pqrEv");}
void  ccc::CC13x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x15y103abcEv");}
ccc::CC13x15y10 ::~CC13x15y10(){ note_dtor("_ZN3ccc10CC13x15y10E", this);} // tgen
ccc::CC13x15y10 ::CC13x15y10(){ note_ctor("_ZN3ccc10CC13x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y10E, buf);
    ::ccc::CC13x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y10E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y10E);
    dp->::ccc::CC13x15y10::~CC13x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y10E(Test__ZN3ccc10CC13x15y10E, "_ZN3ccc10CC13x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y10C1Ev();
extern void _ZN3ccc10CC13x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y10E[] = {
  NSPAIR(_ZN3ccc10CC13x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y10E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x15y103pqrEv();
extern void _ZN3ccc10CC13x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y10E[];
Class_Descriptor cd__ZN3ccc10CC13x15y10E = {  "_ZN3ccc10CC13x15y10E", // class name
  bases__ZN3ccc10CC13x15y10E, 2,
  &(vtc__ZN3ccc10CC13x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y11  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC13x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC13x15y113efgEv
  ~CC13x15y11(); // tgen
  CC13x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y11E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC13x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x15y113pqrEv");}
void  ccc::CC13x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x15y113efgEv");}
ccc::CC13x15y11 ::~CC13x15y11(){ note_dtor("_ZN3ccc10CC13x15y11E", this);} // tgen
ccc::CC13x15y11 ::CC13x15y11(){ note_ctor("_ZN3ccc10CC13x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y11E, buf);
    ::ccc::CC13x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y11E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y11E);
    dp->::ccc::CC13x15y11::~CC13x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y11E(Test__ZN3ccc10CC13x15y11E, "_ZN3ccc10CC13x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y11C1Ev();
extern void _ZN3ccc10CC13x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y11E[] = {
  NSPAIR(_ZN3ccc10CC13x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y11E[];
extern void _ZN3ccc10CC13x15y113efgEv();
extern void _ZN3ccc10CC13x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y11E[];
Class_Descriptor cd__ZN3ccc10CC13x15y11E = {  "_ZN3ccc10CC13x15y11E", // class name
  bases__ZN3ccc10CC13x15y11E, 2,
  &(vtc__ZN3ccc10CC13x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y12  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC13x15y123abcEv
  ~CC13x15y12(); // tgen
  CC13x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y12E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC13x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC13x15y123abcEv");}
ccc::CC13x15y12 ::~CC13x15y12(){ note_dtor("_ZN3ccc10CC13x15y12E", this);} // tgen
ccc::CC13x15y12 ::CC13x15y12(){ note_ctor("_ZN3ccc10CC13x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y12E, buf);
    ::ccc::CC13x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y12E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y12E);
    dp->::ccc::CC13x15y12::~CC13x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y12E(Test__ZN3ccc10CC13x15y12E, "_ZN3ccc10CC13x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y12C1Ev();
extern void _ZN3ccc10CC13x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y12E[] = {
  NSPAIR(_ZN3ccc10CC13x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y12E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y12E[];
Class_Descriptor cd__ZN3ccc10CC13x15y12E = {  "_ZN3ccc10CC13x15y12E", // class name
  bases__ZN3ccc10CC13x15y12E, 2,
  &(vtc__ZN3ccc10CC13x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y13  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC13x15y133efgEv
  ~CC13x15y13(); // tgen
  CC13x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y13E) C1{ BC2{ v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC13x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC13x15y133efgEv");}
ccc::CC13x15y13 ::~CC13x15y13(){ note_dtor("_ZN3ccc10CC13x15y13E", this);} // tgen
ccc::CC13x15y13 ::CC13x15y13(){ note_ctor("_ZN3ccc10CC13x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y13E, buf);
    ::ccc::CC13x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y13E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y13E);
    dp->::ccc::CC13x15y13::~CC13x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y13E(Test__ZN3ccc10CC13x15y13E, "_ZN3ccc10CC13x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y13C1Ev();
extern void _ZN3ccc10CC13x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y13E[] = {
  NSPAIR(_ZN3ccc10CC13x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y13E[];
extern void _ZN3ccc10CC13x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y13E[];
Class_Descriptor cd__ZN3ccc10CC13x15y13E = {  "_ZN3ccc10CC13x15y13E", // class name
  bases__ZN3ccc10CC13x15y13E, 2,
  &(vtc__ZN3ccc10CC13x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y13E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y14  : ::ccc::AA13 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC13x15y143pqrEv
  ~CC13x15y14(); // tgen
  CC13x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y14E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC13x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC13x15y143pqrEv");}
ccc::CC13x15y14 ::~CC13x15y14(){ note_dtor("_ZN3ccc10CC13x15y14E", this);} // tgen
ccc::CC13x15y14 ::CC13x15y14(){ note_ctor("_ZN3ccc10CC13x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y14E, buf);
    ::ccc::CC13x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y14E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y14E);
    dp->::ccc::CC13x15y14::~CC13x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y14E(Test__ZN3ccc10CC13x15y14E, "_ZN3ccc10CC13x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y14C1Ev();
extern void _ZN3ccc10CC13x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y14E[] = {
  NSPAIR(_ZN3ccc10CC13x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y14E[];
extern void _ZN3ccc4AA133efgEv();
extern void _ZN3ccc10CC13x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC13x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y14E[];
Class_Descriptor cd__ZN3ccc10CC13x15y14E = {  "_ZN3ccc10CC13x15y14E", // class name
  bases__ZN3ccc10CC13x15y14E, 2,
  &(vtc__ZN3ccc10CC13x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC13x15y15  : ::ccc::AA13 , ::ccc::BB15 {
  ~CC13x15y15(); // tgen
  CC13x15y15(); // tgen
};
//SIG(1 _ZN3ccc10CC13x15y15E) C1{ BC2{ v1} BC3{}}
}
namespace ccc { 
ccc::CC13x15y15 ::~CC13x15y15(){ note_dtor("_ZN3ccc10CC13x15y15E", this);} // tgen
ccc::CC13x15y15 ::CC13x15y15(){ note_ctor("_ZN3ccc10CC13x15y15E", this);} // tgen
}
static void Test__ZN3ccc10CC13x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC13x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC13x15y15E, buf);
    ::ccc::CC13x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC13x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC13x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC13x15y15E)");
    check_base_class_offset(lv, (::ccc::AA13*), 0, "_ZN3ccc10CC13x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC13x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC13x15y15E);
    dp->::ccc::CC13x15y15::~CC13x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC13x15y15E(Test__ZN3ccc10CC13x15y15E, "_ZN3ccc10CC13x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC13x15y15C1Ev();
extern void _ZN3ccc10CC13x15y15D1Ev();
Name_Map name_map__ZN3ccc10CC13x15y15E[] = {
  NSPAIR(_ZN3ccc10CC13x15y15C1Ev),
  NSPAIR(_ZN3ccc10CC13x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA13E;
extern VTBL_ENTRY _ZTIN3ccc4AA13E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA13E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC13x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y15E[];
extern void _ZN3ccc4AA133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC13x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC13x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC13x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC13x15y15E[];
Class_Descriptor cd__ZN3ccc10CC13x15y15E = {  "_ZN3ccc10CC13x15y15E", // class name
  bases__ZN3ccc10CC13x15y15E, 2,
  &(vtc__ZN3ccc10CC13x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC13x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC13x15y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y0  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC14x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y03pqrEv
  ~CC14x0y0(); // tgen
  CC14x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y0E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y03abcEv");}
void  ccc::CC14x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y03efgEv");}
void  ccc::CC14x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y03pqrEv");}
ccc::CC14x0y0 ::~CC14x0y0(){ note_dtor("_ZN3ccc8CC14x0y0E", this);} // tgen
ccc::CC14x0y0 ::CC14x0y0(){ note_ctor("_ZN3ccc8CC14x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y0E, buf);
    ::ccc::CC14x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y0E);
    dp->::ccc::CC14x0y0::~CC14x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y0E(Test__ZN3ccc8CC14x0y0E, "_ZN3ccc8CC14x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y0C1Ev();
extern void _ZN3ccc8CC14x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y0E[] = {
  NSPAIR(_ZN3ccc8CC14x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y0E[];
extern void _ZN3ccc8CC14x0y03pqrEv();
extern void _ZN3ccc8CC14x0y03abcEv();
extern void _ZN3ccc8CC14x0y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y03abcEv,_ZThn4_N3ccc8CC14x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y03efgEv,_ZThn4_N3ccc8CC14x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y03pqrEv,_ZThn4_N3ccc8CC14x0y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y03abcEv,_ZThn4_N3ccc8CC14x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y03efgEv,_ZThn4_N3ccc8CC14x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y03pqrEv,_ZThn4_N3ccc8CC14x0y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y0E[];
Class_Descriptor cd__ZN3ccc8CC14x0y0E = {  "_ZN3ccc8CC14x0y0E", // class name
  bases__ZN3ccc8CC14x0y0E, 2,
  &(vtc__ZN3ccc8CC14x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y1  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC14x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x0y13efgEv
  ~CC14x0y1(); // tgen
  CC14x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y1E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y13abcEv");}
void  ccc::CC14x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y13pqrEv");}
void  ccc::CC14x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y13efgEv");}
ccc::CC14x0y1 ::~CC14x0y1(){ note_dtor("_ZN3ccc8CC14x0y1E", this);} // tgen
ccc::CC14x0y1 ::CC14x0y1(){ note_ctor("_ZN3ccc8CC14x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y1E, buf);
    ::ccc::CC14x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y1E);
    dp->::ccc::CC14x0y1::~CC14x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y1E(Test__ZN3ccc8CC14x0y1E, "_ZN3ccc8CC14x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y1C1Ev();
extern void _ZN3ccc8CC14x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y1E[] = {
  NSPAIR(_ZN3ccc8CC14x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y1E[];
extern void _ZN3ccc8CC14x0y13pqrEv();
extern void _ZN3ccc8CC14x0y13abcEv();
extern void _ZN3ccc8CC14x0y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y13abcEv,_ZThn4_N3ccc8CC14x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y13efgEv,_ZThn4_N3ccc8CC14x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y13pqrEv,_ZThn4_N3ccc8CC14x0y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y13abcEv,_ZThn4_N3ccc8CC14x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y13efgEv,_ZThn4_N3ccc8CC14x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y13pqrEv,_ZThn4_N3ccc8CC14x0y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y1E[];
Class_Descriptor cd__ZN3ccc8CC14x0y1E = {  "_ZN3ccc8CC14x0y1E", // class name
  bases__ZN3ccc8CC14x0y1E, 2,
  &(vtc__ZN3ccc8CC14x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y2  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC14x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y23pqrEv
  ~CC14x0y2(); // tgen
  CC14x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y2E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y23efgEv");}
void  ccc::CC14x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y23abcEv");}
void  ccc::CC14x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y23pqrEv");}
ccc::CC14x0y2 ::~CC14x0y2(){ note_dtor("_ZN3ccc8CC14x0y2E", this);} // tgen
ccc::CC14x0y2 ::CC14x0y2(){ note_ctor("_ZN3ccc8CC14x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y2E, buf);
    ::ccc::CC14x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y2E);
    dp->::ccc::CC14x0y2::~CC14x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y2E(Test__ZN3ccc8CC14x0y2E, "_ZN3ccc8CC14x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y2C1Ev();
extern void _ZN3ccc8CC14x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y2E[] = {
  NSPAIR(_ZN3ccc8CC14x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y2E[];
extern void _ZN3ccc8CC14x0y23pqrEv();
extern void _ZN3ccc8CC14x0y23efgEv();
extern void _ZN3ccc8CC14x0y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y23abcEv,_ZThn4_N3ccc8CC14x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y23efgEv,_ZThn4_N3ccc8CC14x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y23pqrEv,_ZThn4_N3ccc8CC14x0y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y23abcEv,_ZThn4_N3ccc8CC14x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y23efgEv,_ZThn4_N3ccc8CC14x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y23pqrEv,_ZThn4_N3ccc8CC14x0y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y2E[];
Class_Descriptor cd__ZN3ccc8CC14x0y2E = {  "_ZN3ccc8CC14x0y2E", // class name
  bases__ZN3ccc8CC14x0y2E, 2,
  &(vtc__ZN3ccc8CC14x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y3  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC14x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x0y33abcEv
  ~CC14x0y3(); // tgen
  CC14x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y3E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y33efgEv");}
void  ccc::CC14x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y33pqrEv");}
void  ccc::CC14x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y33abcEv");}
ccc::CC14x0y3 ::~CC14x0y3(){ note_dtor("_ZN3ccc8CC14x0y3E", this);} // tgen
ccc::CC14x0y3 ::CC14x0y3(){ note_ctor("_ZN3ccc8CC14x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y3E, buf);
    ::ccc::CC14x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y3E);
    dp->::ccc::CC14x0y3::~CC14x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y3E(Test__ZN3ccc8CC14x0y3E, "_ZN3ccc8CC14x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y3C1Ev();
extern void _ZN3ccc8CC14x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y3E[] = {
  NSPAIR(_ZN3ccc8CC14x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y3E[];
extern void _ZN3ccc8CC14x0y33pqrEv();
extern void _ZN3ccc8CC14x0y33efgEv();
extern void _ZN3ccc8CC14x0y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y33abcEv,_ZThn4_N3ccc8CC14x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y33efgEv,_ZThn4_N3ccc8CC14x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y33pqrEv,_ZThn4_N3ccc8CC14x0y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y33abcEv,_ZThn4_N3ccc8CC14x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y33efgEv,_ZThn4_N3ccc8CC14x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y33pqrEv,_ZThn4_N3ccc8CC14x0y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y3E[];
Class_Descriptor cd__ZN3ccc8CC14x0y3E = {  "_ZN3ccc8CC14x0y3E", // class name
  bases__ZN3ccc8CC14x0y3E, 2,
  &(vtc__ZN3ccc8CC14x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y4  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC14x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x0y43efgEv
  ~CC14x0y4(); // tgen
  CC14x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y4E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y43pqrEv");}
void  ccc::CC14x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y43abcEv");}
void  ccc::CC14x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y43efgEv");}
ccc::CC14x0y4 ::~CC14x0y4(){ note_dtor("_ZN3ccc8CC14x0y4E", this);} // tgen
ccc::CC14x0y4 ::CC14x0y4(){ note_ctor("_ZN3ccc8CC14x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y4E, buf);
    ::ccc::CC14x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y4E);
    dp->::ccc::CC14x0y4::~CC14x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y4E(Test__ZN3ccc8CC14x0y4E, "_ZN3ccc8CC14x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y4C1Ev();
extern void _ZN3ccc8CC14x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y4E[] = {
  NSPAIR(_ZN3ccc8CC14x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y4E[];
extern void _ZN3ccc8CC14x0y43pqrEv();
extern void _ZN3ccc8CC14x0y43abcEv();
extern void _ZN3ccc8CC14x0y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y43abcEv,_ZThn4_N3ccc8CC14x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y43efgEv,_ZThn4_N3ccc8CC14x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y43pqrEv,_ZThn4_N3ccc8CC14x0y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y43abcEv,_ZThn4_N3ccc8CC14x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y43efgEv,_ZThn4_N3ccc8CC14x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y43pqrEv,_ZThn4_N3ccc8CC14x0y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y4E[];
Class_Descriptor cd__ZN3ccc8CC14x0y4E = {  "_ZN3ccc8CC14x0y4E", // class name
  bases__ZN3ccc8CC14x0y4E, 2,
  &(vtc__ZN3ccc8CC14x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y5  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC14x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x0y53abcEv
  ~CC14x0y5(); // tgen
  CC14x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y5E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y53pqrEv");}
void  ccc::CC14x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y53efgEv");}
void  ccc::CC14x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y53abcEv");}
ccc::CC14x0y5 ::~CC14x0y5(){ note_dtor("_ZN3ccc8CC14x0y5E", this);} // tgen
ccc::CC14x0y5 ::CC14x0y5(){ note_ctor("_ZN3ccc8CC14x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y5E, buf);
    ::ccc::CC14x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y5E);
    dp->::ccc::CC14x0y5::~CC14x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y5E(Test__ZN3ccc8CC14x0y5E, "_ZN3ccc8CC14x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y5C1Ev();
extern void _ZN3ccc8CC14x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y5E[] = {
  NSPAIR(_ZN3ccc8CC14x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y5E[];
extern void _ZN3ccc8CC14x0y53pqrEv();
extern void _ZN3ccc8CC14x0y53efgEv();
extern void _ZN3ccc8CC14x0y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y53abcEv,_ZThn4_N3ccc8CC14x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y53efgEv,_ZThn4_N3ccc8CC14x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y53pqrEv,_ZThn4_N3ccc8CC14x0y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y53abcEv,_ZThn4_N3ccc8CC14x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y53efgEv,_ZThn4_N3ccc8CC14x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y53pqrEv,_ZThn4_N3ccc8CC14x0y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y5E[];
Class_Descriptor cd__ZN3ccc8CC14x0y5E = {  "_ZN3ccc8CC14x0y5E", // class name
  bases__ZN3ccc8CC14x0y5E, 2,
  &(vtc__ZN3ccc8CC14x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y6  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC14x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x0y63efgEv
  ~CC14x0y6(); // tgen
  CC14x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y6E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y63abcEv");}
void  ccc::CC14x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y63efgEv");}
ccc::CC14x0y6 ::~CC14x0y6(){ note_dtor("_ZN3ccc8CC14x0y6E", this);} // tgen
ccc::CC14x0y6 ::CC14x0y6(){ note_ctor("_ZN3ccc8CC14x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y6E, buf);
    ::ccc::CC14x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y6E);
    dp->::ccc::CC14x0y6::~CC14x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y6E(Test__ZN3ccc8CC14x0y6E, "_ZN3ccc8CC14x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y6C1Ev();
extern void _ZN3ccc8CC14x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y6E[] = {
  NSPAIR(_ZN3ccc8CC14x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x0y63abcEv();
extern void _ZN3ccc8CC14x0y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y63abcEv,_ZThn4_N3ccc8CC14x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y63efgEv,_ZThn4_N3ccc8CC14x0y63efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y63abcEv,_ZThn4_N3ccc8CC14x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y63efgEv,_ZThn4_N3ccc8CC14x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y6E[];
Class_Descriptor cd__ZN3ccc8CC14x0y6E = {  "_ZN3ccc8CC14x0y6E", // class name
  bases__ZN3ccc8CC14x0y6E, 2,
  &(vtc__ZN3ccc8CC14x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y7  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC14x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y73pqrEv
  ~CC14x0y7(); // tgen
  CC14x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y7E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y73abcEv");}
void  ccc::CC14x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y73pqrEv");}
ccc::CC14x0y7 ::~CC14x0y7(){ note_dtor("_ZN3ccc8CC14x0y7E", this);} // tgen
ccc::CC14x0y7 ::CC14x0y7(){ note_ctor("_ZN3ccc8CC14x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y7E, buf);
    ::ccc::CC14x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y7E);
    dp->::ccc::CC14x0y7::~CC14x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y7E(Test__ZN3ccc8CC14x0y7E, "_ZN3ccc8CC14x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y7C1Ev();
extern void _ZN3ccc8CC14x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y7E[] = {
  NSPAIR(_ZN3ccc8CC14x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y7E[];
extern void _ZN3ccc8CC14x0y73pqrEv();
extern void _ZN3ccc8CC14x0y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y73abcEv,_ZThn4_N3ccc8CC14x0y73abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y73pqrEv,_ZThn4_N3ccc8CC14x0y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y73abcEv,_ZThn4_N3ccc8CC14x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y73pqrEv,_ZThn4_N3ccc8CC14x0y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y7E[];
Class_Descriptor cd__ZN3ccc8CC14x0y7E = {  "_ZN3ccc8CC14x0y7E", // class name
  bases__ZN3ccc8CC14x0y7E, 2,
  &(vtc__ZN3ccc8CC14x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y8  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC14x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x0y83abcEv
  ~CC14x0y8(); // tgen
  CC14x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y8E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y83efgEv");}
void  ccc::CC14x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x0y83abcEv");}
ccc::CC14x0y8 ::~CC14x0y8(){ note_dtor("_ZN3ccc8CC14x0y8E", this);} // tgen
ccc::CC14x0y8 ::CC14x0y8(){ note_ctor("_ZN3ccc8CC14x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y8E, buf);
    ::ccc::CC14x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y8E);
    dp->::ccc::CC14x0y8::~CC14x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y8E(Test__ZN3ccc8CC14x0y8E, "_ZN3ccc8CC14x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y8C1Ev();
extern void _ZN3ccc8CC14x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y8E[] = {
  NSPAIR(_ZN3ccc8CC14x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x0y83efgEv();
extern void _ZN3ccc8CC14x0y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y83abcEv,_ZThn4_N3ccc8CC14x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y83efgEv,_ZThn4_N3ccc8CC14x0y83efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y83abcEv,_ZThn4_N3ccc8CC14x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y83efgEv,_ZThn4_N3ccc8CC14x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y8E[];
Class_Descriptor cd__ZN3ccc8CC14x0y8E = {  "_ZN3ccc8CC14x0y8E", // class name
  bases__ZN3ccc8CC14x0y8E, 2,
  &(vtc__ZN3ccc8CC14x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y9  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC14x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x0y93pqrEv
  ~CC14x0y9(); // tgen
  CC14x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x0y9E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x0y93efgEv");}
void  ccc::CC14x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x0y93pqrEv");}
ccc::CC14x0y9 ::~CC14x0y9(){ note_dtor("_ZN3ccc8CC14x0y9E", this);} // tgen
ccc::CC14x0y9 ::CC14x0y9(){ note_ctor("_ZN3ccc8CC14x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x0y9E, buf);
    ::ccc::CC14x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x0y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8CC14x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x0y9E);
    dp->::ccc::CC14x0y9::~CC14x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x0y9E(Test__ZN3ccc8CC14x0y9E, "_ZN3ccc8CC14x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x0y9C1Ev();
extern void _ZN3ccc8CC14x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x0y9E[] = {
  NSPAIR(_ZN3ccc8CC14x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC14x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y9E[];
extern void _ZN3ccc8CC14x0y93pqrEv();
extern void _ZN3ccc8CC14x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y93efgEv,_ZThn4_N3ccc8CC14x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x0y93pqrEv,_ZThn4_N3ccc8CC14x0y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x0y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y93efgEv,_ZThn4_N3ccc8CC14x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x0y93pqrEv,_ZThn4_N3ccc8CC14x0y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x0y9E[];
Class_Descriptor cd__ZN3ccc8CC14x0y9E = {  "_ZN3ccc8CC14x0y9E", // class name
  bases__ZN3ccc8CC14x0y9E, 2,
  &(vtc__ZN3ccc8CC14x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x0y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y10  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC14x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x0y103abcEv
  ~CC14x0y10(); // tgen
  CC14x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y10E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x0y103pqrEv");}
void  ccc::CC14x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x0y103abcEv");}
ccc::CC14x0y10 ::~CC14x0y10(){ note_dtor("_ZN3ccc9CC14x0y10E", this);} // tgen
ccc::CC14x0y10 ::CC14x0y10(){ note_ctor("_ZN3ccc9CC14x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y10E, buf);
    ::ccc::CC14x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y10E);
    dp->::ccc::CC14x0y10::~CC14x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y10E(Test__ZN3ccc9CC14x0y10E, "_ZN3ccc9CC14x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y10C1Ev();
extern void _ZN3ccc9CC14x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y10E[] = {
  NSPAIR(_ZN3ccc9CC14x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y10E[];
extern void _ZN3ccc9CC14x0y103pqrEv();
extern void _ZN3ccc9CC14x0y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y103abcEv,_ZThn4_N3ccc9CC14x0y103abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y103pqrEv,_ZThn4_N3ccc9CC14x0y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y103abcEv,_ZThn4_N3ccc9CC14x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y103pqrEv,_ZThn4_N3ccc9CC14x0y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y10E[];
Class_Descriptor cd__ZN3ccc9CC14x0y10E = {  "_ZN3ccc9CC14x0y10E", // class name
  bases__ZN3ccc9CC14x0y10E, 2,
  &(vtc__ZN3ccc9CC14x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y11  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC14x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x0y113efgEv
  ~CC14x0y11(); // tgen
  CC14x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y11E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x0y113pqrEv");}
void  ccc::CC14x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x0y113efgEv");}
ccc::CC14x0y11 ::~CC14x0y11(){ note_dtor("_ZN3ccc9CC14x0y11E", this);} // tgen
ccc::CC14x0y11 ::CC14x0y11(){ note_ctor("_ZN3ccc9CC14x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y11E, buf);
    ::ccc::CC14x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y11E);
    dp->::ccc::CC14x0y11::~CC14x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y11E(Test__ZN3ccc9CC14x0y11E, "_ZN3ccc9CC14x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y11C1Ev();
extern void _ZN3ccc9CC14x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y11E[] = {
  NSPAIR(_ZN3ccc9CC14x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y11E[];
extern void _ZN3ccc9CC14x0y113pqrEv();
extern void _ZN3ccc9CC14x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y113efgEv,_ZThn4_N3ccc9CC14x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y113pqrEv,_ZThn4_N3ccc9CC14x0y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y113efgEv,_ZThn4_N3ccc9CC14x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y113pqrEv,_ZThn4_N3ccc9CC14x0y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y11E[];
Class_Descriptor cd__ZN3ccc9CC14x0y11E = {  "_ZN3ccc9CC14x0y11E", // class name
  bases__ZN3ccc9CC14x0y11E, 2,
  &(vtc__ZN3ccc9CC14x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y12  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC14x0y123abcEv
  ~CC14x0y12(); // tgen
  CC14x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y12E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x0y123abcEv");}
ccc::CC14x0y12 ::~CC14x0y12(){ note_dtor("_ZN3ccc9CC14x0y12E", this);} // tgen
ccc::CC14x0y12 ::CC14x0y12(){ note_ctor("_ZN3ccc9CC14x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y12E, buf);
    ::ccc::CC14x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y12E);
    dp->::ccc::CC14x0y12::~CC14x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y12E(Test__ZN3ccc9CC14x0y12E, "_ZN3ccc9CC14x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y12C1Ev();
extern void _ZN3ccc9CC14x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y12E[] = {
  NSPAIR(_ZN3ccc9CC14x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x0y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y123abcEv,_ZThn4_N3ccc9CC14x0y123abcEv)();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y123abcEv,_ZThn4_N3ccc9CC14x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y12E[];
Class_Descriptor cd__ZN3ccc9CC14x0y12E = {  "_ZN3ccc9CC14x0y12E", // class name
  bases__ZN3ccc9CC14x0y12E, 2,
  &(vtc__ZN3ccc9CC14x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y13  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC14x0y133efgEv
  ~CC14x0y13(); // tgen
  CC14x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y13E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC14x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x0y133efgEv");}
ccc::CC14x0y13 ::~CC14x0y13(){ note_dtor("_ZN3ccc9CC14x0y13E", this);} // tgen
ccc::CC14x0y13 ::CC14x0y13(){ note_ctor("_ZN3ccc9CC14x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y13E, buf);
    ::ccc::CC14x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y13E);
    dp->::ccc::CC14x0y13::~CC14x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y13E(Test__ZN3ccc9CC14x0y13E, "_ZN3ccc9CC14x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y13C1Ev();
extern void _ZN3ccc9CC14x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y13E[] = {
  NSPAIR(_ZN3ccc9CC14x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y133efgEv,_ZThn4_N3ccc9CC14x0y133efgEv)();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y133efgEv,_ZThn4_N3ccc9CC14x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y13E[];
Class_Descriptor cd__ZN3ccc9CC14x0y13E = {  "_ZN3ccc9CC14x0y13E", // class name
  bases__ZN3ccc9CC14x0y13E, 2,
  &(vtc__ZN3ccc9CC14x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y14  : ::ccc::AA14 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC14x0y143pqrEv
  ~CC14x0y14(); // tgen
  CC14x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y14E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x0y143pqrEv");}
ccc::CC14x0y14 ::~CC14x0y14(){ note_dtor("_ZN3ccc9CC14x0y14E", this);} // tgen
ccc::CC14x0y14 ::CC14x0y14(){ note_ctor("_ZN3ccc9CC14x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y14E, buf);
    ::ccc::CC14x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y14E);
    dp->::ccc::CC14x0y14::~CC14x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y14E(Test__ZN3ccc9CC14x0y14E, "_ZN3ccc9CC14x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y14C1Ev();
extern void _ZN3ccc9CC14x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y14E[] = {
  NSPAIR(_ZN3ccc9CC14x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y14E[];
extern void _ZN3ccc9CC14x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x0y143pqrEv,_ZThn4_N3ccc9CC14x0y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x0y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x0y143pqrEv,_ZThn4_N3ccc9CC14x0y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y14E[];
Class_Descriptor cd__ZN3ccc9CC14x0y14E = {  "_ZN3ccc9CC14x0y14E", // class name
  bases__ZN3ccc9CC14x0y14E, 2,
  &(vtc__ZN3ccc9CC14x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x0y15  : ::ccc::AA14 , ::ccc::BB0 {
  ~CC14x0y15(); // tgen
  CC14x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x0y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x0y15 ::~CC14x0y15(){ note_dtor("_ZN3ccc9CC14x0y15E", this);} // tgen
ccc::CC14x0y15 ::CC14x0y15(){ note_ctor("_ZN3ccc9CC14x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x0y15E, buf);
    ::ccc::CC14x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x0y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9CC14x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x0y15E);
    dp->::ccc::CC14x0y15::~CC14x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x0y15E(Test__ZN3ccc9CC14x0y15E, "_ZN3ccc9CC14x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x0y15C1Ev();
extern void _ZN3ccc9CC14x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x0y15E[] = {
  NSPAIR(_ZN3ccc9CC14x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC14x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x0y15E[];
Class_Descriptor cd__ZN3ccc9CC14x0y15E = {  "_ZN3ccc9CC14x0y15E", // class name
  bases__ZN3ccc9CC14x0y15E, 2,
  &(vtc__ZN3ccc9CC14x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x0y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y0  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC14x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y03pqrEv
  ~CC14x1y0(); // tgen
  CC14x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y0E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y03abcEv");}
void  ccc::CC14x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y03efgEv");}
void  ccc::CC14x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y03pqrEv");}
ccc::CC14x1y0 ::~CC14x1y0(){ note_dtor("_ZN3ccc8CC14x1y0E", this);} // tgen
ccc::CC14x1y0 ::CC14x1y0(){ note_ctor("_ZN3ccc8CC14x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y0E, buf);
    ::ccc::CC14x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y0E);
    dp->::ccc::CC14x1y0::~CC14x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y0E(Test__ZN3ccc8CC14x1y0E, "_ZN3ccc8CC14x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y0C1Ev();
extern void _ZN3ccc8CC14x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y0E[] = {
  NSPAIR(_ZN3ccc8CC14x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y0E[];
extern void _ZN3ccc8CC14x1y03pqrEv();
extern void _ZN3ccc8CC14x1y03abcEv();
extern void _ZN3ccc8CC14x1y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y03abcEv,_ZThn4_N3ccc8CC14x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y03pqrEv,_ZThn4_N3ccc8CC14x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y03efgEv,_ZThn4_N3ccc8CC14x1y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y03abcEv,_ZThn4_N3ccc8CC14x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y03pqrEv,_ZThn4_N3ccc8CC14x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y03efgEv,_ZThn4_N3ccc8CC14x1y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y0E[];
Class_Descriptor cd__ZN3ccc8CC14x1y0E = {  "_ZN3ccc8CC14x1y0E", // class name
  bases__ZN3ccc8CC14x1y0E, 2,
  &(vtc__ZN3ccc8CC14x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y1  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC14x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x1y13efgEv
  ~CC14x1y1(); // tgen
  CC14x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y1E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y13abcEv");}
void  ccc::CC14x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y13pqrEv");}
void  ccc::CC14x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y13efgEv");}
ccc::CC14x1y1 ::~CC14x1y1(){ note_dtor("_ZN3ccc8CC14x1y1E", this);} // tgen
ccc::CC14x1y1 ::CC14x1y1(){ note_ctor("_ZN3ccc8CC14x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y1E, buf);
    ::ccc::CC14x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y1E);
    dp->::ccc::CC14x1y1::~CC14x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y1E(Test__ZN3ccc8CC14x1y1E, "_ZN3ccc8CC14x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y1C1Ev();
extern void _ZN3ccc8CC14x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y1E[] = {
  NSPAIR(_ZN3ccc8CC14x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y1E[];
extern void _ZN3ccc8CC14x1y13pqrEv();
extern void _ZN3ccc8CC14x1y13abcEv();
extern void _ZN3ccc8CC14x1y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y13abcEv,_ZThn4_N3ccc8CC14x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y13pqrEv,_ZThn4_N3ccc8CC14x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y13efgEv,_ZThn4_N3ccc8CC14x1y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y13abcEv,_ZThn4_N3ccc8CC14x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y13pqrEv,_ZThn4_N3ccc8CC14x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y13efgEv,_ZThn4_N3ccc8CC14x1y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y1E[];
Class_Descriptor cd__ZN3ccc8CC14x1y1E = {  "_ZN3ccc8CC14x1y1E", // class name
  bases__ZN3ccc8CC14x1y1E, 2,
  &(vtc__ZN3ccc8CC14x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y2  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC14x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y23pqrEv
  ~CC14x1y2(); // tgen
  CC14x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y2E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y23efgEv");}
void  ccc::CC14x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y23abcEv");}
void  ccc::CC14x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y23pqrEv");}
ccc::CC14x1y2 ::~CC14x1y2(){ note_dtor("_ZN3ccc8CC14x1y2E", this);} // tgen
ccc::CC14x1y2 ::CC14x1y2(){ note_ctor("_ZN3ccc8CC14x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y2E, buf);
    ::ccc::CC14x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y2E);
    dp->::ccc::CC14x1y2::~CC14x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y2E(Test__ZN3ccc8CC14x1y2E, "_ZN3ccc8CC14x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y2C1Ev();
extern void _ZN3ccc8CC14x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y2E[] = {
  NSPAIR(_ZN3ccc8CC14x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y2E[];
extern void _ZN3ccc8CC14x1y23pqrEv();
extern void _ZN3ccc8CC14x1y23efgEv();
extern void _ZN3ccc8CC14x1y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y23abcEv,_ZThn4_N3ccc8CC14x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y23pqrEv,_ZThn4_N3ccc8CC14x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y23efgEv,_ZThn4_N3ccc8CC14x1y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y23abcEv,_ZThn4_N3ccc8CC14x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y23pqrEv,_ZThn4_N3ccc8CC14x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y23efgEv,_ZThn4_N3ccc8CC14x1y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y2E[];
Class_Descriptor cd__ZN3ccc8CC14x1y2E = {  "_ZN3ccc8CC14x1y2E", // class name
  bases__ZN3ccc8CC14x1y2E, 2,
  &(vtc__ZN3ccc8CC14x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y3  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC14x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x1y33abcEv
  ~CC14x1y3(); // tgen
  CC14x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y3E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y33efgEv");}
void  ccc::CC14x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y33pqrEv");}
void  ccc::CC14x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y33abcEv");}
ccc::CC14x1y3 ::~CC14x1y3(){ note_dtor("_ZN3ccc8CC14x1y3E", this);} // tgen
ccc::CC14x1y3 ::CC14x1y3(){ note_ctor("_ZN3ccc8CC14x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y3E, buf);
    ::ccc::CC14x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y3E);
    dp->::ccc::CC14x1y3::~CC14x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y3E(Test__ZN3ccc8CC14x1y3E, "_ZN3ccc8CC14x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y3C1Ev();
extern void _ZN3ccc8CC14x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y3E[] = {
  NSPAIR(_ZN3ccc8CC14x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y3E[];
extern void _ZN3ccc8CC14x1y33pqrEv();
extern void _ZN3ccc8CC14x1y33efgEv();
extern void _ZN3ccc8CC14x1y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y33abcEv,_ZThn4_N3ccc8CC14x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y33pqrEv,_ZThn4_N3ccc8CC14x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y33efgEv,_ZThn4_N3ccc8CC14x1y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y33abcEv,_ZThn4_N3ccc8CC14x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y33pqrEv,_ZThn4_N3ccc8CC14x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y33efgEv,_ZThn4_N3ccc8CC14x1y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y3E[];
Class_Descriptor cd__ZN3ccc8CC14x1y3E = {  "_ZN3ccc8CC14x1y3E", // class name
  bases__ZN3ccc8CC14x1y3E, 2,
  &(vtc__ZN3ccc8CC14x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y4  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC14x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x1y43efgEv
  ~CC14x1y4(); // tgen
  CC14x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y4E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y43pqrEv");}
void  ccc::CC14x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y43abcEv");}
void  ccc::CC14x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y43efgEv");}
ccc::CC14x1y4 ::~CC14x1y4(){ note_dtor("_ZN3ccc8CC14x1y4E", this);} // tgen
ccc::CC14x1y4 ::CC14x1y4(){ note_ctor("_ZN3ccc8CC14x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y4E, buf);
    ::ccc::CC14x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y4E);
    dp->::ccc::CC14x1y4::~CC14x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y4E(Test__ZN3ccc8CC14x1y4E, "_ZN3ccc8CC14x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y4C1Ev();
extern void _ZN3ccc8CC14x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y4E[] = {
  NSPAIR(_ZN3ccc8CC14x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y4E[];
extern void _ZN3ccc8CC14x1y43pqrEv();
extern void _ZN3ccc8CC14x1y43abcEv();
extern void _ZN3ccc8CC14x1y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y43abcEv,_ZThn4_N3ccc8CC14x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y43pqrEv,_ZThn4_N3ccc8CC14x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y43efgEv,_ZThn4_N3ccc8CC14x1y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y43abcEv,_ZThn4_N3ccc8CC14x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y43pqrEv,_ZThn4_N3ccc8CC14x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y43efgEv,_ZThn4_N3ccc8CC14x1y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y4E[];
Class_Descriptor cd__ZN3ccc8CC14x1y4E = {  "_ZN3ccc8CC14x1y4E", // class name
  bases__ZN3ccc8CC14x1y4E, 2,
  &(vtc__ZN3ccc8CC14x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y5  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC14x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x1y53abcEv
  ~CC14x1y5(); // tgen
  CC14x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y5E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y53pqrEv");}
void  ccc::CC14x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y53efgEv");}
void  ccc::CC14x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y53abcEv");}
ccc::CC14x1y5 ::~CC14x1y5(){ note_dtor("_ZN3ccc8CC14x1y5E", this);} // tgen
ccc::CC14x1y5 ::CC14x1y5(){ note_ctor("_ZN3ccc8CC14x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y5E, buf);
    ::ccc::CC14x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y5E);
    dp->::ccc::CC14x1y5::~CC14x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y5E(Test__ZN3ccc8CC14x1y5E, "_ZN3ccc8CC14x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y5C1Ev();
extern void _ZN3ccc8CC14x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y5E[] = {
  NSPAIR(_ZN3ccc8CC14x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y5E[];
extern void _ZN3ccc8CC14x1y53pqrEv();
extern void _ZN3ccc8CC14x1y53efgEv();
extern void _ZN3ccc8CC14x1y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y53abcEv,_ZThn4_N3ccc8CC14x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y53pqrEv,_ZThn4_N3ccc8CC14x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y53efgEv,_ZThn4_N3ccc8CC14x1y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y53abcEv,_ZThn4_N3ccc8CC14x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y53pqrEv,_ZThn4_N3ccc8CC14x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y53efgEv,_ZThn4_N3ccc8CC14x1y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y5E[];
Class_Descriptor cd__ZN3ccc8CC14x1y5E = {  "_ZN3ccc8CC14x1y5E", // class name
  bases__ZN3ccc8CC14x1y5E, 2,
  &(vtc__ZN3ccc8CC14x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y6  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC14x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x1y63efgEv
  ~CC14x1y6(); // tgen
  CC14x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y6E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y63abcEv");}
void  ccc::CC14x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y63efgEv");}
ccc::CC14x1y6 ::~CC14x1y6(){ note_dtor("_ZN3ccc8CC14x1y6E", this);} // tgen
ccc::CC14x1y6 ::CC14x1y6(){ note_ctor("_ZN3ccc8CC14x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y6E, buf);
    ::ccc::CC14x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y6E);
    dp->::ccc::CC14x1y6::~CC14x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y6E(Test__ZN3ccc8CC14x1y6E, "_ZN3ccc8CC14x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y6C1Ev();
extern void _ZN3ccc8CC14x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y6E[] = {
  NSPAIR(_ZN3ccc8CC14x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x1y63abcEv();
extern void _ZN3ccc8CC14x1y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y63abcEv,_ZThn4_N3ccc8CC14x1y63abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y63efgEv,_ZThn4_N3ccc8CC14x1y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y63abcEv,_ZThn4_N3ccc8CC14x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y63efgEv,_ZThn4_N3ccc8CC14x1y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y6E[];
Class_Descriptor cd__ZN3ccc8CC14x1y6E = {  "_ZN3ccc8CC14x1y6E", // class name
  bases__ZN3ccc8CC14x1y6E, 2,
  &(vtc__ZN3ccc8CC14x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y7  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC14x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y73pqrEv
  ~CC14x1y7(); // tgen
  CC14x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y7E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y73abcEv");}
void  ccc::CC14x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y73pqrEv");}
ccc::CC14x1y7 ::~CC14x1y7(){ note_dtor("_ZN3ccc8CC14x1y7E", this);} // tgen
ccc::CC14x1y7 ::CC14x1y7(){ note_ctor("_ZN3ccc8CC14x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y7E, buf);
    ::ccc::CC14x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y7E);
    dp->::ccc::CC14x1y7::~CC14x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y7E(Test__ZN3ccc8CC14x1y7E, "_ZN3ccc8CC14x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y7C1Ev();
extern void _ZN3ccc8CC14x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y7E[] = {
  NSPAIR(_ZN3ccc8CC14x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y7E[];
extern void _ZN3ccc8CC14x1y73pqrEv();
extern void _ZN3ccc8CC14x1y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y73abcEv,_ZThn4_N3ccc8CC14x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y73pqrEv,_ZThn4_N3ccc8CC14x1y73pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y73abcEv,_ZThn4_N3ccc8CC14x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y73pqrEv,_ZThn4_N3ccc8CC14x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y7E[];
Class_Descriptor cd__ZN3ccc8CC14x1y7E = {  "_ZN3ccc8CC14x1y7E", // class name
  bases__ZN3ccc8CC14x1y7E, 2,
  &(vtc__ZN3ccc8CC14x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y8  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC14x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x1y83abcEv
  ~CC14x1y8(); // tgen
  CC14x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y8E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y83efgEv");}
void  ccc::CC14x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x1y83abcEv");}
ccc::CC14x1y8 ::~CC14x1y8(){ note_dtor("_ZN3ccc8CC14x1y8E", this);} // tgen
ccc::CC14x1y8 ::CC14x1y8(){ note_ctor("_ZN3ccc8CC14x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y8E, buf);
    ::ccc::CC14x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y8E);
    dp->::ccc::CC14x1y8::~CC14x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y8E(Test__ZN3ccc8CC14x1y8E, "_ZN3ccc8CC14x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y8C1Ev();
extern void _ZN3ccc8CC14x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y8E[] = {
  NSPAIR(_ZN3ccc8CC14x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x1y83efgEv();
extern void _ZN3ccc8CC14x1y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y83abcEv,_ZThn4_N3ccc8CC14x1y83abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y83efgEv,_ZThn4_N3ccc8CC14x1y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y83abcEv,_ZThn4_N3ccc8CC14x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y83efgEv,_ZThn4_N3ccc8CC14x1y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y8E[];
Class_Descriptor cd__ZN3ccc8CC14x1y8E = {  "_ZN3ccc8CC14x1y8E", // class name
  bases__ZN3ccc8CC14x1y8E, 2,
  &(vtc__ZN3ccc8CC14x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y9  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC14x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x1y93pqrEv
  ~CC14x1y9(); // tgen
  CC14x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x1y9E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x1y93efgEv");}
void  ccc::CC14x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x1y93pqrEv");}
ccc::CC14x1y9 ::~CC14x1y9(){ note_dtor("_ZN3ccc8CC14x1y9E", this);} // tgen
ccc::CC14x1y9 ::CC14x1y9(){ note_ctor("_ZN3ccc8CC14x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x1y9E, buf);
    ::ccc::CC14x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x1y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8CC14x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x1y9E);
    dp->::ccc::CC14x1y9::~CC14x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x1y9E(Test__ZN3ccc8CC14x1y9E, "_ZN3ccc8CC14x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x1y9C1Ev();
extern void _ZN3ccc8CC14x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x1y9E[] = {
  NSPAIR(_ZN3ccc8CC14x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC14x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y9E[];
extern void _ZN3ccc8CC14x1y93pqrEv();
extern void _ZN3ccc8CC14x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y93pqrEv,_ZThn4_N3ccc8CC14x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x1y93efgEv,_ZThn4_N3ccc8CC14x1y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x1y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y93pqrEv,_ZThn4_N3ccc8CC14x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x1y93efgEv,_ZThn4_N3ccc8CC14x1y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x1y9E[];
Class_Descriptor cd__ZN3ccc8CC14x1y9E = {  "_ZN3ccc8CC14x1y9E", // class name
  bases__ZN3ccc8CC14x1y9E, 2,
  &(vtc__ZN3ccc8CC14x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x1y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y10  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC14x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x1y103abcEv
  ~CC14x1y10(); // tgen
  CC14x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y10E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x1y103pqrEv");}
void  ccc::CC14x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x1y103abcEv");}
ccc::CC14x1y10 ::~CC14x1y10(){ note_dtor("_ZN3ccc9CC14x1y10E", this);} // tgen
ccc::CC14x1y10 ::CC14x1y10(){ note_ctor("_ZN3ccc9CC14x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y10E, buf);
    ::ccc::CC14x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y10E);
    dp->::ccc::CC14x1y10::~CC14x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y10E(Test__ZN3ccc9CC14x1y10E, "_ZN3ccc9CC14x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y10C1Ev();
extern void _ZN3ccc9CC14x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y10E[] = {
  NSPAIR(_ZN3ccc9CC14x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y10E[];
extern void _ZN3ccc9CC14x1y103pqrEv();
extern void _ZN3ccc9CC14x1y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y103abcEv,_ZThn4_N3ccc9CC14x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y103pqrEv,_ZThn4_N3ccc9CC14x1y103pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y103abcEv,_ZThn4_N3ccc9CC14x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y103pqrEv,_ZThn4_N3ccc9CC14x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y10E[];
Class_Descriptor cd__ZN3ccc9CC14x1y10E = {  "_ZN3ccc9CC14x1y10E", // class name
  bases__ZN3ccc9CC14x1y10E, 2,
  &(vtc__ZN3ccc9CC14x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y11  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC14x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x1y113efgEv
  ~CC14x1y11(); // tgen
  CC14x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y11E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x1y113pqrEv");}
void  ccc::CC14x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x1y113efgEv");}
ccc::CC14x1y11 ::~CC14x1y11(){ note_dtor("_ZN3ccc9CC14x1y11E", this);} // tgen
ccc::CC14x1y11 ::CC14x1y11(){ note_ctor("_ZN3ccc9CC14x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y11E, buf);
    ::ccc::CC14x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y11E);
    dp->::ccc::CC14x1y11::~CC14x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y11E(Test__ZN3ccc9CC14x1y11E, "_ZN3ccc9CC14x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y11C1Ev();
extern void _ZN3ccc9CC14x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y11E[] = {
  NSPAIR(_ZN3ccc9CC14x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y11E[];
extern void _ZN3ccc9CC14x1y113pqrEv();
extern void _ZN3ccc9CC14x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y113pqrEv,_ZThn4_N3ccc9CC14x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y113efgEv,_ZThn4_N3ccc9CC14x1y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y113pqrEv,_ZThn4_N3ccc9CC14x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y113efgEv,_ZThn4_N3ccc9CC14x1y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y11E[];
Class_Descriptor cd__ZN3ccc9CC14x1y11E = {  "_ZN3ccc9CC14x1y11E", // class name
  bases__ZN3ccc9CC14x1y11E, 2,
  &(vtc__ZN3ccc9CC14x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y12  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC14x1y123abcEv
  ~CC14x1y12(); // tgen
  CC14x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y12E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x1y123abcEv");}
ccc::CC14x1y12 ::~CC14x1y12(){ note_dtor("_ZN3ccc9CC14x1y12E", this);} // tgen
ccc::CC14x1y12 ::CC14x1y12(){ note_ctor("_ZN3ccc9CC14x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y12E, buf);
    ::ccc::CC14x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y12E);
    dp->::ccc::CC14x1y12::~CC14x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y12E(Test__ZN3ccc9CC14x1y12E, "_ZN3ccc9CC14x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y12C1Ev();
extern void _ZN3ccc9CC14x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y12E[] = {
  NSPAIR(_ZN3ccc9CC14x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x1y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y123abcEv,_ZThn4_N3ccc9CC14x1y123abcEv)();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y123abcEv,_ZThn4_N3ccc9CC14x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y12E[];
Class_Descriptor cd__ZN3ccc9CC14x1y12E = {  "_ZN3ccc9CC14x1y12E", // class name
  bases__ZN3ccc9CC14x1y12E, 2,
  &(vtc__ZN3ccc9CC14x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y13  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC14x1y133efgEv
  ~CC14x1y13(); // tgen
  CC14x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y13E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC14x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x1y133efgEv");}
ccc::CC14x1y13 ::~CC14x1y13(){ note_dtor("_ZN3ccc9CC14x1y13E", this);} // tgen
ccc::CC14x1y13 ::CC14x1y13(){ note_ctor("_ZN3ccc9CC14x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y13E, buf);
    ::ccc::CC14x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y13E);
    dp->::ccc::CC14x1y13::~CC14x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y13E(Test__ZN3ccc9CC14x1y13E, "_ZN3ccc9CC14x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y13C1Ev();
extern void _ZN3ccc9CC14x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y13E[] = {
  NSPAIR(_ZN3ccc9CC14x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y133efgEv,_ZThn4_N3ccc9CC14x1y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y133efgEv,_ZThn4_N3ccc9CC14x1y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y13E[];
Class_Descriptor cd__ZN3ccc9CC14x1y13E = {  "_ZN3ccc9CC14x1y13E", // class name
  bases__ZN3ccc9CC14x1y13E, 2,
  &(vtc__ZN3ccc9CC14x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y14  : ::ccc::AA14 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC14x1y143pqrEv
  ~CC14x1y14(); // tgen
  CC14x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y14E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x1y143pqrEv");}
ccc::CC14x1y14 ::~CC14x1y14(){ note_dtor("_ZN3ccc9CC14x1y14E", this);} // tgen
ccc::CC14x1y14 ::CC14x1y14(){ note_ctor("_ZN3ccc9CC14x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y14E, buf);
    ::ccc::CC14x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y14E);
    dp->::ccc::CC14x1y14::~CC14x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y14E(Test__ZN3ccc9CC14x1y14E, "_ZN3ccc9CC14x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y14C1Ev();
extern void _ZN3ccc9CC14x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y14E[] = {
  NSPAIR(_ZN3ccc9CC14x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y14E[];
extern void _ZN3ccc9CC14x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x1y143pqrEv,_ZThn4_N3ccc9CC14x1y143pqrEv)();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x1y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x1y143pqrEv,_ZThn4_N3ccc9CC14x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y14E[];
Class_Descriptor cd__ZN3ccc9CC14x1y14E = {  "_ZN3ccc9CC14x1y14E", // class name
  bases__ZN3ccc9CC14x1y14E, 2,
  &(vtc__ZN3ccc9CC14x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x1y15  : ::ccc::AA14 , ::ccc::BB1 {
  ~CC14x1y15(); // tgen
  CC14x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x1y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x1y15 ::~CC14x1y15(){ note_dtor("_ZN3ccc9CC14x1y15E", this);} // tgen
ccc::CC14x1y15 ::CC14x1y15(){ note_ctor("_ZN3ccc9CC14x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x1y15E, buf);
    ::ccc::CC14x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x1y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9CC14x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x1y15E);
    dp->::ccc::CC14x1y15::~CC14x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x1y15E(Test__ZN3ccc9CC14x1y15E, "_ZN3ccc9CC14x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x1y15C1Ev();
extern void _ZN3ccc9CC14x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x1y15E[] = {
  NSPAIR(_ZN3ccc9CC14x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC14x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x1y15E[];
Class_Descriptor cd__ZN3ccc9CC14x1y15E = {  "_ZN3ccc9CC14x1y15E", // class name
  bases__ZN3ccc9CC14x1y15E, 2,
  &(vtc__ZN3ccc9CC14x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x1y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y0  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC14x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y03pqrEv
  ~CC14x2y0(); // tgen
  CC14x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y0E) C1{ BC2{ v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y03abcEv");}
void  ccc::CC14x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y03efgEv");}
void  ccc::CC14x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y03pqrEv");}
ccc::CC14x2y0 ::~CC14x2y0(){ note_dtor("_ZN3ccc8CC14x2y0E", this);} // tgen
ccc::CC14x2y0 ::CC14x2y0(){ note_ctor("_ZN3ccc8CC14x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y0E, buf);
    ::ccc::CC14x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y0E);
    dp->::ccc::CC14x2y0::~CC14x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y0E(Test__ZN3ccc8CC14x2y0E, "_ZN3ccc8CC14x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y0C1Ev();
extern void _ZN3ccc8CC14x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y0E[] = {
  NSPAIR(_ZN3ccc8CC14x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y0E[];
extern void _ZN3ccc8CC14x2y03pqrEv();
extern void _ZN3ccc8CC14x2y03abcEv();
extern void _ZN3ccc8CC14x2y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y03efgEv,_ZThn4_N3ccc8CC14x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y03abcEv,_ZThn4_N3ccc8CC14x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y03pqrEv,_ZThn4_N3ccc8CC14x2y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y03efgEv,_ZThn4_N3ccc8CC14x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y03abcEv,_ZThn4_N3ccc8CC14x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y03pqrEv,_ZThn4_N3ccc8CC14x2y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y0E[];
Class_Descriptor cd__ZN3ccc8CC14x2y0E = {  "_ZN3ccc8CC14x2y0E", // class name
  bases__ZN3ccc8CC14x2y0E, 2,
  &(vtc__ZN3ccc8CC14x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y1  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC14x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x2y13efgEv
  ~CC14x2y1(); // tgen
  CC14x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y1E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y13abcEv");}
void  ccc::CC14x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y13pqrEv");}
void  ccc::CC14x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y13efgEv");}
ccc::CC14x2y1 ::~CC14x2y1(){ note_dtor("_ZN3ccc8CC14x2y1E", this);} // tgen
ccc::CC14x2y1 ::CC14x2y1(){ note_ctor("_ZN3ccc8CC14x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y1E, buf);
    ::ccc::CC14x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y1E);
    dp->::ccc::CC14x2y1::~CC14x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y1E(Test__ZN3ccc8CC14x2y1E, "_ZN3ccc8CC14x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y1C1Ev();
extern void _ZN3ccc8CC14x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y1E[] = {
  NSPAIR(_ZN3ccc8CC14x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y1E[];
extern void _ZN3ccc8CC14x2y13pqrEv();
extern void _ZN3ccc8CC14x2y13abcEv();
extern void _ZN3ccc8CC14x2y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y13efgEv,_ZThn4_N3ccc8CC14x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y13abcEv,_ZThn4_N3ccc8CC14x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y13pqrEv,_ZThn4_N3ccc8CC14x2y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y13efgEv,_ZThn4_N3ccc8CC14x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y13abcEv,_ZThn4_N3ccc8CC14x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y13pqrEv,_ZThn4_N3ccc8CC14x2y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y1E[];
Class_Descriptor cd__ZN3ccc8CC14x2y1E = {  "_ZN3ccc8CC14x2y1E", // class name
  bases__ZN3ccc8CC14x2y1E, 2,
  &(vtc__ZN3ccc8CC14x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y2  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC14x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y23pqrEv
  ~CC14x2y2(); // tgen
  CC14x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y2E) C1{ BC2{ v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y23efgEv");}
void  ccc::CC14x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y23abcEv");}
void  ccc::CC14x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y23pqrEv");}
ccc::CC14x2y2 ::~CC14x2y2(){ note_dtor("_ZN3ccc8CC14x2y2E", this);} // tgen
ccc::CC14x2y2 ::CC14x2y2(){ note_ctor("_ZN3ccc8CC14x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y2E, buf);
    ::ccc::CC14x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y2E);
    dp->::ccc::CC14x2y2::~CC14x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y2E(Test__ZN3ccc8CC14x2y2E, "_ZN3ccc8CC14x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y2C1Ev();
extern void _ZN3ccc8CC14x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y2E[] = {
  NSPAIR(_ZN3ccc8CC14x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y2E[];
extern void _ZN3ccc8CC14x2y23pqrEv();
extern void _ZN3ccc8CC14x2y23efgEv();
extern void _ZN3ccc8CC14x2y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y23efgEv,_ZThn4_N3ccc8CC14x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y23abcEv,_ZThn4_N3ccc8CC14x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y23pqrEv,_ZThn4_N3ccc8CC14x2y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y23efgEv,_ZThn4_N3ccc8CC14x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y23abcEv,_ZThn4_N3ccc8CC14x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y23pqrEv,_ZThn4_N3ccc8CC14x2y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y2E[];
Class_Descriptor cd__ZN3ccc8CC14x2y2E = {  "_ZN3ccc8CC14x2y2E", // class name
  bases__ZN3ccc8CC14x2y2E, 2,
  &(vtc__ZN3ccc8CC14x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y3  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC14x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x2y33abcEv
  ~CC14x2y3(); // tgen
  CC14x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y3E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y33efgEv");}
void  ccc::CC14x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y33pqrEv");}
void  ccc::CC14x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y33abcEv");}
ccc::CC14x2y3 ::~CC14x2y3(){ note_dtor("_ZN3ccc8CC14x2y3E", this);} // tgen
ccc::CC14x2y3 ::CC14x2y3(){ note_ctor("_ZN3ccc8CC14x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y3E, buf);
    ::ccc::CC14x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y3E);
    dp->::ccc::CC14x2y3::~CC14x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y3E(Test__ZN3ccc8CC14x2y3E, "_ZN3ccc8CC14x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y3C1Ev();
extern void _ZN3ccc8CC14x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y3E[] = {
  NSPAIR(_ZN3ccc8CC14x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y3E[];
extern void _ZN3ccc8CC14x2y33pqrEv();
extern void _ZN3ccc8CC14x2y33efgEv();
extern void _ZN3ccc8CC14x2y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y33efgEv,_ZThn4_N3ccc8CC14x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y33abcEv,_ZThn4_N3ccc8CC14x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y33pqrEv,_ZThn4_N3ccc8CC14x2y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y33efgEv,_ZThn4_N3ccc8CC14x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y33abcEv,_ZThn4_N3ccc8CC14x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y33pqrEv,_ZThn4_N3ccc8CC14x2y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y3E[];
Class_Descriptor cd__ZN3ccc8CC14x2y3E = {  "_ZN3ccc8CC14x2y3E", // class name
  bases__ZN3ccc8CC14x2y3E, 2,
  &(vtc__ZN3ccc8CC14x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y4  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC14x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x2y43efgEv
  ~CC14x2y4(); // tgen
  CC14x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y4E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y43pqrEv");}
void  ccc::CC14x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y43abcEv");}
void  ccc::CC14x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y43efgEv");}
ccc::CC14x2y4 ::~CC14x2y4(){ note_dtor("_ZN3ccc8CC14x2y4E", this);} // tgen
ccc::CC14x2y4 ::CC14x2y4(){ note_ctor("_ZN3ccc8CC14x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y4E, buf);
    ::ccc::CC14x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y4E);
    dp->::ccc::CC14x2y4::~CC14x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y4E(Test__ZN3ccc8CC14x2y4E, "_ZN3ccc8CC14x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y4C1Ev();
extern void _ZN3ccc8CC14x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y4E[] = {
  NSPAIR(_ZN3ccc8CC14x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y4E[];
extern void _ZN3ccc8CC14x2y43pqrEv();
extern void _ZN3ccc8CC14x2y43abcEv();
extern void _ZN3ccc8CC14x2y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y43efgEv,_ZThn4_N3ccc8CC14x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y43abcEv,_ZThn4_N3ccc8CC14x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y43pqrEv,_ZThn4_N3ccc8CC14x2y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y43efgEv,_ZThn4_N3ccc8CC14x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y43abcEv,_ZThn4_N3ccc8CC14x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y43pqrEv,_ZThn4_N3ccc8CC14x2y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y4E[];
Class_Descriptor cd__ZN3ccc8CC14x2y4E = {  "_ZN3ccc8CC14x2y4E", // class name
  bases__ZN3ccc8CC14x2y4E, 2,
  &(vtc__ZN3ccc8CC14x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y5  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC14x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x2y53abcEv
  ~CC14x2y5(); // tgen
  CC14x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y5E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y53pqrEv");}
void  ccc::CC14x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y53efgEv");}
void  ccc::CC14x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y53abcEv");}
ccc::CC14x2y5 ::~CC14x2y5(){ note_dtor("_ZN3ccc8CC14x2y5E", this);} // tgen
ccc::CC14x2y5 ::CC14x2y5(){ note_ctor("_ZN3ccc8CC14x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y5E, buf);
    ::ccc::CC14x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y5E);
    dp->::ccc::CC14x2y5::~CC14x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y5E(Test__ZN3ccc8CC14x2y5E, "_ZN3ccc8CC14x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y5C1Ev();
extern void _ZN3ccc8CC14x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y5E[] = {
  NSPAIR(_ZN3ccc8CC14x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y5E[];
extern void _ZN3ccc8CC14x2y53pqrEv();
extern void _ZN3ccc8CC14x2y53efgEv();
extern void _ZN3ccc8CC14x2y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y53efgEv,_ZThn4_N3ccc8CC14x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y53abcEv,_ZThn4_N3ccc8CC14x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y53pqrEv,_ZThn4_N3ccc8CC14x2y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y53efgEv,_ZThn4_N3ccc8CC14x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y53abcEv,_ZThn4_N3ccc8CC14x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y53pqrEv,_ZThn4_N3ccc8CC14x2y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y5E[];
Class_Descriptor cd__ZN3ccc8CC14x2y5E = {  "_ZN3ccc8CC14x2y5E", // class name
  bases__ZN3ccc8CC14x2y5E, 2,
  &(vtc__ZN3ccc8CC14x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y6  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC14x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x2y63efgEv
  ~CC14x2y6(); // tgen
  CC14x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y6E) C1{ BC2{ v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y63abcEv");}
void  ccc::CC14x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y63efgEv");}
ccc::CC14x2y6 ::~CC14x2y6(){ note_dtor("_ZN3ccc8CC14x2y6E", this);} // tgen
ccc::CC14x2y6 ::CC14x2y6(){ note_ctor("_ZN3ccc8CC14x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y6E, buf);
    ::ccc::CC14x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y6E);
    dp->::ccc::CC14x2y6::~CC14x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y6E(Test__ZN3ccc8CC14x2y6E, "_ZN3ccc8CC14x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y6C1Ev();
extern void _ZN3ccc8CC14x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y6E[] = {
  NSPAIR(_ZN3ccc8CC14x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x2y63abcEv();
extern void _ZN3ccc8CC14x2y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y63efgEv,_ZThn4_N3ccc8CC14x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y63abcEv,_ZThn4_N3ccc8CC14x2y63abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y63efgEv,_ZThn4_N3ccc8CC14x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y63abcEv,_ZThn4_N3ccc8CC14x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y6E[];
Class_Descriptor cd__ZN3ccc8CC14x2y6E = {  "_ZN3ccc8CC14x2y6E", // class name
  bases__ZN3ccc8CC14x2y6E, 2,
  &(vtc__ZN3ccc8CC14x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y7  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC14x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y73pqrEv
  ~CC14x2y7(); // tgen
  CC14x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y7E) C1{ BC2{ v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y73abcEv");}
void  ccc::CC14x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y73pqrEv");}
ccc::CC14x2y7 ::~CC14x2y7(){ note_dtor("_ZN3ccc8CC14x2y7E", this);} // tgen
ccc::CC14x2y7 ::CC14x2y7(){ note_ctor("_ZN3ccc8CC14x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y7E, buf);
    ::ccc::CC14x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y7E);
    dp->::ccc::CC14x2y7::~CC14x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y7E(Test__ZN3ccc8CC14x2y7E, "_ZN3ccc8CC14x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y7C1Ev();
extern void _ZN3ccc8CC14x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y7E[] = {
  NSPAIR(_ZN3ccc8CC14x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y7E[];
extern void _ZN3ccc8CC14x2y73pqrEv();
extern void _ZN3ccc8CC14x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y73abcEv,_ZThn4_N3ccc8CC14x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y73pqrEv,_ZThn4_N3ccc8CC14x2y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y73abcEv,_ZThn4_N3ccc8CC14x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y73pqrEv,_ZThn4_N3ccc8CC14x2y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y7E[];
Class_Descriptor cd__ZN3ccc8CC14x2y7E = {  "_ZN3ccc8CC14x2y7E", // class name
  bases__ZN3ccc8CC14x2y7E, 2,
  &(vtc__ZN3ccc8CC14x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y8  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC14x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x2y83abcEv
  ~CC14x2y8(); // tgen
  CC14x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y8E) C1{ BC2{ v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y83efgEv");}
void  ccc::CC14x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x2y83abcEv");}
ccc::CC14x2y8 ::~CC14x2y8(){ note_dtor("_ZN3ccc8CC14x2y8E", this);} // tgen
ccc::CC14x2y8 ::CC14x2y8(){ note_ctor("_ZN3ccc8CC14x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y8E, buf);
    ::ccc::CC14x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y8E);
    dp->::ccc::CC14x2y8::~CC14x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y8E(Test__ZN3ccc8CC14x2y8E, "_ZN3ccc8CC14x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y8C1Ev();
extern void _ZN3ccc8CC14x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y8E[] = {
  NSPAIR(_ZN3ccc8CC14x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x2y83efgEv();
extern void _ZN3ccc8CC14x2y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y83efgEv,_ZThn4_N3ccc8CC14x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y83abcEv,_ZThn4_N3ccc8CC14x2y83abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y83efgEv,_ZThn4_N3ccc8CC14x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y83abcEv,_ZThn4_N3ccc8CC14x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y8E[];
Class_Descriptor cd__ZN3ccc8CC14x2y8E = {  "_ZN3ccc8CC14x2y8E", // class name
  bases__ZN3ccc8CC14x2y8E, 2,
  &(vtc__ZN3ccc8CC14x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y9  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC14x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x2y93pqrEv
  ~CC14x2y9(); // tgen
  CC14x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x2y9E) C1{ BC2{ v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x2y93efgEv");}
void  ccc::CC14x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x2y93pqrEv");}
ccc::CC14x2y9 ::~CC14x2y9(){ note_dtor("_ZN3ccc8CC14x2y9E", this);} // tgen
ccc::CC14x2y9 ::CC14x2y9(){ note_ctor("_ZN3ccc8CC14x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x2y9E, buf);
    ::ccc::CC14x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x2y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8CC14x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x2y9E);
    dp->::ccc::CC14x2y9::~CC14x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x2y9E(Test__ZN3ccc8CC14x2y9E, "_ZN3ccc8CC14x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x2y9C1Ev();
extern void _ZN3ccc8CC14x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x2y9E[] = {
  NSPAIR(_ZN3ccc8CC14x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC14x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y9E[];
extern void _ZN3ccc8CC14x2y93pqrEv();
extern void _ZN3ccc8CC14x2y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y93efgEv,_ZThn4_N3ccc8CC14x2y93efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x2y93pqrEv,_ZThn4_N3ccc8CC14x2y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x2y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y93efgEv,_ZThn4_N3ccc8CC14x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x2y93pqrEv,_ZThn4_N3ccc8CC14x2y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x2y9E[];
Class_Descriptor cd__ZN3ccc8CC14x2y9E = {  "_ZN3ccc8CC14x2y9E", // class name
  bases__ZN3ccc8CC14x2y9E, 2,
  &(vtc__ZN3ccc8CC14x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x2y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y10  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC14x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x2y103abcEv
  ~CC14x2y10(); // tgen
  CC14x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y10E) C1{ BC2{ v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x2y103pqrEv");}
void  ccc::CC14x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x2y103abcEv");}
ccc::CC14x2y10 ::~CC14x2y10(){ note_dtor("_ZN3ccc9CC14x2y10E", this);} // tgen
ccc::CC14x2y10 ::CC14x2y10(){ note_ctor("_ZN3ccc9CC14x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y10E, buf);
    ::ccc::CC14x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y10E);
    dp->::ccc::CC14x2y10::~CC14x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y10E(Test__ZN3ccc9CC14x2y10E, "_ZN3ccc9CC14x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y10C1Ev();
extern void _ZN3ccc9CC14x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y10E[] = {
  NSPAIR(_ZN3ccc9CC14x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y10E[];
extern void _ZN3ccc9CC14x2y103pqrEv();
extern void _ZN3ccc9CC14x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y103abcEv,_ZThn4_N3ccc9CC14x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y103pqrEv,_ZThn4_N3ccc9CC14x2y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y103abcEv,_ZThn4_N3ccc9CC14x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y103pqrEv,_ZThn4_N3ccc9CC14x2y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y10E[];
Class_Descriptor cd__ZN3ccc9CC14x2y10E = {  "_ZN3ccc9CC14x2y10E", // class name
  bases__ZN3ccc9CC14x2y10E, 2,
  &(vtc__ZN3ccc9CC14x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y11  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC14x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x2y113efgEv
  ~CC14x2y11(); // tgen
  CC14x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y11E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x2y113pqrEv");}
void  ccc::CC14x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x2y113efgEv");}
ccc::CC14x2y11 ::~CC14x2y11(){ note_dtor("_ZN3ccc9CC14x2y11E", this);} // tgen
ccc::CC14x2y11 ::CC14x2y11(){ note_ctor("_ZN3ccc9CC14x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y11E, buf);
    ::ccc::CC14x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y11E);
    dp->::ccc::CC14x2y11::~CC14x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y11E(Test__ZN3ccc9CC14x2y11E, "_ZN3ccc9CC14x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y11C1Ev();
extern void _ZN3ccc9CC14x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y11E[] = {
  NSPAIR(_ZN3ccc9CC14x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y11E[];
extern void _ZN3ccc9CC14x2y113pqrEv();
extern void _ZN3ccc9CC14x2y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y113efgEv,_ZThn4_N3ccc9CC14x2y113efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y113pqrEv,_ZThn4_N3ccc9CC14x2y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y113efgEv,_ZThn4_N3ccc9CC14x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y113pqrEv,_ZThn4_N3ccc9CC14x2y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y11E[];
Class_Descriptor cd__ZN3ccc9CC14x2y11E = {  "_ZN3ccc9CC14x2y11E", // class name
  bases__ZN3ccc9CC14x2y11E, 2,
  &(vtc__ZN3ccc9CC14x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y12  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC14x2y123abcEv
  ~CC14x2y12(); // tgen
  CC14x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y12E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC14x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x2y123abcEv");}
ccc::CC14x2y12 ::~CC14x2y12(){ note_dtor("_ZN3ccc9CC14x2y12E", this);} // tgen
ccc::CC14x2y12 ::CC14x2y12(){ note_ctor("_ZN3ccc9CC14x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y12E, buf);
    ::ccc::CC14x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y12E);
    dp->::ccc::CC14x2y12::~CC14x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y12E(Test__ZN3ccc9CC14x2y12E, "_ZN3ccc9CC14x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y12C1Ev();
extern void _ZN3ccc9CC14x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y12E[] = {
  NSPAIR(_ZN3ccc9CC14x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y123abcEv,_ZThn4_N3ccc9CC14x2y123abcEv)();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y123abcEv,_ZThn4_N3ccc9CC14x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y12E[];
Class_Descriptor cd__ZN3ccc9CC14x2y12E = {  "_ZN3ccc9CC14x2y12E", // class name
  bases__ZN3ccc9CC14x2y12E, 2,
  &(vtc__ZN3ccc9CC14x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y13  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC14x2y133efgEv
  ~CC14x2y13(); // tgen
  CC14x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y13E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x2y133efgEv");}
ccc::CC14x2y13 ::~CC14x2y13(){ note_dtor("_ZN3ccc9CC14x2y13E", this);} // tgen
ccc::CC14x2y13 ::CC14x2y13(){ note_ctor("_ZN3ccc9CC14x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y13E, buf);
    ::ccc::CC14x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y13E);
    dp->::ccc::CC14x2y13::~CC14x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y13E(Test__ZN3ccc9CC14x2y13E, "_ZN3ccc9CC14x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y13C1Ev();
extern void _ZN3ccc9CC14x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y13E[] = {
  NSPAIR(_ZN3ccc9CC14x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x2y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y133efgEv,_ZThn4_N3ccc9CC14x2y133efgEv)();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y133efgEv,_ZThn4_N3ccc9CC14x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y13E[];
Class_Descriptor cd__ZN3ccc9CC14x2y13E = {  "_ZN3ccc9CC14x2y13E", // class name
  bases__ZN3ccc9CC14x2y13E, 2,
  &(vtc__ZN3ccc9CC14x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y14  : ::ccc::AA14 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC14x2y143pqrEv
  ~CC14x2y14(); // tgen
  CC14x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y14E) C1{ BC2{ v1} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x2y143pqrEv");}
ccc::CC14x2y14 ::~CC14x2y14(){ note_dtor("_ZN3ccc9CC14x2y14E", this);} // tgen
ccc::CC14x2y14 ::CC14x2y14(){ note_ctor("_ZN3ccc9CC14x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y14E, buf);
    ::ccc::CC14x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y14E);
    dp->::ccc::CC14x2y14::~CC14x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y14E(Test__ZN3ccc9CC14x2y14E, "_ZN3ccc9CC14x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y14C1Ev();
extern void _ZN3ccc9CC14x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y14E[] = {
  NSPAIR(_ZN3ccc9CC14x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y14E[];
extern void _ZN3ccc9CC14x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x2y143pqrEv,_ZThn4_N3ccc9CC14x2y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x2y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x2y143pqrEv,_ZThn4_N3ccc9CC14x2y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y14E[];
Class_Descriptor cd__ZN3ccc9CC14x2y14E = {  "_ZN3ccc9CC14x2y14E", // class name
  bases__ZN3ccc9CC14x2y14E, 2,
  &(vtc__ZN3ccc9CC14x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x2y15  : ::ccc::AA14 , ::ccc::BB2 {
  ~CC14x2y15(); // tgen
  CC14x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x2y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x2y15 ::~CC14x2y15(){ note_dtor("_ZN3ccc9CC14x2y15E", this);} // tgen
ccc::CC14x2y15 ::CC14x2y15(){ note_ctor("_ZN3ccc9CC14x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x2y15E, buf);
    ::ccc::CC14x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x2y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9CC14x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x2y15E);
    dp->::ccc::CC14x2y15::~CC14x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x2y15E(Test__ZN3ccc9CC14x2y15E, "_ZN3ccc9CC14x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x2y15C1Ev();
extern void _ZN3ccc9CC14x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x2y15E[] = {
  NSPAIR(_ZN3ccc9CC14x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC14x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x2y15E[];
Class_Descriptor cd__ZN3ccc9CC14x2y15E = {  "_ZN3ccc9CC14x2y15E", // class name
  bases__ZN3ccc9CC14x2y15E, 2,
  &(vtc__ZN3ccc9CC14x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x2y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y0  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC14x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y03pqrEv
  ~CC14x3y0(); // tgen
  CC14x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y0E) C1{ BC2{ v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y03abcEv");}
void  ccc::CC14x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y03efgEv");}
void  ccc::CC14x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y03pqrEv");}
ccc::CC14x3y0 ::~CC14x3y0(){ note_dtor("_ZN3ccc8CC14x3y0E", this);} // tgen
ccc::CC14x3y0 ::CC14x3y0(){ note_ctor("_ZN3ccc8CC14x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y0E, buf);
    ::ccc::CC14x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y0E);
    dp->::ccc::CC14x3y0::~CC14x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y0E(Test__ZN3ccc8CC14x3y0E, "_ZN3ccc8CC14x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y0C1Ev();
extern void _ZN3ccc8CC14x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y0E[] = {
  NSPAIR(_ZN3ccc8CC14x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y0E[];
extern void _ZN3ccc8CC14x3y03pqrEv();
extern void _ZN3ccc8CC14x3y03abcEv();
extern void _ZN3ccc8CC14x3y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y03efgEv,_ZThn4_N3ccc8CC14x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y03pqrEv,_ZThn4_N3ccc8CC14x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y03abcEv,_ZThn4_N3ccc8CC14x3y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y03efgEv,_ZThn4_N3ccc8CC14x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y03pqrEv,_ZThn4_N3ccc8CC14x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y03abcEv,_ZThn4_N3ccc8CC14x3y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y0E[];
Class_Descriptor cd__ZN3ccc8CC14x3y0E = {  "_ZN3ccc8CC14x3y0E", // class name
  bases__ZN3ccc8CC14x3y0E, 2,
  &(vtc__ZN3ccc8CC14x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y1  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC14x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x3y13efgEv
  ~CC14x3y1(); // tgen
  CC14x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y1E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y13abcEv");}
void  ccc::CC14x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y13pqrEv");}
void  ccc::CC14x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y13efgEv");}
ccc::CC14x3y1 ::~CC14x3y1(){ note_dtor("_ZN3ccc8CC14x3y1E", this);} // tgen
ccc::CC14x3y1 ::CC14x3y1(){ note_ctor("_ZN3ccc8CC14x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y1E, buf);
    ::ccc::CC14x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y1E);
    dp->::ccc::CC14x3y1::~CC14x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y1E(Test__ZN3ccc8CC14x3y1E, "_ZN3ccc8CC14x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y1C1Ev();
extern void _ZN3ccc8CC14x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y1E[] = {
  NSPAIR(_ZN3ccc8CC14x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y1E[];
extern void _ZN3ccc8CC14x3y13pqrEv();
extern void _ZN3ccc8CC14x3y13abcEv();
extern void _ZN3ccc8CC14x3y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y13efgEv,_ZThn4_N3ccc8CC14x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y13pqrEv,_ZThn4_N3ccc8CC14x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y13abcEv,_ZThn4_N3ccc8CC14x3y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y13efgEv,_ZThn4_N3ccc8CC14x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y13pqrEv,_ZThn4_N3ccc8CC14x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y13abcEv,_ZThn4_N3ccc8CC14x3y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y1E[];
Class_Descriptor cd__ZN3ccc8CC14x3y1E = {  "_ZN3ccc8CC14x3y1E", // class name
  bases__ZN3ccc8CC14x3y1E, 2,
  &(vtc__ZN3ccc8CC14x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y2  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC14x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y23pqrEv
  ~CC14x3y2(); // tgen
  CC14x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y2E) C1{ BC2{ v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y23efgEv");}
void  ccc::CC14x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y23abcEv");}
void  ccc::CC14x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y23pqrEv");}
ccc::CC14x3y2 ::~CC14x3y2(){ note_dtor("_ZN3ccc8CC14x3y2E", this);} // tgen
ccc::CC14x3y2 ::CC14x3y2(){ note_ctor("_ZN3ccc8CC14x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y2E, buf);
    ::ccc::CC14x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y2E);
    dp->::ccc::CC14x3y2::~CC14x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y2E(Test__ZN3ccc8CC14x3y2E, "_ZN3ccc8CC14x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y2C1Ev();
extern void _ZN3ccc8CC14x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y2E[] = {
  NSPAIR(_ZN3ccc8CC14x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y2E[];
extern void _ZN3ccc8CC14x3y23pqrEv();
extern void _ZN3ccc8CC14x3y23efgEv();
extern void _ZN3ccc8CC14x3y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y23efgEv,_ZThn4_N3ccc8CC14x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y23pqrEv,_ZThn4_N3ccc8CC14x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y23abcEv,_ZThn4_N3ccc8CC14x3y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y23efgEv,_ZThn4_N3ccc8CC14x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y23pqrEv,_ZThn4_N3ccc8CC14x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y23abcEv,_ZThn4_N3ccc8CC14x3y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y2E[];
Class_Descriptor cd__ZN3ccc8CC14x3y2E = {  "_ZN3ccc8CC14x3y2E", // class name
  bases__ZN3ccc8CC14x3y2E, 2,
  &(vtc__ZN3ccc8CC14x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y3  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC14x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x3y33abcEv
  ~CC14x3y3(); // tgen
  CC14x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y3E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y33efgEv");}
void  ccc::CC14x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y33pqrEv");}
void  ccc::CC14x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y33abcEv");}
ccc::CC14x3y3 ::~CC14x3y3(){ note_dtor("_ZN3ccc8CC14x3y3E", this);} // tgen
ccc::CC14x3y3 ::CC14x3y3(){ note_ctor("_ZN3ccc8CC14x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y3E, buf);
    ::ccc::CC14x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y3E);
    dp->::ccc::CC14x3y3::~CC14x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y3E(Test__ZN3ccc8CC14x3y3E, "_ZN3ccc8CC14x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y3C1Ev();
extern void _ZN3ccc8CC14x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y3E[] = {
  NSPAIR(_ZN3ccc8CC14x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y3E[];
extern void _ZN3ccc8CC14x3y33pqrEv();
extern void _ZN3ccc8CC14x3y33efgEv();
extern void _ZN3ccc8CC14x3y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y33efgEv,_ZThn4_N3ccc8CC14x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y33pqrEv,_ZThn4_N3ccc8CC14x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y33abcEv,_ZThn4_N3ccc8CC14x3y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y33efgEv,_ZThn4_N3ccc8CC14x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y33pqrEv,_ZThn4_N3ccc8CC14x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y33abcEv,_ZThn4_N3ccc8CC14x3y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y3E[];
Class_Descriptor cd__ZN3ccc8CC14x3y3E = {  "_ZN3ccc8CC14x3y3E", // class name
  bases__ZN3ccc8CC14x3y3E, 2,
  &(vtc__ZN3ccc8CC14x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y4  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC14x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x3y43efgEv
  ~CC14x3y4(); // tgen
  CC14x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y4E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y43pqrEv");}
void  ccc::CC14x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y43abcEv");}
void  ccc::CC14x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y43efgEv");}
ccc::CC14x3y4 ::~CC14x3y4(){ note_dtor("_ZN3ccc8CC14x3y4E", this);} // tgen
ccc::CC14x3y4 ::CC14x3y4(){ note_ctor("_ZN3ccc8CC14x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y4E, buf);
    ::ccc::CC14x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y4E);
    dp->::ccc::CC14x3y4::~CC14x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y4E(Test__ZN3ccc8CC14x3y4E, "_ZN3ccc8CC14x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y4C1Ev();
extern void _ZN3ccc8CC14x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y4E[] = {
  NSPAIR(_ZN3ccc8CC14x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y4E[];
extern void _ZN3ccc8CC14x3y43pqrEv();
extern void _ZN3ccc8CC14x3y43abcEv();
extern void _ZN3ccc8CC14x3y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y43efgEv,_ZThn4_N3ccc8CC14x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y43pqrEv,_ZThn4_N3ccc8CC14x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y43abcEv,_ZThn4_N3ccc8CC14x3y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y43efgEv,_ZThn4_N3ccc8CC14x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y43pqrEv,_ZThn4_N3ccc8CC14x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y43abcEv,_ZThn4_N3ccc8CC14x3y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y4E[];
Class_Descriptor cd__ZN3ccc8CC14x3y4E = {  "_ZN3ccc8CC14x3y4E", // class name
  bases__ZN3ccc8CC14x3y4E, 2,
  &(vtc__ZN3ccc8CC14x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y5  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC14x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x3y53abcEv
  ~CC14x3y5(); // tgen
  CC14x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y5E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y53pqrEv");}
void  ccc::CC14x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y53efgEv");}
void  ccc::CC14x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y53abcEv");}
ccc::CC14x3y5 ::~CC14x3y5(){ note_dtor("_ZN3ccc8CC14x3y5E", this);} // tgen
ccc::CC14x3y5 ::CC14x3y5(){ note_ctor("_ZN3ccc8CC14x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y5E, buf);
    ::ccc::CC14x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y5E);
    dp->::ccc::CC14x3y5::~CC14x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y5E(Test__ZN3ccc8CC14x3y5E, "_ZN3ccc8CC14x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y5C1Ev();
extern void _ZN3ccc8CC14x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y5E[] = {
  NSPAIR(_ZN3ccc8CC14x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y5E[];
extern void _ZN3ccc8CC14x3y53pqrEv();
extern void _ZN3ccc8CC14x3y53efgEv();
extern void _ZN3ccc8CC14x3y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y53efgEv,_ZThn4_N3ccc8CC14x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y53pqrEv,_ZThn4_N3ccc8CC14x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y53abcEv,_ZThn4_N3ccc8CC14x3y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y53efgEv,_ZThn4_N3ccc8CC14x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y53pqrEv,_ZThn4_N3ccc8CC14x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y53abcEv,_ZThn4_N3ccc8CC14x3y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y5E[];
Class_Descriptor cd__ZN3ccc8CC14x3y5E = {  "_ZN3ccc8CC14x3y5E", // class name
  bases__ZN3ccc8CC14x3y5E, 2,
  &(vtc__ZN3ccc8CC14x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y6  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC14x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x3y63efgEv
  ~CC14x3y6(); // tgen
  CC14x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y6E) C1{ BC2{ v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y63abcEv");}
void  ccc::CC14x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y63efgEv");}
ccc::CC14x3y6 ::~CC14x3y6(){ note_dtor("_ZN3ccc8CC14x3y6E", this);} // tgen
ccc::CC14x3y6 ::CC14x3y6(){ note_ctor("_ZN3ccc8CC14x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y6E, buf);
    ::ccc::CC14x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y6E);
    dp->::ccc::CC14x3y6::~CC14x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y6E(Test__ZN3ccc8CC14x3y6E, "_ZN3ccc8CC14x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y6C1Ev();
extern void _ZN3ccc8CC14x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y6E[] = {
  NSPAIR(_ZN3ccc8CC14x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x3y63abcEv();
extern void _ZN3ccc8CC14x3y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y63efgEv,_ZThn4_N3ccc8CC14x3y63efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y63abcEv,_ZThn4_N3ccc8CC14x3y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y63efgEv,_ZThn4_N3ccc8CC14x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y63abcEv,_ZThn4_N3ccc8CC14x3y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y6E[];
Class_Descriptor cd__ZN3ccc8CC14x3y6E = {  "_ZN3ccc8CC14x3y6E", // class name
  bases__ZN3ccc8CC14x3y6E, 2,
  &(vtc__ZN3ccc8CC14x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y7  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC14x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y73pqrEv
  ~CC14x3y7(); // tgen
  CC14x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y7E) C1{ BC2{ v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y73abcEv");}
void  ccc::CC14x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y73pqrEv");}
ccc::CC14x3y7 ::~CC14x3y7(){ note_dtor("_ZN3ccc8CC14x3y7E", this);} // tgen
ccc::CC14x3y7 ::CC14x3y7(){ note_ctor("_ZN3ccc8CC14x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y7E, buf);
    ::ccc::CC14x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y7E);
    dp->::ccc::CC14x3y7::~CC14x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y7E(Test__ZN3ccc8CC14x3y7E, "_ZN3ccc8CC14x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y7C1Ev();
extern void _ZN3ccc8CC14x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y7E[] = {
  NSPAIR(_ZN3ccc8CC14x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y7E[];
extern void _ZN3ccc8CC14x3y73pqrEv();
extern void _ZN3ccc8CC14x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y73pqrEv,_ZThn4_N3ccc8CC14x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y73abcEv,_ZThn4_N3ccc8CC14x3y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y73pqrEv,_ZThn4_N3ccc8CC14x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y73abcEv,_ZThn4_N3ccc8CC14x3y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y7E[];
Class_Descriptor cd__ZN3ccc8CC14x3y7E = {  "_ZN3ccc8CC14x3y7E", // class name
  bases__ZN3ccc8CC14x3y7E, 2,
  &(vtc__ZN3ccc8CC14x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y8  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC14x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x3y83abcEv
  ~CC14x3y8(); // tgen
  CC14x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y8E) C1{ BC2{ v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y83efgEv");}
void  ccc::CC14x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x3y83abcEv");}
ccc::CC14x3y8 ::~CC14x3y8(){ note_dtor("_ZN3ccc8CC14x3y8E", this);} // tgen
ccc::CC14x3y8 ::CC14x3y8(){ note_ctor("_ZN3ccc8CC14x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y8E, buf);
    ::ccc::CC14x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y8E);
    dp->::ccc::CC14x3y8::~CC14x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y8E(Test__ZN3ccc8CC14x3y8E, "_ZN3ccc8CC14x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y8C1Ev();
extern void _ZN3ccc8CC14x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y8E[] = {
  NSPAIR(_ZN3ccc8CC14x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x3y83efgEv();
extern void _ZN3ccc8CC14x3y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y83efgEv,_ZThn4_N3ccc8CC14x3y83efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y83abcEv,_ZThn4_N3ccc8CC14x3y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y83efgEv,_ZThn4_N3ccc8CC14x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y83abcEv,_ZThn4_N3ccc8CC14x3y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y8E[];
Class_Descriptor cd__ZN3ccc8CC14x3y8E = {  "_ZN3ccc8CC14x3y8E", // class name
  bases__ZN3ccc8CC14x3y8E, 2,
  &(vtc__ZN3ccc8CC14x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y9  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC14x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x3y93pqrEv
  ~CC14x3y9(); // tgen
  CC14x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x3y9E) C1{ BC2{ v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x3y93efgEv");}
void  ccc::CC14x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x3y93pqrEv");}
ccc::CC14x3y9 ::~CC14x3y9(){ note_dtor("_ZN3ccc8CC14x3y9E", this);} // tgen
ccc::CC14x3y9 ::CC14x3y9(){ note_ctor("_ZN3ccc8CC14x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x3y9E, buf);
    ::ccc::CC14x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x3y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8CC14x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x3y9E);
    dp->::ccc::CC14x3y9::~CC14x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x3y9E(Test__ZN3ccc8CC14x3y9E, "_ZN3ccc8CC14x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x3y9C1Ev();
extern void _ZN3ccc8CC14x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x3y9E[] = {
  NSPAIR(_ZN3ccc8CC14x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC14x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y9E[];
extern void _ZN3ccc8CC14x3y93pqrEv();
extern void _ZN3ccc8CC14x3y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y93efgEv,_ZThn4_N3ccc8CC14x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x3y93pqrEv,_ZThn4_N3ccc8CC14x3y93pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x3y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y93efgEv,_ZThn4_N3ccc8CC14x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x3y93pqrEv,_ZThn4_N3ccc8CC14x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x3y9E[];
Class_Descriptor cd__ZN3ccc8CC14x3y9E = {  "_ZN3ccc8CC14x3y9E", // class name
  bases__ZN3ccc8CC14x3y9E, 2,
  &(vtc__ZN3ccc8CC14x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x3y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y10  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC14x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x3y103abcEv
  ~CC14x3y10(); // tgen
  CC14x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y10E) C1{ BC2{ v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x3y103pqrEv");}
void  ccc::CC14x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x3y103abcEv");}
ccc::CC14x3y10 ::~CC14x3y10(){ note_dtor("_ZN3ccc9CC14x3y10E", this);} // tgen
ccc::CC14x3y10 ::CC14x3y10(){ note_ctor("_ZN3ccc9CC14x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y10E, buf);
    ::ccc::CC14x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y10E);
    dp->::ccc::CC14x3y10::~CC14x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y10E(Test__ZN3ccc9CC14x3y10E, "_ZN3ccc9CC14x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y10C1Ev();
extern void _ZN3ccc9CC14x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y10E[] = {
  NSPAIR(_ZN3ccc9CC14x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y10E[];
extern void _ZN3ccc9CC14x3y103pqrEv();
extern void _ZN3ccc9CC14x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y103pqrEv,_ZThn4_N3ccc9CC14x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y103abcEv,_ZThn4_N3ccc9CC14x3y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y103pqrEv,_ZThn4_N3ccc9CC14x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y103abcEv,_ZThn4_N3ccc9CC14x3y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y10E[];
Class_Descriptor cd__ZN3ccc9CC14x3y10E = {  "_ZN3ccc9CC14x3y10E", // class name
  bases__ZN3ccc9CC14x3y10E, 2,
  &(vtc__ZN3ccc9CC14x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y11  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC14x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x3y113efgEv
  ~CC14x3y11(); // tgen
  CC14x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y11E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x3y113pqrEv");}
void  ccc::CC14x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x3y113efgEv");}
ccc::CC14x3y11 ::~CC14x3y11(){ note_dtor("_ZN3ccc9CC14x3y11E", this);} // tgen
ccc::CC14x3y11 ::CC14x3y11(){ note_ctor("_ZN3ccc9CC14x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y11E, buf);
    ::ccc::CC14x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y11E);
    dp->::ccc::CC14x3y11::~CC14x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y11E(Test__ZN3ccc9CC14x3y11E, "_ZN3ccc9CC14x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y11C1Ev();
extern void _ZN3ccc9CC14x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y11E[] = {
  NSPAIR(_ZN3ccc9CC14x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y11E[];
extern void _ZN3ccc9CC14x3y113pqrEv();
extern void _ZN3ccc9CC14x3y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y113efgEv,_ZThn4_N3ccc9CC14x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y113pqrEv,_ZThn4_N3ccc9CC14x3y113pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y113efgEv,_ZThn4_N3ccc9CC14x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y113pqrEv,_ZThn4_N3ccc9CC14x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y11E[];
Class_Descriptor cd__ZN3ccc9CC14x3y11E = {  "_ZN3ccc9CC14x3y11E", // class name
  bases__ZN3ccc9CC14x3y11E, 2,
  &(vtc__ZN3ccc9CC14x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y12  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC14x3y123abcEv
  ~CC14x3y12(); // tgen
  CC14x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y12E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC14x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x3y123abcEv");}
ccc::CC14x3y12 ::~CC14x3y12(){ note_dtor("_ZN3ccc9CC14x3y12E", this);} // tgen
ccc::CC14x3y12 ::CC14x3y12(){ note_ctor("_ZN3ccc9CC14x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y12E, buf);
    ::ccc::CC14x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y12E);
    dp->::ccc::CC14x3y12::~CC14x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y12E(Test__ZN3ccc9CC14x3y12E, "_ZN3ccc9CC14x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y12C1Ev();
extern void _ZN3ccc9CC14x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y12E[] = {
  NSPAIR(_ZN3ccc9CC14x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y123abcEv,_ZThn4_N3ccc9CC14x3y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y123abcEv,_ZThn4_N3ccc9CC14x3y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y12E[];
Class_Descriptor cd__ZN3ccc9CC14x3y12E = {  "_ZN3ccc9CC14x3y12E", // class name
  bases__ZN3ccc9CC14x3y12E, 2,
  &(vtc__ZN3ccc9CC14x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y13  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC14x3y133efgEv
  ~CC14x3y13(); // tgen
  CC14x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y13E) C1{ BC2{ v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x3y133efgEv");}
ccc::CC14x3y13 ::~CC14x3y13(){ note_dtor("_ZN3ccc9CC14x3y13E", this);} // tgen
ccc::CC14x3y13 ::CC14x3y13(){ note_ctor("_ZN3ccc9CC14x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y13E, buf);
    ::ccc::CC14x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y13E);
    dp->::ccc::CC14x3y13::~CC14x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y13E(Test__ZN3ccc9CC14x3y13E, "_ZN3ccc9CC14x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y13C1Ev();
extern void _ZN3ccc9CC14x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y13E[] = {
  NSPAIR(_ZN3ccc9CC14x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x3y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y133efgEv,_ZThn4_N3ccc9CC14x3y133efgEv)();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y133efgEv,_ZThn4_N3ccc9CC14x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y13E[];
Class_Descriptor cd__ZN3ccc9CC14x3y13E = {  "_ZN3ccc9CC14x3y13E", // class name
  bases__ZN3ccc9CC14x3y13E, 2,
  &(vtc__ZN3ccc9CC14x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y14  : ::ccc::AA14 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC14x3y143pqrEv
  ~CC14x3y14(); // tgen
  CC14x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y14E) C1{ BC2{ v1} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x3y143pqrEv");}
ccc::CC14x3y14 ::~CC14x3y14(){ note_dtor("_ZN3ccc9CC14x3y14E", this);} // tgen
ccc::CC14x3y14 ::CC14x3y14(){ note_ctor("_ZN3ccc9CC14x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y14E, buf);
    ::ccc::CC14x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y14E);
    dp->::ccc::CC14x3y14::~CC14x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y14E(Test__ZN3ccc9CC14x3y14E, "_ZN3ccc9CC14x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y14C1Ev();
extern void _ZN3ccc9CC14x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y14E[] = {
  NSPAIR(_ZN3ccc9CC14x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y14E[];
extern void _ZN3ccc9CC14x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x3y143pqrEv,_ZThn4_N3ccc9CC14x3y143pqrEv)();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x3y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x3y143pqrEv,_ZThn4_N3ccc9CC14x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y14E[];
Class_Descriptor cd__ZN3ccc9CC14x3y14E = {  "_ZN3ccc9CC14x3y14E", // class name
  bases__ZN3ccc9CC14x3y14E, 2,
  &(vtc__ZN3ccc9CC14x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x3y15  : ::ccc::AA14 , ::ccc::BB3 {
  ~CC14x3y15(); // tgen
  CC14x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x3y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x3y15 ::~CC14x3y15(){ note_dtor("_ZN3ccc9CC14x3y15E", this);} // tgen
ccc::CC14x3y15 ::CC14x3y15(){ note_ctor("_ZN3ccc9CC14x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x3y15E, buf);
    ::ccc::CC14x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x3y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9CC14x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x3y15E);
    dp->::ccc::CC14x3y15::~CC14x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x3y15E(Test__ZN3ccc9CC14x3y15E, "_ZN3ccc9CC14x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x3y15C1Ev();
extern void _ZN3ccc9CC14x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x3y15E[] = {
  NSPAIR(_ZN3ccc9CC14x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC14x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x3y15E[];
Class_Descriptor cd__ZN3ccc9CC14x3y15E = {  "_ZN3ccc9CC14x3y15E", // class name
  bases__ZN3ccc9CC14x3y15E, 2,
  &(vtc__ZN3ccc9CC14x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x3y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y0  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC14x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y03pqrEv
  ~CC14x4y0(); // tgen
  CC14x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y0E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y03abcEv");}
void  ccc::CC14x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y03efgEv");}
void  ccc::CC14x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y03pqrEv");}
ccc::CC14x4y0 ::~CC14x4y0(){ note_dtor("_ZN3ccc8CC14x4y0E", this);} // tgen
ccc::CC14x4y0 ::CC14x4y0(){ note_ctor("_ZN3ccc8CC14x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y0E, buf);
    ::ccc::CC14x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y0E);
    dp->::ccc::CC14x4y0::~CC14x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y0E(Test__ZN3ccc8CC14x4y0E, "_ZN3ccc8CC14x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y0C1Ev();
extern void _ZN3ccc8CC14x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y0E[] = {
  NSPAIR(_ZN3ccc8CC14x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y0E[];
extern void _ZN3ccc8CC14x4y03pqrEv();
extern void _ZN3ccc8CC14x4y03abcEv();
extern void _ZN3ccc8CC14x4y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y03pqrEv,_ZThn4_N3ccc8CC14x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y03abcEv,_ZThn4_N3ccc8CC14x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y03efgEv,_ZThn4_N3ccc8CC14x4y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y03pqrEv,_ZThn4_N3ccc8CC14x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y03abcEv,_ZThn4_N3ccc8CC14x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y03efgEv,_ZThn4_N3ccc8CC14x4y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y0E[];
Class_Descriptor cd__ZN3ccc8CC14x4y0E = {  "_ZN3ccc8CC14x4y0E", // class name
  bases__ZN3ccc8CC14x4y0E, 2,
  &(vtc__ZN3ccc8CC14x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y1  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC14x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x4y13efgEv
  ~CC14x4y1(); // tgen
  CC14x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y1E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y13abcEv");}
void  ccc::CC14x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y13pqrEv");}
void  ccc::CC14x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y13efgEv");}
ccc::CC14x4y1 ::~CC14x4y1(){ note_dtor("_ZN3ccc8CC14x4y1E", this);} // tgen
ccc::CC14x4y1 ::CC14x4y1(){ note_ctor("_ZN3ccc8CC14x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y1E, buf);
    ::ccc::CC14x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y1E);
    dp->::ccc::CC14x4y1::~CC14x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y1E(Test__ZN3ccc8CC14x4y1E, "_ZN3ccc8CC14x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y1C1Ev();
extern void _ZN3ccc8CC14x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y1E[] = {
  NSPAIR(_ZN3ccc8CC14x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y1E[];
extern void _ZN3ccc8CC14x4y13pqrEv();
extern void _ZN3ccc8CC14x4y13abcEv();
extern void _ZN3ccc8CC14x4y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y13pqrEv,_ZThn4_N3ccc8CC14x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y13abcEv,_ZThn4_N3ccc8CC14x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y13efgEv,_ZThn4_N3ccc8CC14x4y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y13pqrEv,_ZThn4_N3ccc8CC14x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y13abcEv,_ZThn4_N3ccc8CC14x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y13efgEv,_ZThn4_N3ccc8CC14x4y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y1E[];
Class_Descriptor cd__ZN3ccc8CC14x4y1E = {  "_ZN3ccc8CC14x4y1E", // class name
  bases__ZN3ccc8CC14x4y1E, 2,
  &(vtc__ZN3ccc8CC14x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y2  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC14x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y23pqrEv
  ~CC14x4y2(); // tgen
  CC14x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y2E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y23efgEv");}
void  ccc::CC14x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y23abcEv");}
void  ccc::CC14x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y23pqrEv");}
ccc::CC14x4y2 ::~CC14x4y2(){ note_dtor("_ZN3ccc8CC14x4y2E", this);} // tgen
ccc::CC14x4y2 ::CC14x4y2(){ note_ctor("_ZN3ccc8CC14x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y2E, buf);
    ::ccc::CC14x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y2E);
    dp->::ccc::CC14x4y2::~CC14x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y2E(Test__ZN3ccc8CC14x4y2E, "_ZN3ccc8CC14x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y2C1Ev();
extern void _ZN3ccc8CC14x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y2E[] = {
  NSPAIR(_ZN3ccc8CC14x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y2E[];
extern void _ZN3ccc8CC14x4y23pqrEv();
extern void _ZN3ccc8CC14x4y23efgEv();
extern void _ZN3ccc8CC14x4y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y23pqrEv,_ZThn4_N3ccc8CC14x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y23abcEv,_ZThn4_N3ccc8CC14x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y23efgEv,_ZThn4_N3ccc8CC14x4y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y23pqrEv,_ZThn4_N3ccc8CC14x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y23abcEv,_ZThn4_N3ccc8CC14x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y23efgEv,_ZThn4_N3ccc8CC14x4y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y2E[];
Class_Descriptor cd__ZN3ccc8CC14x4y2E = {  "_ZN3ccc8CC14x4y2E", // class name
  bases__ZN3ccc8CC14x4y2E, 2,
  &(vtc__ZN3ccc8CC14x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y3  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC14x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x4y33abcEv
  ~CC14x4y3(); // tgen
  CC14x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y3E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y33efgEv");}
void  ccc::CC14x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y33pqrEv");}
void  ccc::CC14x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y33abcEv");}
ccc::CC14x4y3 ::~CC14x4y3(){ note_dtor("_ZN3ccc8CC14x4y3E", this);} // tgen
ccc::CC14x4y3 ::CC14x4y3(){ note_ctor("_ZN3ccc8CC14x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y3E, buf);
    ::ccc::CC14x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y3E);
    dp->::ccc::CC14x4y3::~CC14x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y3E(Test__ZN3ccc8CC14x4y3E, "_ZN3ccc8CC14x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y3C1Ev();
extern void _ZN3ccc8CC14x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y3E[] = {
  NSPAIR(_ZN3ccc8CC14x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y3E[];
extern void _ZN3ccc8CC14x4y33pqrEv();
extern void _ZN3ccc8CC14x4y33efgEv();
extern void _ZN3ccc8CC14x4y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y33pqrEv,_ZThn4_N3ccc8CC14x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y33abcEv,_ZThn4_N3ccc8CC14x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y33efgEv,_ZThn4_N3ccc8CC14x4y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y33pqrEv,_ZThn4_N3ccc8CC14x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y33abcEv,_ZThn4_N3ccc8CC14x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y33efgEv,_ZThn4_N3ccc8CC14x4y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y3E[];
Class_Descriptor cd__ZN3ccc8CC14x4y3E = {  "_ZN3ccc8CC14x4y3E", // class name
  bases__ZN3ccc8CC14x4y3E, 2,
  &(vtc__ZN3ccc8CC14x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y4  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC14x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x4y43efgEv
  ~CC14x4y4(); // tgen
  CC14x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y4E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y43pqrEv");}
void  ccc::CC14x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y43abcEv");}
void  ccc::CC14x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y43efgEv");}
ccc::CC14x4y4 ::~CC14x4y4(){ note_dtor("_ZN3ccc8CC14x4y4E", this);} // tgen
ccc::CC14x4y4 ::CC14x4y4(){ note_ctor("_ZN3ccc8CC14x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y4E, buf);
    ::ccc::CC14x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y4E);
    dp->::ccc::CC14x4y4::~CC14x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y4E(Test__ZN3ccc8CC14x4y4E, "_ZN3ccc8CC14x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y4C1Ev();
extern void _ZN3ccc8CC14x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y4E[] = {
  NSPAIR(_ZN3ccc8CC14x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y4E[];
extern void _ZN3ccc8CC14x4y43pqrEv();
extern void _ZN3ccc8CC14x4y43abcEv();
extern void _ZN3ccc8CC14x4y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y43pqrEv,_ZThn4_N3ccc8CC14x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y43abcEv,_ZThn4_N3ccc8CC14x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y43efgEv,_ZThn4_N3ccc8CC14x4y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y43pqrEv,_ZThn4_N3ccc8CC14x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y43abcEv,_ZThn4_N3ccc8CC14x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y43efgEv,_ZThn4_N3ccc8CC14x4y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y4E[];
Class_Descriptor cd__ZN3ccc8CC14x4y4E = {  "_ZN3ccc8CC14x4y4E", // class name
  bases__ZN3ccc8CC14x4y4E, 2,
  &(vtc__ZN3ccc8CC14x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y5  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC14x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x4y53abcEv
  ~CC14x4y5(); // tgen
  CC14x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y5E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y53pqrEv");}
void  ccc::CC14x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y53efgEv");}
void  ccc::CC14x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y53abcEv");}
ccc::CC14x4y5 ::~CC14x4y5(){ note_dtor("_ZN3ccc8CC14x4y5E", this);} // tgen
ccc::CC14x4y5 ::CC14x4y5(){ note_ctor("_ZN3ccc8CC14x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y5E, buf);
    ::ccc::CC14x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y5E);
    dp->::ccc::CC14x4y5::~CC14x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y5E(Test__ZN3ccc8CC14x4y5E, "_ZN3ccc8CC14x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y5C1Ev();
extern void _ZN3ccc8CC14x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y5E[] = {
  NSPAIR(_ZN3ccc8CC14x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y5E[];
extern void _ZN3ccc8CC14x4y53pqrEv();
extern void _ZN3ccc8CC14x4y53efgEv();
extern void _ZN3ccc8CC14x4y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y53pqrEv,_ZThn4_N3ccc8CC14x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y53abcEv,_ZThn4_N3ccc8CC14x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y53efgEv,_ZThn4_N3ccc8CC14x4y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y53pqrEv,_ZThn4_N3ccc8CC14x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y53abcEv,_ZThn4_N3ccc8CC14x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y53efgEv,_ZThn4_N3ccc8CC14x4y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y5E[];
Class_Descriptor cd__ZN3ccc8CC14x4y5E = {  "_ZN3ccc8CC14x4y5E", // class name
  bases__ZN3ccc8CC14x4y5E, 2,
  &(vtc__ZN3ccc8CC14x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y6  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC14x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x4y63efgEv
  ~CC14x4y6(); // tgen
  CC14x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y6E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y63abcEv");}
void  ccc::CC14x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y63efgEv");}
ccc::CC14x4y6 ::~CC14x4y6(){ note_dtor("_ZN3ccc8CC14x4y6E", this);} // tgen
ccc::CC14x4y6 ::CC14x4y6(){ note_ctor("_ZN3ccc8CC14x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y6E, buf);
    ::ccc::CC14x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y6E);
    dp->::ccc::CC14x4y6::~CC14x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y6E(Test__ZN3ccc8CC14x4y6E, "_ZN3ccc8CC14x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y6C1Ev();
extern void _ZN3ccc8CC14x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y6E[] = {
  NSPAIR(_ZN3ccc8CC14x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x4y63abcEv();
extern void _ZN3ccc8CC14x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y63abcEv,_ZThn4_N3ccc8CC14x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y63efgEv,_ZThn4_N3ccc8CC14x4y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y63abcEv,_ZThn4_N3ccc8CC14x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y63efgEv,_ZThn4_N3ccc8CC14x4y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y6E[];
Class_Descriptor cd__ZN3ccc8CC14x4y6E = {  "_ZN3ccc8CC14x4y6E", // class name
  bases__ZN3ccc8CC14x4y6E, 2,
  &(vtc__ZN3ccc8CC14x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y7  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC14x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y73pqrEv
  ~CC14x4y7(); // tgen
  CC14x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y7E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y73abcEv");}
void  ccc::CC14x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y73pqrEv");}
ccc::CC14x4y7 ::~CC14x4y7(){ note_dtor("_ZN3ccc8CC14x4y7E", this);} // tgen
ccc::CC14x4y7 ::CC14x4y7(){ note_ctor("_ZN3ccc8CC14x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y7E, buf);
    ::ccc::CC14x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y7E);
    dp->::ccc::CC14x4y7::~CC14x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y7E(Test__ZN3ccc8CC14x4y7E, "_ZN3ccc8CC14x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y7C1Ev();
extern void _ZN3ccc8CC14x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y7E[] = {
  NSPAIR(_ZN3ccc8CC14x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y7E[];
extern void _ZN3ccc8CC14x4y73pqrEv();
extern void _ZN3ccc8CC14x4y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y73pqrEv,_ZThn4_N3ccc8CC14x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y73abcEv,_ZThn4_N3ccc8CC14x4y73abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y73pqrEv,_ZThn4_N3ccc8CC14x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y73abcEv,_ZThn4_N3ccc8CC14x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y7E[];
Class_Descriptor cd__ZN3ccc8CC14x4y7E = {  "_ZN3ccc8CC14x4y7E", // class name
  bases__ZN3ccc8CC14x4y7E, 2,
  &(vtc__ZN3ccc8CC14x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y8  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC14x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x4y83abcEv
  ~CC14x4y8(); // tgen
  CC14x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y8E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y83efgEv");}
void  ccc::CC14x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x4y83abcEv");}
ccc::CC14x4y8 ::~CC14x4y8(){ note_dtor("_ZN3ccc8CC14x4y8E", this);} // tgen
ccc::CC14x4y8 ::CC14x4y8(){ note_ctor("_ZN3ccc8CC14x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y8E, buf);
    ::ccc::CC14x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y8E);
    dp->::ccc::CC14x4y8::~CC14x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y8E(Test__ZN3ccc8CC14x4y8E, "_ZN3ccc8CC14x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y8C1Ev();
extern void _ZN3ccc8CC14x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y8E[] = {
  NSPAIR(_ZN3ccc8CC14x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x4y83efgEv();
extern void _ZN3ccc8CC14x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y83abcEv,_ZThn4_N3ccc8CC14x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y83efgEv,_ZThn4_N3ccc8CC14x4y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y83abcEv,_ZThn4_N3ccc8CC14x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y83efgEv,_ZThn4_N3ccc8CC14x4y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y8E[];
Class_Descriptor cd__ZN3ccc8CC14x4y8E = {  "_ZN3ccc8CC14x4y8E", // class name
  bases__ZN3ccc8CC14x4y8E, 2,
  &(vtc__ZN3ccc8CC14x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y9  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC14x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x4y93pqrEv
  ~CC14x4y9(); // tgen
  CC14x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x4y9E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x4y93efgEv");}
void  ccc::CC14x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x4y93pqrEv");}
ccc::CC14x4y9 ::~CC14x4y9(){ note_dtor("_ZN3ccc8CC14x4y9E", this);} // tgen
ccc::CC14x4y9 ::CC14x4y9(){ note_ctor("_ZN3ccc8CC14x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x4y9E, buf);
    ::ccc::CC14x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x4y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8CC14x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x4y9E);
    dp->::ccc::CC14x4y9::~CC14x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x4y9E(Test__ZN3ccc8CC14x4y9E, "_ZN3ccc8CC14x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x4y9C1Ev();
extern void _ZN3ccc8CC14x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x4y9E[] = {
  NSPAIR(_ZN3ccc8CC14x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC14x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y9E[];
extern void _ZN3ccc8CC14x4y93pqrEv();
extern void _ZN3ccc8CC14x4y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y93pqrEv,_ZThn4_N3ccc8CC14x4y93pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x4y93efgEv,_ZThn4_N3ccc8CC14x4y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x4y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y93pqrEv,_ZThn4_N3ccc8CC14x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x4y93efgEv,_ZThn4_N3ccc8CC14x4y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x4y9E[];
Class_Descriptor cd__ZN3ccc8CC14x4y9E = {  "_ZN3ccc8CC14x4y9E", // class name
  bases__ZN3ccc8CC14x4y9E, 2,
  &(vtc__ZN3ccc8CC14x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x4y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y10  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC14x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x4y103abcEv
  ~CC14x4y10(); // tgen
  CC14x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y10E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x4y103pqrEv");}
void  ccc::CC14x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x4y103abcEv");}
ccc::CC14x4y10 ::~CC14x4y10(){ note_dtor("_ZN3ccc9CC14x4y10E", this);} // tgen
ccc::CC14x4y10 ::CC14x4y10(){ note_ctor("_ZN3ccc9CC14x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y10E, buf);
    ::ccc::CC14x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y10E);
    dp->::ccc::CC14x4y10::~CC14x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y10E(Test__ZN3ccc9CC14x4y10E, "_ZN3ccc9CC14x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y10C1Ev();
extern void _ZN3ccc9CC14x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y10E[] = {
  NSPAIR(_ZN3ccc9CC14x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y10E[];
extern void _ZN3ccc9CC14x4y103pqrEv();
extern void _ZN3ccc9CC14x4y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y103pqrEv,_ZThn4_N3ccc9CC14x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y103abcEv,_ZThn4_N3ccc9CC14x4y103abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y103pqrEv,_ZThn4_N3ccc9CC14x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y103abcEv,_ZThn4_N3ccc9CC14x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y10E[];
Class_Descriptor cd__ZN3ccc9CC14x4y10E = {  "_ZN3ccc9CC14x4y10E", // class name
  bases__ZN3ccc9CC14x4y10E, 2,
  &(vtc__ZN3ccc9CC14x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y11  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC14x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x4y113efgEv
  ~CC14x4y11(); // tgen
  CC14x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y11E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x4y113pqrEv");}
void  ccc::CC14x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x4y113efgEv");}
ccc::CC14x4y11 ::~CC14x4y11(){ note_dtor("_ZN3ccc9CC14x4y11E", this);} // tgen
ccc::CC14x4y11 ::CC14x4y11(){ note_ctor("_ZN3ccc9CC14x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y11E, buf);
    ::ccc::CC14x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y11E);
    dp->::ccc::CC14x4y11::~CC14x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y11E(Test__ZN3ccc9CC14x4y11E, "_ZN3ccc9CC14x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y11C1Ev();
extern void _ZN3ccc9CC14x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y11E[] = {
  NSPAIR(_ZN3ccc9CC14x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y11E[];
extern void _ZN3ccc9CC14x4y113pqrEv();
extern void _ZN3ccc9CC14x4y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y113pqrEv,_ZThn4_N3ccc9CC14x4y113pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y113efgEv,_ZThn4_N3ccc9CC14x4y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y113pqrEv,_ZThn4_N3ccc9CC14x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y113efgEv,_ZThn4_N3ccc9CC14x4y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y11E[];
Class_Descriptor cd__ZN3ccc9CC14x4y11E = {  "_ZN3ccc9CC14x4y11E", // class name
  bases__ZN3ccc9CC14x4y11E, 2,
  &(vtc__ZN3ccc9CC14x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y12  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC14x4y123abcEv
  ~CC14x4y12(); // tgen
  CC14x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y12E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC14x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x4y123abcEv");}
ccc::CC14x4y12 ::~CC14x4y12(){ note_dtor("_ZN3ccc9CC14x4y12E", this);} // tgen
ccc::CC14x4y12 ::CC14x4y12(){ note_ctor("_ZN3ccc9CC14x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y12E, buf);
    ::ccc::CC14x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y12E);
    dp->::ccc::CC14x4y12::~CC14x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y12E(Test__ZN3ccc9CC14x4y12E, "_ZN3ccc9CC14x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y12C1Ev();
extern void _ZN3ccc9CC14x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y12E[] = {
  NSPAIR(_ZN3ccc9CC14x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y123abcEv,_ZThn4_N3ccc9CC14x4y123abcEv)();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y123abcEv,_ZThn4_N3ccc9CC14x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y12E[];
Class_Descriptor cd__ZN3ccc9CC14x4y12E = {  "_ZN3ccc9CC14x4y12E", // class name
  bases__ZN3ccc9CC14x4y12E, 2,
  &(vtc__ZN3ccc9CC14x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y13  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC14x4y133efgEv
  ~CC14x4y13(); // tgen
  CC14x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y13E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC14x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x4y133efgEv");}
ccc::CC14x4y13 ::~CC14x4y13(){ note_dtor("_ZN3ccc9CC14x4y13E", this);} // tgen
ccc::CC14x4y13 ::CC14x4y13(){ note_ctor("_ZN3ccc9CC14x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y13E, buf);
    ::ccc::CC14x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y13E);
    dp->::ccc::CC14x4y13::~CC14x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y13E(Test__ZN3ccc9CC14x4y13E, "_ZN3ccc9CC14x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y13C1Ev();
extern void _ZN3ccc9CC14x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y13E[] = {
  NSPAIR(_ZN3ccc9CC14x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y133efgEv,_ZThn4_N3ccc9CC14x4y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y133efgEv,_ZThn4_N3ccc9CC14x4y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y13E[];
Class_Descriptor cd__ZN3ccc9CC14x4y13E = {  "_ZN3ccc9CC14x4y13E", // class name
  bases__ZN3ccc9CC14x4y13E, 2,
  &(vtc__ZN3ccc9CC14x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y14  : ::ccc::AA14 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC14x4y143pqrEv
  ~CC14x4y14(); // tgen
  CC14x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y14E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC14x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x4y143pqrEv");}
ccc::CC14x4y14 ::~CC14x4y14(){ note_dtor("_ZN3ccc9CC14x4y14E", this);} // tgen
ccc::CC14x4y14 ::CC14x4y14(){ note_ctor("_ZN3ccc9CC14x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y14E, buf);
    ::ccc::CC14x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y14E);
    dp->::ccc::CC14x4y14::~CC14x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y14E(Test__ZN3ccc9CC14x4y14E, "_ZN3ccc9CC14x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y14C1Ev();
extern void _ZN3ccc9CC14x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y14E[] = {
  NSPAIR(_ZN3ccc9CC14x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y14E[];
extern void _ZN3ccc9CC14x4y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x4y143pqrEv,_ZThn4_N3ccc9CC14x4y143pqrEv)();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x4y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x4y143pqrEv,_ZThn4_N3ccc9CC14x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y14E[];
Class_Descriptor cd__ZN3ccc9CC14x4y14E = {  "_ZN3ccc9CC14x4y14E", // class name
  bases__ZN3ccc9CC14x4y14E, 2,
  &(vtc__ZN3ccc9CC14x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x4y15  : ::ccc::AA14 , ::ccc::BB4 {
  ~CC14x4y15(); // tgen
  CC14x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x4y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x4y15 ::~CC14x4y15(){ note_dtor("_ZN3ccc9CC14x4y15E", this);} // tgen
ccc::CC14x4y15 ::CC14x4y15(){ note_ctor("_ZN3ccc9CC14x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x4y15E, buf);
    ::ccc::CC14x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x4y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9CC14x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x4y15E);
    dp->::ccc::CC14x4y15::~CC14x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x4y15E(Test__ZN3ccc9CC14x4y15E, "_ZN3ccc9CC14x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x4y15C1Ev();
extern void _ZN3ccc9CC14x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x4y15E[] = {
  NSPAIR(_ZN3ccc9CC14x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC14x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x4y15E[];
Class_Descriptor cd__ZN3ccc9CC14x4y15E = {  "_ZN3ccc9CC14x4y15E", // class name
  bases__ZN3ccc9CC14x4y15E, 2,
  &(vtc__ZN3ccc9CC14x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x4y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y0  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC14x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y03pqrEv
  ~CC14x5y0(); // tgen
  CC14x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y0E) C1{ BC2{ v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y03abcEv");}
void  ccc::CC14x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y03efgEv");}
void  ccc::CC14x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y03pqrEv");}
ccc::CC14x5y0 ::~CC14x5y0(){ note_dtor("_ZN3ccc8CC14x5y0E", this);} // tgen
ccc::CC14x5y0 ::CC14x5y0(){ note_ctor("_ZN3ccc8CC14x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y0E, buf);
    ::ccc::CC14x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y0E);
    dp->::ccc::CC14x5y0::~CC14x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y0E(Test__ZN3ccc8CC14x5y0E, "_ZN3ccc8CC14x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y0C1Ev();
extern void _ZN3ccc8CC14x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y0E[] = {
  NSPAIR(_ZN3ccc8CC14x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y0E[];
extern void _ZN3ccc8CC14x5y03pqrEv();
extern void _ZN3ccc8CC14x5y03abcEv();
extern void _ZN3ccc8CC14x5y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y03pqrEv,_ZThn4_N3ccc8CC14x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y03efgEv,_ZThn4_N3ccc8CC14x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y03abcEv,_ZThn4_N3ccc8CC14x5y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y03pqrEv,_ZThn4_N3ccc8CC14x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y03efgEv,_ZThn4_N3ccc8CC14x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y03abcEv,_ZThn4_N3ccc8CC14x5y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y0E[];
Class_Descriptor cd__ZN3ccc8CC14x5y0E = {  "_ZN3ccc8CC14x5y0E", // class name
  bases__ZN3ccc8CC14x5y0E, 2,
  &(vtc__ZN3ccc8CC14x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y0E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y1  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC14x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x5y13efgEv
  ~CC14x5y1(); // tgen
  CC14x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y1E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y13abcEv");}
void  ccc::CC14x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y13pqrEv");}
void  ccc::CC14x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y13efgEv");}
ccc::CC14x5y1 ::~CC14x5y1(){ note_dtor("_ZN3ccc8CC14x5y1E", this);} // tgen
ccc::CC14x5y1 ::CC14x5y1(){ note_ctor("_ZN3ccc8CC14x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y1E, buf);
    ::ccc::CC14x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y1E);
    dp->::ccc::CC14x5y1::~CC14x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y1E(Test__ZN3ccc8CC14x5y1E, "_ZN3ccc8CC14x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y1C1Ev();
extern void _ZN3ccc8CC14x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y1E[] = {
  NSPAIR(_ZN3ccc8CC14x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y1E[];
extern void _ZN3ccc8CC14x5y13pqrEv();
extern void _ZN3ccc8CC14x5y13abcEv();
extern void _ZN3ccc8CC14x5y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y13pqrEv,_ZThn4_N3ccc8CC14x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y13efgEv,_ZThn4_N3ccc8CC14x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y13abcEv,_ZThn4_N3ccc8CC14x5y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y13pqrEv,_ZThn4_N3ccc8CC14x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y13efgEv,_ZThn4_N3ccc8CC14x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y13abcEv,_ZThn4_N3ccc8CC14x5y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y1E[];
Class_Descriptor cd__ZN3ccc8CC14x5y1E = {  "_ZN3ccc8CC14x5y1E", // class name
  bases__ZN3ccc8CC14x5y1E, 2,
  &(vtc__ZN3ccc8CC14x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y1E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y2  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC14x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y23pqrEv
  ~CC14x5y2(); // tgen
  CC14x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y2E) C1{ BC2{ v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y23efgEv");}
void  ccc::CC14x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y23abcEv");}
void  ccc::CC14x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y23pqrEv");}
ccc::CC14x5y2 ::~CC14x5y2(){ note_dtor("_ZN3ccc8CC14x5y2E", this);} // tgen
ccc::CC14x5y2 ::CC14x5y2(){ note_ctor("_ZN3ccc8CC14x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y2E, buf);
    ::ccc::CC14x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y2E);
    dp->::ccc::CC14x5y2::~CC14x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y2E(Test__ZN3ccc8CC14x5y2E, "_ZN3ccc8CC14x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y2C1Ev();
extern void _ZN3ccc8CC14x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y2E[] = {
  NSPAIR(_ZN3ccc8CC14x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y2E[];
extern void _ZN3ccc8CC14x5y23pqrEv();
extern void _ZN3ccc8CC14x5y23efgEv();
extern void _ZN3ccc8CC14x5y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y23pqrEv,_ZThn4_N3ccc8CC14x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y23efgEv,_ZThn4_N3ccc8CC14x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y23abcEv,_ZThn4_N3ccc8CC14x5y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y23pqrEv,_ZThn4_N3ccc8CC14x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y23efgEv,_ZThn4_N3ccc8CC14x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y23abcEv,_ZThn4_N3ccc8CC14x5y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y2E[];
Class_Descriptor cd__ZN3ccc8CC14x5y2E = {  "_ZN3ccc8CC14x5y2E", // class name
  bases__ZN3ccc8CC14x5y2E, 2,
  &(vtc__ZN3ccc8CC14x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y2E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y3  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC14x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x5y33abcEv
  ~CC14x5y3(); // tgen
  CC14x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y3E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y33efgEv");}
void  ccc::CC14x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y33pqrEv");}
void  ccc::CC14x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y33abcEv");}
ccc::CC14x5y3 ::~CC14x5y3(){ note_dtor("_ZN3ccc8CC14x5y3E", this);} // tgen
ccc::CC14x5y3 ::CC14x5y3(){ note_ctor("_ZN3ccc8CC14x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y3E, buf);
    ::ccc::CC14x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y3E);
    dp->::ccc::CC14x5y3::~CC14x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y3E(Test__ZN3ccc8CC14x5y3E, "_ZN3ccc8CC14x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y3C1Ev();
extern void _ZN3ccc8CC14x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y3E[] = {
  NSPAIR(_ZN3ccc8CC14x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y3E[];
extern void _ZN3ccc8CC14x5y33pqrEv();
extern void _ZN3ccc8CC14x5y33efgEv();
extern void _ZN3ccc8CC14x5y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y33pqrEv,_ZThn4_N3ccc8CC14x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y33efgEv,_ZThn4_N3ccc8CC14x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y33abcEv,_ZThn4_N3ccc8CC14x5y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y33pqrEv,_ZThn4_N3ccc8CC14x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y33efgEv,_ZThn4_N3ccc8CC14x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y33abcEv,_ZThn4_N3ccc8CC14x5y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y3E[];
Class_Descriptor cd__ZN3ccc8CC14x5y3E = {  "_ZN3ccc8CC14x5y3E", // class name
  bases__ZN3ccc8CC14x5y3E, 2,
  &(vtc__ZN3ccc8CC14x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y3E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y4  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC14x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x5y43efgEv
  ~CC14x5y4(); // tgen
  CC14x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y4E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y43pqrEv");}
void  ccc::CC14x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y43abcEv");}
void  ccc::CC14x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y43efgEv");}
ccc::CC14x5y4 ::~CC14x5y4(){ note_dtor("_ZN3ccc8CC14x5y4E", this);} // tgen
ccc::CC14x5y4 ::CC14x5y4(){ note_ctor("_ZN3ccc8CC14x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y4E, buf);
    ::ccc::CC14x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y4E);
    dp->::ccc::CC14x5y4::~CC14x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y4E(Test__ZN3ccc8CC14x5y4E, "_ZN3ccc8CC14x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y4C1Ev();
extern void _ZN3ccc8CC14x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y4E[] = {
  NSPAIR(_ZN3ccc8CC14x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y4E[];
extern void _ZN3ccc8CC14x5y43pqrEv();
extern void _ZN3ccc8CC14x5y43abcEv();
extern void _ZN3ccc8CC14x5y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y43pqrEv,_ZThn4_N3ccc8CC14x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y43efgEv,_ZThn4_N3ccc8CC14x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y43abcEv,_ZThn4_N3ccc8CC14x5y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y43pqrEv,_ZThn4_N3ccc8CC14x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y43efgEv,_ZThn4_N3ccc8CC14x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y43abcEv,_ZThn4_N3ccc8CC14x5y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y4E[];
Class_Descriptor cd__ZN3ccc8CC14x5y4E = {  "_ZN3ccc8CC14x5y4E", // class name
  bases__ZN3ccc8CC14x5y4E, 2,
  &(vtc__ZN3ccc8CC14x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y4E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y5  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC14x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x5y53abcEv
  ~CC14x5y5(); // tgen
  CC14x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y5E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y53pqrEv");}
void  ccc::CC14x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y53efgEv");}
void  ccc::CC14x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y53abcEv");}
ccc::CC14x5y5 ::~CC14x5y5(){ note_dtor("_ZN3ccc8CC14x5y5E", this);} // tgen
ccc::CC14x5y5 ::CC14x5y5(){ note_ctor("_ZN3ccc8CC14x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y5E, buf);
    ::ccc::CC14x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y5E);
    dp->::ccc::CC14x5y5::~CC14x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y5E(Test__ZN3ccc8CC14x5y5E, "_ZN3ccc8CC14x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y5C1Ev();
extern void _ZN3ccc8CC14x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y5E[] = {
  NSPAIR(_ZN3ccc8CC14x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y5E[];
extern void _ZN3ccc8CC14x5y53pqrEv();
extern void _ZN3ccc8CC14x5y53efgEv();
extern void _ZN3ccc8CC14x5y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y53pqrEv,_ZThn4_N3ccc8CC14x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y53efgEv,_ZThn4_N3ccc8CC14x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y53abcEv,_ZThn4_N3ccc8CC14x5y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y53pqrEv,_ZThn4_N3ccc8CC14x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y53efgEv,_ZThn4_N3ccc8CC14x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y53abcEv,_ZThn4_N3ccc8CC14x5y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y5E[];
Class_Descriptor cd__ZN3ccc8CC14x5y5E = {  "_ZN3ccc8CC14x5y5E", // class name
  bases__ZN3ccc8CC14x5y5E, 2,
  &(vtc__ZN3ccc8CC14x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y5E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y6  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC14x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x5y63efgEv
  ~CC14x5y6(); // tgen
  CC14x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y6E) C1{ BC2{ v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y63abcEv");}
void  ccc::CC14x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y63efgEv");}
ccc::CC14x5y6 ::~CC14x5y6(){ note_dtor("_ZN3ccc8CC14x5y6E", this);} // tgen
ccc::CC14x5y6 ::CC14x5y6(){ note_ctor("_ZN3ccc8CC14x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y6E, buf);
    ::ccc::CC14x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y6E);
    dp->::ccc::CC14x5y6::~CC14x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y6E(Test__ZN3ccc8CC14x5y6E, "_ZN3ccc8CC14x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y6C1Ev();
extern void _ZN3ccc8CC14x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y6E[] = {
  NSPAIR(_ZN3ccc8CC14x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x5y63abcEv();
extern void _ZN3ccc8CC14x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y63efgEv,_ZThn4_N3ccc8CC14x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y63abcEv,_ZThn4_N3ccc8CC14x5y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y63efgEv,_ZThn4_N3ccc8CC14x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y63abcEv,_ZThn4_N3ccc8CC14x5y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y6E[];
Class_Descriptor cd__ZN3ccc8CC14x5y6E = {  "_ZN3ccc8CC14x5y6E", // class name
  bases__ZN3ccc8CC14x5y6E, 2,
  &(vtc__ZN3ccc8CC14x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y6E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y7  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC14x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y73pqrEv
  ~CC14x5y7(); // tgen
  CC14x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y7E) C1{ BC2{ v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y73abcEv");}
void  ccc::CC14x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y73pqrEv");}
ccc::CC14x5y7 ::~CC14x5y7(){ note_dtor("_ZN3ccc8CC14x5y7E", this);} // tgen
ccc::CC14x5y7 ::CC14x5y7(){ note_ctor("_ZN3ccc8CC14x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y7E, buf);
    ::ccc::CC14x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y7E);
    dp->::ccc::CC14x5y7::~CC14x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y7E(Test__ZN3ccc8CC14x5y7E, "_ZN3ccc8CC14x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y7C1Ev();
extern void _ZN3ccc8CC14x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y7E[] = {
  NSPAIR(_ZN3ccc8CC14x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y7E[];
extern void _ZN3ccc8CC14x5y73pqrEv();
extern void _ZN3ccc8CC14x5y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y73pqrEv,_ZThn4_N3ccc8CC14x5y73pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y73abcEv,_ZThn4_N3ccc8CC14x5y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y73pqrEv,_ZThn4_N3ccc8CC14x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y73abcEv,_ZThn4_N3ccc8CC14x5y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y7E[];
Class_Descriptor cd__ZN3ccc8CC14x5y7E = {  "_ZN3ccc8CC14x5y7E", // class name
  bases__ZN3ccc8CC14x5y7E, 2,
  &(vtc__ZN3ccc8CC14x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y7E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y8  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC14x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x5y83abcEv
  ~CC14x5y8(); // tgen
  CC14x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y8E) C1{ BC2{ v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y83efgEv");}
void  ccc::CC14x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x5y83abcEv");}
ccc::CC14x5y8 ::~CC14x5y8(){ note_dtor("_ZN3ccc8CC14x5y8E", this);} // tgen
ccc::CC14x5y8 ::CC14x5y8(){ note_ctor("_ZN3ccc8CC14x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y8E, buf);
    ::ccc::CC14x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y8E);
    dp->::ccc::CC14x5y8::~CC14x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y8E(Test__ZN3ccc8CC14x5y8E, "_ZN3ccc8CC14x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y8C1Ev();
extern void _ZN3ccc8CC14x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y8E[] = {
  NSPAIR(_ZN3ccc8CC14x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x5y83efgEv();
extern void _ZN3ccc8CC14x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y83efgEv,_ZThn4_N3ccc8CC14x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y83abcEv,_ZThn4_N3ccc8CC14x5y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y83efgEv,_ZThn4_N3ccc8CC14x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y83abcEv,_ZThn4_N3ccc8CC14x5y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y8E[];
Class_Descriptor cd__ZN3ccc8CC14x5y8E = {  "_ZN3ccc8CC14x5y8E", // class name
  bases__ZN3ccc8CC14x5y8E, 2,
  &(vtc__ZN3ccc8CC14x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y8E),10, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y9  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC14x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x5y93pqrEv
  ~CC14x5y9(); // tgen
  CC14x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x5y9E) C1{ BC2{ v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x5y93efgEv");}
void  ccc::CC14x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x5y93pqrEv");}
ccc::CC14x5y9 ::~CC14x5y9(){ note_dtor("_ZN3ccc8CC14x5y9E", this);} // tgen
ccc::CC14x5y9 ::CC14x5y9(){ note_ctor("_ZN3ccc8CC14x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x5y9E, buf);
    ::ccc::CC14x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x5y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8CC14x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x5y9E);
    dp->::ccc::CC14x5y9::~CC14x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x5y9E(Test__ZN3ccc8CC14x5y9E, "_ZN3ccc8CC14x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x5y9C1Ev();
extern void _ZN3ccc8CC14x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x5y9E[] = {
  NSPAIR(_ZN3ccc8CC14x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC14x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y9E[];
extern void _ZN3ccc8CC14x5y93pqrEv();
extern void _ZN3ccc8CC14x5y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y93pqrEv,_ZThn4_N3ccc8CC14x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x5y93efgEv,_ZThn4_N3ccc8CC14x5y93efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x5y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y93pqrEv,_ZThn4_N3ccc8CC14x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x5y93efgEv,_ZThn4_N3ccc8CC14x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x5y9E[];
Class_Descriptor cd__ZN3ccc8CC14x5y9E = {  "_ZN3ccc8CC14x5y9E", // class name
  bases__ZN3ccc8CC14x5y9E, 2,
  &(vtc__ZN3ccc8CC14x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x5y9E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y10  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC14x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x5y103abcEv
  ~CC14x5y10(); // tgen
  CC14x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y10E) C1{ BC2{ v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x5y103pqrEv");}
void  ccc::CC14x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x5y103abcEv");}
ccc::CC14x5y10 ::~CC14x5y10(){ note_dtor("_ZN3ccc9CC14x5y10E", this);} // tgen
ccc::CC14x5y10 ::CC14x5y10(){ note_ctor("_ZN3ccc9CC14x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y10E, buf);
    ::ccc::CC14x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y10E);
    dp->::ccc::CC14x5y10::~CC14x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y10E(Test__ZN3ccc9CC14x5y10E, "_ZN3ccc9CC14x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y10C1Ev();
extern void _ZN3ccc9CC14x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y10E[] = {
  NSPAIR(_ZN3ccc9CC14x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y10E[];
extern void _ZN3ccc9CC14x5y103pqrEv();
extern void _ZN3ccc9CC14x5y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y103pqrEv,_ZThn4_N3ccc9CC14x5y103pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y103abcEv,_ZThn4_N3ccc9CC14x5y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y103pqrEv,_ZThn4_N3ccc9CC14x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y103abcEv,_ZThn4_N3ccc9CC14x5y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y10E[];
Class_Descriptor cd__ZN3ccc9CC14x5y10E = {  "_ZN3ccc9CC14x5y10E", // class name
  bases__ZN3ccc9CC14x5y10E, 2,
  &(vtc__ZN3ccc9CC14x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y10E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y11  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC14x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x5y113efgEv
  ~CC14x5y11(); // tgen
  CC14x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y11E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x5y113pqrEv");}
void  ccc::CC14x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x5y113efgEv");}
ccc::CC14x5y11 ::~CC14x5y11(){ note_dtor("_ZN3ccc9CC14x5y11E", this);} // tgen
ccc::CC14x5y11 ::CC14x5y11(){ note_ctor("_ZN3ccc9CC14x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y11E, buf);
    ::ccc::CC14x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y11E);
    dp->::ccc::CC14x5y11::~CC14x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y11E(Test__ZN3ccc9CC14x5y11E, "_ZN3ccc9CC14x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y11C1Ev();
extern void _ZN3ccc9CC14x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y11E[] = {
  NSPAIR(_ZN3ccc9CC14x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y11E[];
extern void _ZN3ccc9CC14x5y113pqrEv();
extern void _ZN3ccc9CC14x5y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y113pqrEv,_ZThn4_N3ccc9CC14x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y113efgEv,_ZThn4_N3ccc9CC14x5y113efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y113pqrEv,_ZThn4_N3ccc9CC14x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y113efgEv,_ZThn4_N3ccc9CC14x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y11E[];
Class_Descriptor cd__ZN3ccc9CC14x5y11E = {  "_ZN3ccc9CC14x5y11E", // class name
  bases__ZN3ccc9CC14x5y11E, 2,
  &(vtc__ZN3ccc9CC14x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y11E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y12  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC14x5y123abcEv
  ~CC14x5y12(); // tgen
  CC14x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y12E) C1{ BC2{ v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC14x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x5y123abcEv");}
ccc::CC14x5y12 ::~CC14x5y12(){ note_dtor("_ZN3ccc9CC14x5y12E", this);} // tgen
ccc::CC14x5y12 ::CC14x5y12(){ note_ctor("_ZN3ccc9CC14x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y12E, buf);
    ::ccc::CC14x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y12E);
    dp->::ccc::CC14x5y12::~CC14x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y12E(Test__ZN3ccc9CC14x5y12E, "_ZN3ccc9CC14x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y12C1Ev();
extern void _ZN3ccc9CC14x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y12E[] = {
  NSPAIR(_ZN3ccc9CC14x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y123abcEv,_ZThn4_N3ccc9CC14x5y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y123abcEv,_ZThn4_N3ccc9CC14x5y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y12E[];
Class_Descriptor cd__ZN3ccc9CC14x5y12E = {  "_ZN3ccc9CC14x5y12E", // class name
  bases__ZN3ccc9CC14x5y12E, 2,
  &(vtc__ZN3ccc9CC14x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y12E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y13  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC14x5y133efgEv
  ~CC14x5y13(); // tgen
  CC14x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y13E) C1{ BC2{ v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC14x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x5y133efgEv");}
ccc::CC14x5y13 ::~CC14x5y13(){ note_dtor("_ZN3ccc9CC14x5y13E", this);} // tgen
ccc::CC14x5y13 ::CC14x5y13(){ note_ctor("_ZN3ccc9CC14x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y13E, buf);
    ::ccc::CC14x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y13E);
    dp->::ccc::CC14x5y13::~CC14x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y13E(Test__ZN3ccc9CC14x5y13E, "_ZN3ccc9CC14x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y13C1Ev();
extern void _ZN3ccc9CC14x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y13E[] = {
  NSPAIR(_ZN3ccc9CC14x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y133efgEv,_ZThn4_N3ccc9CC14x5y133efgEv)();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y133efgEv,_ZThn4_N3ccc9CC14x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y13E[];
Class_Descriptor cd__ZN3ccc9CC14x5y13E = {  "_ZN3ccc9CC14x5y13E", // class name
  bases__ZN3ccc9CC14x5y13E, 2,
  &(vtc__ZN3ccc9CC14x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y13E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y14  : ::ccc::AA14 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC14x5y143pqrEv
  ~CC14x5y14(); // tgen
  CC14x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y14E) C1{ BC2{ v1} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC14x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x5y143pqrEv");}
ccc::CC14x5y14 ::~CC14x5y14(){ note_dtor("_ZN3ccc9CC14x5y14E", this);} // tgen
ccc::CC14x5y14 ::CC14x5y14(){ note_ctor("_ZN3ccc9CC14x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y14E, buf);
    ::ccc::CC14x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y14E);
    dp->::ccc::CC14x5y14::~CC14x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y14E(Test__ZN3ccc9CC14x5y14E, "_ZN3ccc9CC14x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y14C1Ev();
extern void _ZN3ccc9CC14x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y14E[] = {
  NSPAIR(_ZN3ccc9CC14x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y14E[];
extern void _ZN3ccc9CC14x5y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x5y143pqrEv,_ZThn4_N3ccc9CC14x5y143pqrEv)();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x5y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x5y143pqrEv,_ZThn4_N3ccc9CC14x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y14E[];
Class_Descriptor cd__ZN3ccc9CC14x5y14E = {  "_ZN3ccc9CC14x5y14E", // class name
  bases__ZN3ccc9CC14x5y14E, 2,
  &(vtc__ZN3ccc9CC14x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y14E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x5y15  : ::ccc::AA14 , ::ccc::BB5 {
  ~CC14x5y15(); // tgen
  CC14x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x5y15E) C1{ BC2{ v1} BC3{ v2 v3 v4}}
}
namespace ccc { 
ccc::CC14x5y15 ::~CC14x5y15(){ note_dtor("_ZN3ccc9CC14x5y15E", this);} // tgen
ccc::CC14x5y15 ::CC14x5y15(){ note_ctor("_ZN3ccc9CC14x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x5y15E, buf);
    ::ccc::CC14x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x5y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9CC14x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x5y15E);
    dp->::ccc::CC14x5y15::~CC14x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x5y15E(Test__ZN3ccc9CC14x5y15E, "_ZN3ccc9CC14x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x5y15C1Ev();
extern void _ZN3ccc9CC14x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x5y15E[] = {
  NSPAIR(_ZN3ccc9CC14x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC14x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x5y15E[];
Class_Descriptor cd__ZN3ccc9CC14x5y15E = {  "_ZN3ccc9CC14x5y15E", // class name
  bases__ZN3ccc9CC14x5y15E, 2,
  &(vtc__ZN3ccc9CC14x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x5y15E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y0  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC14x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y03pqrEv
  ~CC14x6y0(); // tgen
  CC14x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y0E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y03abcEv");}
void  ccc::CC14x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y03efgEv");}
void  ccc::CC14x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y03pqrEv");}
ccc::CC14x6y0 ::~CC14x6y0(){ note_dtor("_ZN3ccc8CC14x6y0E", this);} // tgen
ccc::CC14x6y0 ::CC14x6y0(){ note_ctor("_ZN3ccc8CC14x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y0E, buf);
    ::ccc::CC14x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y0E);
    dp->::ccc::CC14x6y0::~CC14x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y0E(Test__ZN3ccc8CC14x6y0E, "_ZN3ccc8CC14x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y0C1Ev();
extern void _ZN3ccc8CC14x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y0E[] = {
  NSPAIR(_ZN3ccc8CC14x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y0E[];
extern void _ZN3ccc8CC14x6y03pqrEv();
extern void _ZN3ccc8CC14x6y03abcEv();
extern void _ZN3ccc8CC14x6y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y03abcEv,_ZThn4_N3ccc8CC14x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y03efgEv,_ZThn4_N3ccc8CC14x6y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y03abcEv,_ZThn4_N3ccc8CC14x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y03efgEv,_ZThn4_N3ccc8CC14x6y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y0E[];
Class_Descriptor cd__ZN3ccc8CC14x6y0E = {  "_ZN3ccc8CC14x6y0E", // class name
  bases__ZN3ccc8CC14x6y0E, 2,
  &(vtc__ZN3ccc8CC14x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y1  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC14x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x6y13efgEv
  ~CC14x6y1(); // tgen
  CC14x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y1E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y13abcEv");}
void  ccc::CC14x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y13pqrEv");}
void  ccc::CC14x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y13efgEv");}
ccc::CC14x6y1 ::~CC14x6y1(){ note_dtor("_ZN3ccc8CC14x6y1E", this);} // tgen
ccc::CC14x6y1 ::CC14x6y1(){ note_ctor("_ZN3ccc8CC14x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y1E, buf);
    ::ccc::CC14x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y1E);
    dp->::ccc::CC14x6y1::~CC14x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y1E(Test__ZN3ccc8CC14x6y1E, "_ZN3ccc8CC14x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y1C1Ev();
extern void _ZN3ccc8CC14x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y1E[] = {
  NSPAIR(_ZN3ccc8CC14x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y1E[];
extern void _ZN3ccc8CC14x6y13pqrEv();
extern void _ZN3ccc8CC14x6y13abcEv();
extern void _ZN3ccc8CC14x6y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y13abcEv,_ZThn4_N3ccc8CC14x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y13efgEv,_ZThn4_N3ccc8CC14x6y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y13abcEv,_ZThn4_N3ccc8CC14x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y13efgEv,_ZThn4_N3ccc8CC14x6y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y1E[];
Class_Descriptor cd__ZN3ccc8CC14x6y1E = {  "_ZN3ccc8CC14x6y1E", // class name
  bases__ZN3ccc8CC14x6y1E, 2,
  &(vtc__ZN3ccc8CC14x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y2  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC14x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y23pqrEv
  ~CC14x6y2(); // tgen
  CC14x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y2E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y23efgEv");}
void  ccc::CC14x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y23abcEv");}
void  ccc::CC14x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y23pqrEv");}
ccc::CC14x6y2 ::~CC14x6y2(){ note_dtor("_ZN3ccc8CC14x6y2E", this);} // tgen
ccc::CC14x6y2 ::CC14x6y2(){ note_ctor("_ZN3ccc8CC14x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y2E, buf);
    ::ccc::CC14x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y2E);
    dp->::ccc::CC14x6y2::~CC14x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y2E(Test__ZN3ccc8CC14x6y2E, "_ZN3ccc8CC14x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y2C1Ev();
extern void _ZN3ccc8CC14x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y2E[] = {
  NSPAIR(_ZN3ccc8CC14x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y2E[];
extern void _ZN3ccc8CC14x6y23pqrEv();
extern void _ZN3ccc8CC14x6y23efgEv();
extern void _ZN3ccc8CC14x6y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y23abcEv,_ZThn4_N3ccc8CC14x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y23efgEv,_ZThn4_N3ccc8CC14x6y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y23abcEv,_ZThn4_N3ccc8CC14x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y23efgEv,_ZThn4_N3ccc8CC14x6y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y2E[];
Class_Descriptor cd__ZN3ccc8CC14x6y2E = {  "_ZN3ccc8CC14x6y2E", // class name
  bases__ZN3ccc8CC14x6y2E, 2,
  &(vtc__ZN3ccc8CC14x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y3  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC14x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x6y33abcEv
  ~CC14x6y3(); // tgen
  CC14x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y3E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y33efgEv");}
void  ccc::CC14x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y33pqrEv");}
void  ccc::CC14x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y33abcEv");}
ccc::CC14x6y3 ::~CC14x6y3(){ note_dtor("_ZN3ccc8CC14x6y3E", this);} // tgen
ccc::CC14x6y3 ::CC14x6y3(){ note_ctor("_ZN3ccc8CC14x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y3E, buf);
    ::ccc::CC14x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y3E);
    dp->::ccc::CC14x6y3::~CC14x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y3E(Test__ZN3ccc8CC14x6y3E, "_ZN3ccc8CC14x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y3C1Ev();
extern void _ZN3ccc8CC14x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y3E[] = {
  NSPAIR(_ZN3ccc8CC14x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y3E[];
extern void _ZN3ccc8CC14x6y33pqrEv();
extern void _ZN3ccc8CC14x6y33efgEv();
extern void _ZN3ccc8CC14x6y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y33abcEv,_ZThn4_N3ccc8CC14x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y33efgEv,_ZThn4_N3ccc8CC14x6y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y33abcEv,_ZThn4_N3ccc8CC14x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y33efgEv,_ZThn4_N3ccc8CC14x6y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y3E[];
Class_Descriptor cd__ZN3ccc8CC14x6y3E = {  "_ZN3ccc8CC14x6y3E", // class name
  bases__ZN3ccc8CC14x6y3E, 2,
  &(vtc__ZN3ccc8CC14x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y4  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC14x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x6y43efgEv
  ~CC14x6y4(); // tgen
  CC14x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y4E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y43pqrEv");}
void  ccc::CC14x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y43abcEv");}
void  ccc::CC14x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y43efgEv");}
ccc::CC14x6y4 ::~CC14x6y4(){ note_dtor("_ZN3ccc8CC14x6y4E", this);} // tgen
ccc::CC14x6y4 ::CC14x6y4(){ note_ctor("_ZN3ccc8CC14x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y4E, buf);
    ::ccc::CC14x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y4E);
    dp->::ccc::CC14x6y4::~CC14x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y4E(Test__ZN3ccc8CC14x6y4E, "_ZN3ccc8CC14x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y4C1Ev();
extern void _ZN3ccc8CC14x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y4E[] = {
  NSPAIR(_ZN3ccc8CC14x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y4E[];
extern void _ZN3ccc8CC14x6y43pqrEv();
extern void _ZN3ccc8CC14x6y43abcEv();
extern void _ZN3ccc8CC14x6y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y43abcEv,_ZThn4_N3ccc8CC14x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y43efgEv,_ZThn4_N3ccc8CC14x6y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y43abcEv,_ZThn4_N3ccc8CC14x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y43efgEv,_ZThn4_N3ccc8CC14x6y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y4E[];
Class_Descriptor cd__ZN3ccc8CC14x6y4E = {  "_ZN3ccc8CC14x6y4E", // class name
  bases__ZN3ccc8CC14x6y4E, 2,
  &(vtc__ZN3ccc8CC14x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y5  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC14x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x6y53abcEv
  ~CC14x6y5(); // tgen
  CC14x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y5E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y53pqrEv");}
void  ccc::CC14x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y53efgEv");}
void  ccc::CC14x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y53abcEv");}
ccc::CC14x6y5 ::~CC14x6y5(){ note_dtor("_ZN3ccc8CC14x6y5E", this);} // tgen
ccc::CC14x6y5 ::CC14x6y5(){ note_ctor("_ZN3ccc8CC14x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y5E, buf);
    ::ccc::CC14x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y5E);
    dp->::ccc::CC14x6y5::~CC14x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y5E(Test__ZN3ccc8CC14x6y5E, "_ZN3ccc8CC14x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y5C1Ev();
extern void _ZN3ccc8CC14x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y5E[] = {
  NSPAIR(_ZN3ccc8CC14x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y5E[];
extern void _ZN3ccc8CC14x6y53pqrEv();
extern void _ZN3ccc8CC14x6y53efgEv();
extern void _ZN3ccc8CC14x6y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y53abcEv,_ZThn4_N3ccc8CC14x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y53efgEv,_ZThn4_N3ccc8CC14x6y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y53abcEv,_ZThn4_N3ccc8CC14x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y53efgEv,_ZThn4_N3ccc8CC14x6y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y5E[];
Class_Descriptor cd__ZN3ccc8CC14x6y5E = {  "_ZN3ccc8CC14x6y5E", // class name
  bases__ZN3ccc8CC14x6y5E, 2,
  &(vtc__ZN3ccc8CC14x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y6  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC14x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x6y63efgEv
  ~CC14x6y6(); // tgen
  CC14x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y6E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y63abcEv");}
void  ccc::CC14x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y63efgEv");}
ccc::CC14x6y6 ::~CC14x6y6(){ note_dtor("_ZN3ccc8CC14x6y6E", this);} // tgen
ccc::CC14x6y6 ::CC14x6y6(){ note_ctor("_ZN3ccc8CC14x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y6E, buf);
    ::ccc::CC14x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y6E);
    dp->::ccc::CC14x6y6::~CC14x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y6E(Test__ZN3ccc8CC14x6y6E, "_ZN3ccc8CC14x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y6C1Ev();
extern void _ZN3ccc8CC14x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y6E[] = {
  NSPAIR(_ZN3ccc8CC14x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x6y63abcEv();
extern void _ZN3ccc8CC14x6y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y63abcEv,_ZThn4_N3ccc8CC14x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y63efgEv,_ZThn4_N3ccc8CC14x6y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y63abcEv,_ZThn4_N3ccc8CC14x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y63efgEv,_ZThn4_N3ccc8CC14x6y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y6E[];
Class_Descriptor cd__ZN3ccc8CC14x6y6E = {  "_ZN3ccc8CC14x6y6E", // class name
  bases__ZN3ccc8CC14x6y6E, 2,
  &(vtc__ZN3ccc8CC14x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y7  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC14x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y73pqrEv
  ~CC14x6y7(); // tgen
  CC14x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y7E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y73abcEv");}
void  ccc::CC14x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y73pqrEv");}
ccc::CC14x6y7 ::~CC14x6y7(){ note_dtor("_ZN3ccc8CC14x6y7E", this);} // tgen
ccc::CC14x6y7 ::CC14x6y7(){ note_ctor("_ZN3ccc8CC14x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y7E, buf);
    ::ccc::CC14x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y7E);
    dp->::ccc::CC14x6y7::~CC14x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y7E(Test__ZN3ccc8CC14x6y7E, "_ZN3ccc8CC14x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y7C1Ev();
extern void _ZN3ccc8CC14x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y7E[] = {
  NSPAIR(_ZN3ccc8CC14x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y7E[];
extern void _ZN3ccc8CC14x6y73pqrEv();
extern void _ZN3ccc8CC14x6y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y73abcEv,_ZThn4_N3ccc8CC14x6y73abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y73abcEv,_ZThn4_N3ccc8CC14x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y7E[];
Class_Descriptor cd__ZN3ccc8CC14x6y7E = {  "_ZN3ccc8CC14x6y7E", // class name
  bases__ZN3ccc8CC14x6y7E, 2,
  &(vtc__ZN3ccc8CC14x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y8  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC14x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x6y83abcEv
  ~CC14x6y8(); // tgen
  CC14x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y8E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y83efgEv");}
void  ccc::CC14x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x6y83abcEv");}
ccc::CC14x6y8 ::~CC14x6y8(){ note_dtor("_ZN3ccc8CC14x6y8E", this);} // tgen
ccc::CC14x6y8 ::CC14x6y8(){ note_ctor("_ZN3ccc8CC14x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y8E, buf);
    ::ccc::CC14x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y8E);
    dp->::ccc::CC14x6y8::~CC14x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y8E(Test__ZN3ccc8CC14x6y8E, "_ZN3ccc8CC14x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y8C1Ev();
extern void _ZN3ccc8CC14x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y8E[] = {
  NSPAIR(_ZN3ccc8CC14x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x6y83efgEv();
extern void _ZN3ccc8CC14x6y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y83abcEv,_ZThn4_N3ccc8CC14x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y83efgEv,_ZThn4_N3ccc8CC14x6y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y83abcEv,_ZThn4_N3ccc8CC14x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y83efgEv,_ZThn4_N3ccc8CC14x6y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y8E[];
Class_Descriptor cd__ZN3ccc8CC14x6y8E = {  "_ZN3ccc8CC14x6y8E", // class name
  bases__ZN3ccc8CC14x6y8E, 2,
  &(vtc__ZN3ccc8CC14x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y9  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC14x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x6y93pqrEv
  ~CC14x6y9(); // tgen
  CC14x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x6y9E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x6y93efgEv");}
void  ccc::CC14x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x6y93pqrEv");}
ccc::CC14x6y9 ::~CC14x6y9(){ note_dtor("_ZN3ccc8CC14x6y9E", this);} // tgen
ccc::CC14x6y9 ::CC14x6y9(){ note_ctor("_ZN3ccc8CC14x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x6y9E, buf);
    ::ccc::CC14x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x6y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8CC14x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x6y9E);
    dp->::ccc::CC14x6y9::~CC14x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x6y9E(Test__ZN3ccc8CC14x6y9E, "_ZN3ccc8CC14x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x6y9C1Ev();
extern void _ZN3ccc8CC14x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x6y9E[] = {
  NSPAIR(_ZN3ccc8CC14x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC14x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y9E[];
extern void _ZN3ccc8CC14x6y93pqrEv();
extern void _ZN3ccc8CC14x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x6y93efgEv,_ZThn4_N3ccc8CC14x6y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x6y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x6y93efgEv,_ZThn4_N3ccc8CC14x6y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x6y9E[];
Class_Descriptor cd__ZN3ccc8CC14x6y9E = {  "_ZN3ccc8CC14x6y9E", // class name
  bases__ZN3ccc8CC14x6y9E, 2,
  &(vtc__ZN3ccc8CC14x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x6y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y10  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC14x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x6y103abcEv
  ~CC14x6y10(); // tgen
  CC14x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y10E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x6y103pqrEv");}
void  ccc::CC14x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x6y103abcEv");}
ccc::CC14x6y10 ::~CC14x6y10(){ note_dtor("_ZN3ccc9CC14x6y10E", this);} // tgen
ccc::CC14x6y10 ::CC14x6y10(){ note_ctor("_ZN3ccc9CC14x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y10E, buf);
    ::ccc::CC14x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y10E);
    dp->::ccc::CC14x6y10::~CC14x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y10E(Test__ZN3ccc9CC14x6y10E, "_ZN3ccc9CC14x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y10C1Ev();
extern void _ZN3ccc9CC14x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y10E[] = {
  NSPAIR(_ZN3ccc9CC14x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y10E[];
extern void _ZN3ccc9CC14x6y103pqrEv();
extern void _ZN3ccc9CC14x6y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x6y103abcEv,_ZThn4_N3ccc9CC14x6y103abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x6y103abcEv,_ZThn4_N3ccc9CC14x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y10E[];
Class_Descriptor cd__ZN3ccc9CC14x6y10E = {  "_ZN3ccc9CC14x6y10E", // class name
  bases__ZN3ccc9CC14x6y10E, 2,
  &(vtc__ZN3ccc9CC14x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y11  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC14x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x6y113efgEv
  ~CC14x6y11(); // tgen
  CC14x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y11E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x6y113pqrEv");}
void  ccc::CC14x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x6y113efgEv");}
ccc::CC14x6y11 ::~CC14x6y11(){ note_dtor("_ZN3ccc9CC14x6y11E", this);} // tgen
ccc::CC14x6y11 ::CC14x6y11(){ note_ctor("_ZN3ccc9CC14x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y11E, buf);
    ::ccc::CC14x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y11E);
    dp->::ccc::CC14x6y11::~CC14x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y11E(Test__ZN3ccc9CC14x6y11E, "_ZN3ccc9CC14x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y11C1Ev();
extern void _ZN3ccc9CC14x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y11E[] = {
  NSPAIR(_ZN3ccc9CC14x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y11E[];
extern void _ZN3ccc9CC14x6y113pqrEv();
extern void _ZN3ccc9CC14x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x6y113efgEv,_ZThn4_N3ccc9CC14x6y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x6y113efgEv,_ZThn4_N3ccc9CC14x6y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y11E[];
Class_Descriptor cd__ZN3ccc9CC14x6y11E = {  "_ZN3ccc9CC14x6y11E", // class name
  bases__ZN3ccc9CC14x6y11E, 2,
  &(vtc__ZN3ccc9CC14x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y12  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC14x6y123abcEv
  ~CC14x6y12(); // tgen
  CC14x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y12E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x6y123abcEv");}
ccc::CC14x6y12 ::~CC14x6y12(){ note_dtor("_ZN3ccc9CC14x6y12E", this);} // tgen
ccc::CC14x6y12 ::CC14x6y12(){ note_ctor("_ZN3ccc9CC14x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y12E, buf);
    ::ccc::CC14x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y12E);
    dp->::ccc::CC14x6y12::~CC14x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y12E(Test__ZN3ccc9CC14x6y12E, "_ZN3ccc9CC14x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y12C1Ev();
extern void _ZN3ccc9CC14x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y12E[] = {
  NSPAIR(_ZN3ccc9CC14x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x6y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x6y123abcEv,_ZThn4_N3ccc9CC14x6y123abcEv)();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x6y123abcEv,_ZThn4_N3ccc9CC14x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y12E[];
Class_Descriptor cd__ZN3ccc9CC14x6y12E = {  "_ZN3ccc9CC14x6y12E", // class name
  bases__ZN3ccc9CC14x6y12E, 2,
  &(vtc__ZN3ccc9CC14x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y13  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC14x6y133efgEv
  ~CC14x6y13(); // tgen
  CC14x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y13E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x6y133efgEv");}
ccc::CC14x6y13 ::~CC14x6y13(){ note_dtor("_ZN3ccc9CC14x6y13E", this);} // tgen
ccc::CC14x6y13 ::CC14x6y13(){ note_ctor("_ZN3ccc9CC14x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y13E, buf);
    ::ccc::CC14x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y13E);
    dp->::ccc::CC14x6y13::~CC14x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y13E(Test__ZN3ccc9CC14x6y13E, "_ZN3ccc9CC14x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y13C1Ev();
extern void _ZN3ccc9CC14x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y13E[] = {
  NSPAIR(_ZN3ccc9CC14x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x6y133efgEv,_ZThn4_N3ccc9CC14x6y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x6y133efgEv,_ZThn4_N3ccc9CC14x6y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y13E[];
Class_Descriptor cd__ZN3ccc9CC14x6y13E = {  "_ZN3ccc9CC14x6y13E", // class name
  bases__ZN3ccc9CC14x6y13E, 2,
  &(vtc__ZN3ccc9CC14x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y14  : ::ccc::AA14 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC14x6y143pqrEv
  ~CC14x6y14(); // tgen
  CC14x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y14E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC14x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x6y143pqrEv");}
ccc::CC14x6y14 ::~CC14x6y14(){ note_dtor("_ZN3ccc9CC14x6y14E", this);} // tgen
ccc::CC14x6y14 ::CC14x6y14(){ note_ctor("_ZN3ccc9CC14x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y14E, buf);
    ::ccc::CC14x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y14E);
    dp->::ccc::CC14x6y14::~CC14x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y14E(Test__ZN3ccc9CC14x6y14E, "_ZN3ccc9CC14x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y14C1Ev();
extern void _ZN3ccc9CC14x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y14E[] = {
  NSPAIR(_ZN3ccc9CC14x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y14E[];
extern void _ZN3ccc9CC14x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x6y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y14E[];
Class_Descriptor cd__ZN3ccc9CC14x6y14E = {  "_ZN3ccc9CC14x6y14E", // class name
  bases__ZN3ccc9CC14x6y14E, 2,
  &(vtc__ZN3ccc9CC14x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x6y15  : ::ccc::AA14 , ::ccc::BB6 {
  ~CC14x6y15(); // tgen
  CC14x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x6y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x6y15 ::~CC14x6y15(){ note_dtor("_ZN3ccc9CC14x6y15E", this);} // tgen
ccc::CC14x6y15 ::CC14x6y15(){ note_ctor("_ZN3ccc9CC14x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x6y15E, buf);
    ::ccc::CC14x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x6y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc9CC14x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x6y15E);
    dp->::ccc::CC14x6y15::~CC14x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x6y15E(Test__ZN3ccc9CC14x6y15E, "_ZN3ccc9CC14x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x6y15C1Ev();
extern void _ZN3ccc9CC14x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x6y15E[] = {
  NSPAIR(_ZN3ccc9CC14x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC14x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x6y15E[];
Class_Descriptor cd__ZN3ccc9CC14x6y15E = {  "_ZN3ccc9CC14x6y15E", // class name
  bases__ZN3ccc9CC14x6y15E, 2,
  &(vtc__ZN3ccc9CC14x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x6y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y0  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC14x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y03pqrEv
  ~CC14x7y0(); // tgen
  CC14x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y0E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y03abcEv");}
void  ccc::CC14x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y03efgEv");}
void  ccc::CC14x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y03pqrEv");}
ccc::CC14x7y0 ::~CC14x7y0(){ note_dtor("_ZN3ccc8CC14x7y0E", this);} // tgen
ccc::CC14x7y0 ::CC14x7y0(){ note_ctor("_ZN3ccc8CC14x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y0E, buf);
    ::ccc::CC14x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y0E);
    dp->::ccc::CC14x7y0::~CC14x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y0E(Test__ZN3ccc8CC14x7y0E, "_ZN3ccc8CC14x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y0C1Ev();
extern void _ZN3ccc8CC14x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y0E[] = {
  NSPAIR(_ZN3ccc8CC14x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y0E[];
extern void _ZN3ccc8CC14x7y03pqrEv();
extern void _ZN3ccc8CC14x7y03abcEv();
extern void _ZN3ccc8CC14x7y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y03abcEv,_ZThn4_N3ccc8CC14x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y03pqrEv,_ZThn4_N3ccc8CC14x7y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y03abcEv,_ZThn4_N3ccc8CC14x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y03pqrEv,_ZThn4_N3ccc8CC14x7y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y0E[];
Class_Descriptor cd__ZN3ccc8CC14x7y0E = {  "_ZN3ccc8CC14x7y0E", // class name
  bases__ZN3ccc8CC14x7y0E, 2,
  &(vtc__ZN3ccc8CC14x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y1  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC14x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x7y13efgEv
  ~CC14x7y1(); // tgen
  CC14x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y1E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y13abcEv");}
void  ccc::CC14x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y13pqrEv");}
void  ccc::CC14x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y13efgEv");}
ccc::CC14x7y1 ::~CC14x7y1(){ note_dtor("_ZN3ccc8CC14x7y1E", this);} // tgen
ccc::CC14x7y1 ::CC14x7y1(){ note_ctor("_ZN3ccc8CC14x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y1E, buf);
    ::ccc::CC14x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y1E);
    dp->::ccc::CC14x7y1::~CC14x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y1E(Test__ZN3ccc8CC14x7y1E, "_ZN3ccc8CC14x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y1C1Ev();
extern void _ZN3ccc8CC14x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y1E[] = {
  NSPAIR(_ZN3ccc8CC14x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y1E[];
extern void _ZN3ccc8CC14x7y13pqrEv();
extern void _ZN3ccc8CC14x7y13abcEv();
extern void _ZN3ccc8CC14x7y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y13abcEv,_ZThn4_N3ccc8CC14x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y13pqrEv,_ZThn4_N3ccc8CC14x7y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y13abcEv,_ZThn4_N3ccc8CC14x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y13pqrEv,_ZThn4_N3ccc8CC14x7y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y1E[];
Class_Descriptor cd__ZN3ccc8CC14x7y1E = {  "_ZN3ccc8CC14x7y1E", // class name
  bases__ZN3ccc8CC14x7y1E, 2,
  &(vtc__ZN3ccc8CC14x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y2  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC14x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y23pqrEv
  ~CC14x7y2(); // tgen
  CC14x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y2E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y23efgEv");}
void  ccc::CC14x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y23abcEv");}
void  ccc::CC14x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y23pqrEv");}
ccc::CC14x7y2 ::~CC14x7y2(){ note_dtor("_ZN3ccc8CC14x7y2E", this);} // tgen
ccc::CC14x7y2 ::CC14x7y2(){ note_ctor("_ZN3ccc8CC14x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y2E, buf);
    ::ccc::CC14x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y2E);
    dp->::ccc::CC14x7y2::~CC14x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y2E(Test__ZN3ccc8CC14x7y2E, "_ZN3ccc8CC14x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y2C1Ev();
extern void _ZN3ccc8CC14x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y2E[] = {
  NSPAIR(_ZN3ccc8CC14x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y2E[];
extern void _ZN3ccc8CC14x7y23pqrEv();
extern void _ZN3ccc8CC14x7y23efgEv();
extern void _ZN3ccc8CC14x7y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y23abcEv,_ZThn4_N3ccc8CC14x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y23pqrEv,_ZThn4_N3ccc8CC14x7y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y23abcEv,_ZThn4_N3ccc8CC14x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y23pqrEv,_ZThn4_N3ccc8CC14x7y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y2E[];
Class_Descriptor cd__ZN3ccc8CC14x7y2E = {  "_ZN3ccc8CC14x7y2E", // class name
  bases__ZN3ccc8CC14x7y2E, 2,
  &(vtc__ZN3ccc8CC14x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y3  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC14x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x7y33abcEv
  ~CC14x7y3(); // tgen
  CC14x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y3E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y33efgEv");}
void  ccc::CC14x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y33pqrEv");}
void  ccc::CC14x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y33abcEv");}
ccc::CC14x7y3 ::~CC14x7y3(){ note_dtor("_ZN3ccc8CC14x7y3E", this);} // tgen
ccc::CC14x7y3 ::CC14x7y3(){ note_ctor("_ZN3ccc8CC14x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y3E, buf);
    ::ccc::CC14x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y3E);
    dp->::ccc::CC14x7y3::~CC14x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y3E(Test__ZN3ccc8CC14x7y3E, "_ZN3ccc8CC14x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y3C1Ev();
extern void _ZN3ccc8CC14x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y3E[] = {
  NSPAIR(_ZN3ccc8CC14x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y3E[];
extern void _ZN3ccc8CC14x7y33pqrEv();
extern void _ZN3ccc8CC14x7y33efgEv();
extern void _ZN3ccc8CC14x7y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y33abcEv,_ZThn4_N3ccc8CC14x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y33pqrEv,_ZThn4_N3ccc8CC14x7y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y33abcEv,_ZThn4_N3ccc8CC14x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y33pqrEv,_ZThn4_N3ccc8CC14x7y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y3E[];
Class_Descriptor cd__ZN3ccc8CC14x7y3E = {  "_ZN3ccc8CC14x7y3E", // class name
  bases__ZN3ccc8CC14x7y3E, 2,
  &(vtc__ZN3ccc8CC14x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y4  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC14x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x7y43efgEv
  ~CC14x7y4(); // tgen
  CC14x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y4E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y43pqrEv");}
void  ccc::CC14x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y43abcEv");}
void  ccc::CC14x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y43efgEv");}
ccc::CC14x7y4 ::~CC14x7y4(){ note_dtor("_ZN3ccc8CC14x7y4E", this);} // tgen
ccc::CC14x7y4 ::CC14x7y4(){ note_ctor("_ZN3ccc8CC14x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y4E, buf);
    ::ccc::CC14x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y4E);
    dp->::ccc::CC14x7y4::~CC14x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y4E(Test__ZN3ccc8CC14x7y4E, "_ZN3ccc8CC14x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y4C1Ev();
extern void _ZN3ccc8CC14x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y4E[] = {
  NSPAIR(_ZN3ccc8CC14x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y4E[];
extern void _ZN3ccc8CC14x7y43pqrEv();
extern void _ZN3ccc8CC14x7y43abcEv();
extern void _ZN3ccc8CC14x7y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y43abcEv,_ZThn4_N3ccc8CC14x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y43pqrEv,_ZThn4_N3ccc8CC14x7y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y43abcEv,_ZThn4_N3ccc8CC14x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y43pqrEv,_ZThn4_N3ccc8CC14x7y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y4E[];
Class_Descriptor cd__ZN3ccc8CC14x7y4E = {  "_ZN3ccc8CC14x7y4E", // class name
  bases__ZN3ccc8CC14x7y4E, 2,
  &(vtc__ZN3ccc8CC14x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y5  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC14x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x7y53abcEv
  ~CC14x7y5(); // tgen
  CC14x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y5E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y53pqrEv");}
void  ccc::CC14x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y53efgEv");}
void  ccc::CC14x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y53abcEv");}
ccc::CC14x7y5 ::~CC14x7y5(){ note_dtor("_ZN3ccc8CC14x7y5E", this);} // tgen
ccc::CC14x7y5 ::CC14x7y5(){ note_ctor("_ZN3ccc8CC14x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y5E, buf);
    ::ccc::CC14x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y5E);
    dp->::ccc::CC14x7y5::~CC14x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y5E(Test__ZN3ccc8CC14x7y5E, "_ZN3ccc8CC14x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y5C1Ev();
extern void _ZN3ccc8CC14x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y5E[] = {
  NSPAIR(_ZN3ccc8CC14x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y5E[];
extern void _ZN3ccc8CC14x7y53pqrEv();
extern void _ZN3ccc8CC14x7y53efgEv();
extern void _ZN3ccc8CC14x7y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y53abcEv,_ZThn4_N3ccc8CC14x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y53pqrEv,_ZThn4_N3ccc8CC14x7y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y53abcEv,_ZThn4_N3ccc8CC14x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y53pqrEv,_ZThn4_N3ccc8CC14x7y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y5E[];
Class_Descriptor cd__ZN3ccc8CC14x7y5E = {  "_ZN3ccc8CC14x7y5E", // class name
  bases__ZN3ccc8CC14x7y5E, 2,
  &(vtc__ZN3ccc8CC14x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y6  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC14x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x7y63efgEv
  ~CC14x7y6(); // tgen
  CC14x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y6E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y63abcEv");}
void  ccc::CC14x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y63efgEv");}
ccc::CC14x7y6 ::~CC14x7y6(){ note_dtor("_ZN3ccc8CC14x7y6E", this);} // tgen
ccc::CC14x7y6 ::CC14x7y6(){ note_ctor("_ZN3ccc8CC14x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y6E, buf);
    ::ccc::CC14x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y6E);
    dp->::ccc::CC14x7y6::~CC14x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y6E(Test__ZN3ccc8CC14x7y6E, "_ZN3ccc8CC14x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y6C1Ev();
extern void _ZN3ccc8CC14x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y6E[] = {
  NSPAIR(_ZN3ccc8CC14x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x7y63abcEv();
extern void _ZN3ccc8CC14x7y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y63abcEv,_ZThn4_N3ccc8CC14x7y63abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y63abcEv,_ZThn4_N3ccc8CC14x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y6E[];
Class_Descriptor cd__ZN3ccc8CC14x7y6E = {  "_ZN3ccc8CC14x7y6E", // class name
  bases__ZN3ccc8CC14x7y6E, 2,
  &(vtc__ZN3ccc8CC14x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y7  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC14x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y73pqrEv
  ~CC14x7y7(); // tgen
  CC14x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y7E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y73abcEv");}
void  ccc::CC14x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y73pqrEv");}
ccc::CC14x7y7 ::~CC14x7y7(){ note_dtor("_ZN3ccc8CC14x7y7E", this);} // tgen
ccc::CC14x7y7 ::CC14x7y7(){ note_ctor("_ZN3ccc8CC14x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y7E, buf);
    ::ccc::CC14x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y7E);
    dp->::ccc::CC14x7y7::~CC14x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y7E(Test__ZN3ccc8CC14x7y7E, "_ZN3ccc8CC14x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y7C1Ev();
extern void _ZN3ccc8CC14x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y7E[] = {
  NSPAIR(_ZN3ccc8CC14x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y7E[];
extern void _ZN3ccc8CC14x7y73pqrEv();
extern void _ZN3ccc8CC14x7y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y73abcEv,_ZThn4_N3ccc8CC14x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y73pqrEv,_ZThn4_N3ccc8CC14x7y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y73abcEv,_ZThn4_N3ccc8CC14x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y73pqrEv,_ZThn4_N3ccc8CC14x7y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y7E[];
Class_Descriptor cd__ZN3ccc8CC14x7y7E = {  "_ZN3ccc8CC14x7y7E", // class name
  bases__ZN3ccc8CC14x7y7E, 2,
  &(vtc__ZN3ccc8CC14x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y8  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC14x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x7y83abcEv
  ~CC14x7y8(); // tgen
  CC14x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y8E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y83efgEv");}
void  ccc::CC14x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x7y83abcEv");}
ccc::CC14x7y8 ::~CC14x7y8(){ note_dtor("_ZN3ccc8CC14x7y8E", this);} // tgen
ccc::CC14x7y8 ::CC14x7y8(){ note_ctor("_ZN3ccc8CC14x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y8E, buf);
    ::ccc::CC14x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y8E);
    dp->::ccc::CC14x7y8::~CC14x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y8E(Test__ZN3ccc8CC14x7y8E, "_ZN3ccc8CC14x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y8C1Ev();
extern void _ZN3ccc8CC14x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y8E[] = {
  NSPAIR(_ZN3ccc8CC14x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x7y83efgEv();
extern void _ZN3ccc8CC14x7y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y83abcEv,_ZThn4_N3ccc8CC14x7y83abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y83abcEv,_ZThn4_N3ccc8CC14x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y8E[];
Class_Descriptor cd__ZN3ccc8CC14x7y8E = {  "_ZN3ccc8CC14x7y8E", // class name
  bases__ZN3ccc8CC14x7y8E, 2,
  &(vtc__ZN3ccc8CC14x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y9  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC14x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x7y93pqrEv
  ~CC14x7y9(); // tgen
  CC14x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x7y9E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x7y93efgEv");}
void  ccc::CC14x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x7y93pqrEv");}
ccc::CC14x7y9 ::~CC14x7y9(){ note_dtor("_ZN3ccc8CC14x7y9E", this);} // tgen
ccc::CC14x7y9 ::CC14x7y9(){ note_ctor("_ZN3ccc8CC14x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x7y9E, buf);
    ::ccc::CC14x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x7y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8CC14x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x7y9E);
    dp->::ccc::CC14x7y9::~CC14x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x7y9E(Test__ZN3ccc8CC14x7y9E, "_ZN3ccc8CC14x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x7y9C1Ev();
extern void _ZN3ccc8CC14x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x7y9E[] = {
  NSPAIR(_ZN3ccc8CC14x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC14x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y9E[];
extern void _ZN3ccc8CC14x7y93pqrEv();
extern void _ZN3ccc8CC14x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x7y93pqrEv,_ZThn4_N3ccc8CC14x7y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x7y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x7y93pqrEv,_ZThn4_N3ccc8CC14x7y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x7y9E[];
Class_Descriptor cd__ZN3ccc8CC14x7y9E = {  "_ZN3ccc8CC14x7y9E", // class name
  bases__ZN3ccc8CC14x7y9E, 2,
  &(vtc__ZN3ccc8CC14x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x7y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y10  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC14x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x7y103abcEv
  ~CC14x7y10(); // tgen
  CC14x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y10E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x7y103pqrEv");}
void  ccc::CC14x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x7y103abcEv");}
ccc::CC14x7y10 ::~CC14x7y10(){ note_dtor("_ZN3ccc9CC14x7y10E", this);} // tgen
ccc::CC14x7y10 ::CC14x7y10(){ note_ctor("_ZN3ccc9CC14x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y10E, buf);
    ::ccc::CC14x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y10E);
    dp->::ccc::CC14x7y10::~CC14x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y10E(Test__ZN3ccc9CC14x7y10E, "_ZN3ccc9CC14x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y10C1Ev();
extern void _ZN3ccc9CC14x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y10E[] = {
  NSPAIR(_ZN3ccc9CC14x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y10E[];
extern void _ZN3ccc9CC14x7y103pqrEv();
extern void _ZN3ccc9CC14x7y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x7y103abcEv,_ZThn4_N3ccc9CC14x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x7y103pqrEv,_ZThn4_N3ccc9CC14x7y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x7y103abcEv,_ZThn4_N3ccc9CC14x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x7y103pqrEv,_ZThn4_N3ccc9CC14x7y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y10E[];
Class_Descriptor cd__ZN3ccc9CC14x7y10E = {  "_ZN3ccc9CC14x7y10E", // class name
  bases__ZN3ccc9CC14x7y10E, 2,
  &(vtc__ZN3ccc9CC14x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y11  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC14x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x7y113efgEv
  ~CC14x7y11(); // tgen
  CC14x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y11E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x7y113pqrEv");}
void  ccc::CC14x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x7y113efgEv");}
ccc::CC14x7y11 ::~CC14x7y11(){ note_dtor("_ZN3ccc9CC14x7y11E", this);} // tgen
ccc::CC14x7y11 ::CC14x7y11(){ note_ctor("_ZN3ccc9CC14x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y11E, buf);
    ::ccc::CC14x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y11E);
    dp->::ccc::CC14x7y11::~CC14x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y11E(Test__ZN3ccc9CC14x7y11E, "_ZN3ccc9CC14x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y11C1Ev();
extern void _ZN3ccc9CC14x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y11E[] = {
  NSPAIR(_ZN3ccc9CC14x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y11E[];
extern void _ZN3ccc9CC14x7y113pqrEv();
extern void _ZN3ccc9CC14x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x7y113pqrEv,_ZThn4_N3ccc9CC14x7y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x7y113pqrEv,_ZThn4_N3ccc9CC14x7y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y11E[];
Class_Descriptor cd__ZN3ccc9CC14x7y11E = {  "_ZN3ccc9CC14x7y11E", // class name
  bases__ZN3ccc9CC14x7y11E, 2,
  &(vtc__ZN3ccc9CC14x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y12  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC14x7y123abcEv
  ~CC14x7y12(); // tgen
  CC14x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y12E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x7y123abcEv");}
ccc::CC14x7y12 ::~CC14x7y12(){ note_dtor("_ZN3ccc9CC14x7y12E", this);} // tgen
ccc::CC14x7y12 ::CC14x7y12(){ note_ctor("_ZN3ccc9CC14x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y12E, buf);
    ::ccc::CC14x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y12E);
    dp->::ccc::CC14x7y12::~CC14x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y12E(Test__ZN3ccc9CC14x7y12E, "_ZN3ccc9CC14x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y12C1Ev();
extern void _ZN3ccc9CC14x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y12E[] = {
  NSPAIR(_ZN3ccc9CC14x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x7y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x7y123abcEv,_ZThn4_N3ccc9CC14x7y123abcEv)();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x7y123abcEv,_ZThn4_N3ccc9CC14x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y12E[];
Class_Descriptor cd__ZN3ccc9CC14x7y12E = {  "_ZN3ccc9CC14x7y12E", // class name
  bases__ZN3ccc9CC14x7y12E, 2,
  &(vtc__ZN3ccc9CC14x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y13  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC14x7y133efgEv
  ~CC14x7y13(); // tgen
  CC14x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y13E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x7y133efgEv");}
ccc::CC14x7y13 ::~CC14x7y13(){ note_dtor("_ZN3ccc9CC14x7y13E", this);} // tgen
ccc::CC14x7y13 ::CC14x7y13(){ note_ctor("_ZN3ccc9CC14x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y13E, buf);
    ::ccc::CC14x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y13E);
    dp->::ccc::CC14x7y13::~CC14x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y13E(Test__ZN3ccc9CC14x7y13E, "_ZN3ccc9CC14x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y13C1Ev();
extern void _ZN3ccc9CC14x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y13E[] = {
  NSPAIR(_ZN3ccc9CC14x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y13E[];
Class_Descriptor cd__ZN3ccc9CC14x7y13E = {  "_ZN3ccc9CC14x7y13E", // class name
  bases__ZN3ccc9CC14x7y13E, 2,
  &(vtc__ZN3ccc9CC14x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y14  : ::ccc::AA14 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC14x7y143pqrEv
  ~CC14x7y14(); // tgen
  CC14x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y14E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC14x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x7y143pqrEv");}
ccc::CC14x7y14 ::~CC14x7y14(){ note_dtor("_ZN3ccc9CC14x7y14E", this);} // tgen
ccc::CC14x7y14 ::CC14x7y14(){ note_ctor("_ZN3ccc9CC14x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y14E, buf);
    ::ccc::CC14x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y14E);
    dp->::ccc::CC14x7y14::~CC14x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y14E(Test__ZN3ccc9CC14x7y14E, "_ZN3ccc9CC14x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y14C1Ev();
extern void _ZN3ccc9CC14x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y14E[] = {
  NSPAIR(_ZN3ccc9CC14x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y14E[];
extern void _ZN3ccc9CC14x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x7y143pqrEv,_ZThn4_N3ccc9CC14x7y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x7y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x7y143pqrEv,_ZThn4_N3ccc9CC14x7y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y14E[];
Class_Descriptor cd__ZN3ccc9CC14x7y14E = {  "_ZN3ccc9CC14x7y14E", // class name
  bases__ZN3ccc9CC14x7y14E, 2,
  &(vtc__ZN3ccc9CC14x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x7y15  : ::ccc::AA14 , ::ccc::BB7 {
  ~CC14x7y15(); // tgen
  CC14x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x7y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x7y15 ::~CC14x7y15(){ note_dtor("_ZN3ccc9CC14x7y15E", this);} // tgen
ccc::CC14x7y15 ::CC14x7y15(){ note_ctor("_ZN3ccc9CC14x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x7y15E, buf);
    ::ccc::CC14x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x7y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc9CC14x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x7y15E);
    dp->::ccc::CC14x7y15::~CC14x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x7y15E(Test__ZN3ccc9CC14x7y15E, "_ZN3ccc9CC14x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x7y15C1Ev();
extern void _ZN3ccc9CC14x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x7y15E[] = {
  NSPAIR(_ZN3ccc9CC14x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC14x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x7y15E[];
Class_Descriptor cd__ZN3ccc9CC14x7y15E = {  "_ZN3ccc9CC14x7y15E", // class name
  bases__ZN3ccc9CC14x7y15E, 2,
  &(vtc__ZN3ccc9CC14x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x7y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y0  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC14x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y03pqrEv
  ~CC14x8y0(); // tgen
  CC14x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y0E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y03abcEv");}
void  ccc::CC14x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y03efgEv");}
void  ccc::CC14x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y03pqrEv");}
ccc::CC14x8y0 ::~CC14x8y0(){ note_dtor("_ZN3ccc8CC14x8y0E", this);} // tgen
ccc::CC14x8y0 ::CC14x8y0(){ note_ctor("_ZN3ccc8CC14x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y0E, buf);
    ::ccc::CC14x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y0E);
    dp->::ccc::CC14x8y0::~CC14x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y0E(Test__ZN3ccc8CC14x8y0E, "_ZN3ccc8CC14x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y0C1Ev();
extern void _ZN3ccc8CC14x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y0E[] = {
  NSPAIR(_ZN3ccc8CC14x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y0E[];
extern void _ZN3ccc8CC14x8y03pqrEv();
extern void _ZN3ccc8CC14x8y03abcEv();
extern void _ZN3ccc8CC14x8y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y03efgEv,_ZThn4_N3ccc8CC14x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y03abcEv,_ZThn4_N3ccc8CC14x8y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y03efgEv,_ZThn4_N3ccc8CC14x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y03abcEv,_ZThn4_N3ccc8CC14x8y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y0E[];
Class_Descriptor cd__ZN3ccc8CC14x8y0E = {  "_ZN3ccc8CC14x8y0E", // class name
  bases__ZN3ccc8CC14x8y0E, 2,
  &(vtc__ZN3ccc8CC14x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y1  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC14x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x8y13efgEv
  ~CC14x8y1(); // tgen
  CC14x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y1E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y13abcEv");}
void  ccc::CC14x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y13pqrEv");}
void  ccc::CC14x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y13efgEv");}
ccc::CC14x8y1 ::~CC14x8y1(){ note_dtor("_ZN3ccc8CC14x8y1E", this);} // tgen
ccc::CC14x8y1 ::CC14x8y1(){ note_ctor("_ZN3ccc8CC14x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y1E, buf);
    ::ccc::CC14x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y1E);
    dp->::ccc::CC14x8y1::~CC14x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y1E(Test__ZN3ccc8CC14x8y1E, "_ZN3ccc8CC14x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y1C1Ev();
extern void _ZN3ccc8CC14x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y1E[] = {
  NSPAIR(_ZN3ccc8CC14x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y1E[];
extern void _ZN3ccc8CC14x8y13pqrEv();
extern void _ZN3ccc8CC14x8y13abcEv();
extern void _ZN3ccc8CC14x8y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y13efgEv,_ZThn4_N3ccc8CC14x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y13abcEv,_ZThn4_N3ccc8CC14x8y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y13efgEv,_ZThn4_N3ccc8CC14x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y13abcEv,_ZThn4_N3ccc8CC14x8y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y1E[];
Class_Descriptor cd__ZN3ccc8CC14x8y1E = {  "_ZN3ccc8CC14x8y1E", // class name
  bases__ZN3ccc8CC14x8y1E, 2,
  &(vtc__ZN3ccc8CC14x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y2  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC14x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y23pqrEv
  ~CC14x8y2(); // tgen
  CC14x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y2E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y23efgEv");}
void  ccc::CC14x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y23abcEv");}
void  ccc::CC14x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y23pqrEv");}
ccc::CC14x8y2 ::~CC14x8y2(){ note_dtor("_ZN3ccc8CC14x8y2E", this);} // tgen
ccc::CC14x8y2 ::CC14x8y2(){ note_ctor("_ZN3ccc8CC14x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y2E, buf);
    ::ccc::CC14x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y2E);
    dp->::ccc::CC14x8y2::~CC14x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y2E(Test__ZN3ccc8CC14x8y2E, "_ZN3ccc8CC14x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y2C1Ev();
extern void _ZN3ccc8CC14x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y2E[] = {
  NSPAIR(_ZN3ccc8CC14x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y2E[];
extern void _ZN3ccc8CC14x8y23pqrEv();
extern void _ZN3ccc8CC14x8y23efgEv();
extern void _ZN3ccc8CC14x8y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y23efgEv,_ZThn4_N3ccc8CC14x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y23abcEv,_ZThn4_N3ccc8CC14x8y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y23efgEv,_ZThn4_N3ccc8CC14x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y23abcEv,_ZThn4_N3ccc8CC14x8y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y2E[];
Class_Descriptor cd__ZN3ccc8CC14x8y2E = {  "_ZN3ccc8CC14x8y2E", // class name
  bases__ZN3ccc8CC14x8y2E, 2,
  &(vtc__ZN3ccc8CC14x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y3  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC14x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x8y33abcEv
  ~CC14x8y3(); // tgen
  CC14x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y3E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y33efgEv");}
void  ccc::CC14x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y33pqrEv");}
void  ccc::CC14x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y33abcEv");}
ccc::CC14x8y3 ::~CC14x8y3(){ note_dtor("_ZN3ccc8CC14x8y3E", this);} // tgen
ccc::CC14x8y3 ::CC14x8y3(){ note_ctor("_ZN3ccc8CC14x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y3E, buf);
    ::ccc::CC14x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y3E);
    dp->::ccc::CC14x8y3::~CC14x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y3E(Test__ZN3ccc8CC14x8y3E, "_ZN3ccc8CC14x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y3C1Ev();
extern void _ZN3ccc8CC14x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y3E[] = {
  NSPAIR(_ZN3ccc8CC14x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y3E[];
extern void _ZN3ccc8CC14x8y33pqrEv();
extern void _ZN3ccc8CC14x8y33efgEv();
extern void _ZN3ccc8CC14x8y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y33efgEv,_ZThn4_N3ccc8CC14x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y33abcEv,_ZThn4_N3ccc8CC14x8y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y33efgEv,_ZThn4_N3ccc8CC14x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y33abcEv,_ZThn4_N3ccc8CC14x8y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y3E[];
Class_Descriptor cd__ZN3ccc8CC14x8y3E = {  "_ZN3ccc8CC14x8y3E", // class name
  bases__ZN3ccc8CC14x8y3E, 2,
  &(vtc__ZN3ccc8CC14x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y4  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC14x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x8y43efgEv
  ~CC14x8y4(); // tgen
  CC14x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y4E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y43pqrEv");}
void  ccc::CC14x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y43abcEv");}
void  ccc::CC14x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y43efgEv");}
ccc::CC14x8y4 ::~CC14x8y4(){ note_dtor("_ZN3ccc8CC14x8y4E", this);} // tgen
ccc::CC14x8y4 ::CC14x8y4(){ note_ctor("_ZN3ccc8CC14x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y4E, buf);
    ::ccc::CC14x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y4E);
    dp->::ccc::CC14x8y4::~CC14x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y4E(Test__ZN3ccc8CC14x8y4E, "_ZN3ccc8CC14x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y4C1Ev();
extern void _ZN3ccc8CC14x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y4E[] = {
  NSPAIR(_ZN3ccc8CC14x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y4E[];
extern void _ZN3ccc8CC14x8y43pqrEv();
extern void _ZN3ccc8CC14x8y43abcEv();
extern void _ZN3ccc8CC14x8y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y43efgEv,_ZThn4_N3ccc8CC14x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y43abcEv,_ZThn4_N3ccc8CC14x8y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y43efgEv,_ZThn4_N3ccc8CC14x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y43abcEv,_ZThn4_N3ccc8CC14x8y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y4E[];
Class_Descriptor cd__ZN3ccc8CC14x8y4E = {  "_ZN3ccc8CC14x8y4E", // class name
  bases__ZN3ccc8CC14x8y4E, 2,
  &(vtc__ZN3ccc8CC14x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y5  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC14x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x8y53abcEv
  ~CC14x8y5(); // tgen
  CC14x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y5E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y53pqrEv");}
void  ccc::CC14x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y53efgEv");}
void  ccc::CC14x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y53abcEv");}
ccc::CC14x8y5 ::~CC14x8y5(){ note_dtor("_ZN3ccc8CC14x8y5E", this);} // tgen
ccc::CC14x8y5 ::CC14x8y5(){ note_ctor("_ZN3ccc8CC14x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y5E, buf);
    ::ccc::CC14x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y5E);
    dp->::ccc::CC14x8y5::~CC14x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y5E(Test__ZN3ccc8CC14x8y5E, "_ZN3ccc8CC14x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y5C1Ev();
extern void _ZN3ccc8CC14x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y5E[] = {
  NSPAIR(_ZN3ccc8CC14x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y5E[];
extern void _ZN3ccc8CC14x8y53pqrEv();
extern void _ZN3ccc8CC14x8y53efgEv();
extern void _ZN3ccc8CC14x8y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y53efgEv,_ZThn4_N3ccc8CC14x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y53abcEv,_ZThn4_N3ccc8CC14x8y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y53efgEv,_ZThn4_N3ccc8CC14x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y53abcEv,_ZThn4_N3ccc8CC14x8y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y5E[];
Class_Descriptor cd__ZN3ccc8CC14x8y5E = {  "_ZN3ccc8CC14x8y5E", // class name
  bases__ZN3ccc8CC14x8y5E, 2,
  &(vtc__ZN3ccc8CC14x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y6  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC14x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x8y63efgEv
  ~CC14x8y6(); // tgen
  CC14x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y6E) C1{ BC2{ v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y63abcEv");}
void  ccc::CC14x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y63efgEv");}
ccc::CC14x8y6 ::~CC14x8y6(){ note_dtor("_ZN3ccc8CC14x8y6E", this);} // tgen
ccc::CC14x8y6 ::CC14x8y6(){ note_ctor("_ZN3ccc8CC14x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y6E, buf);
    ::ccc::CC14x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y6E);
    dp->::ccc::CC14x8y6::~CC14x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y6E(Test__ZN3ccc8CC14x8y6E, "_ZN3ccc8CC14x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y6C1Ev();
extern void _ZN3ccc8CC14x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y6E[] = {
  NSPAIR(_ZN3ccc8CC14x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x8y63abcEv();
extern void _ZN3ccc8CC14x8y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y63efgEv,_ZThn4_N3ccc8CC14x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y63abcEv,_ZThn4_N3ccc8CC14x8y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y63efgEv,_ZThn4_N3ccc8CC14x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y63abcEv,_ZThn4_N3ccc8CC14x8y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y6E[];
Class_Descriptor cd__ZN3ccc8CC14x8y6E = {  "_ZN3ccc8CC14x8y6E", // class name
  bases__ZN3ccc8CC14x8y6E, 2,
  &(vtc__ZN3ccc8CC14x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y7  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC14x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y73pqrEv
  ~CC14x8y7(); // tgen
  CC14x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y7E) C1{ BC2{ v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y73abcEv");}
void  ccc::CC14x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y73pqrEv");}
ccc::CC14x8y7 ::~CC14x8y7(){ note_dtor("_ZN3ccc8CC14x8y7E", this);} // tgen
ccc::CC14x8y7 ::CC14x8y7(){ note_ctor("_ZN3ccc8CC14x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y7E, buf);
    ::ccc::CC14x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y7E);
    dp->::ccc::CC14x8y7::~CC14x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y7E(Test__ZN3ccc8CC14x8y7E, "_ZN3ccc8CC14x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y7C1Ev();
extern void _ZN3ccc8CC14x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y7E[] = {
  NSPAIR(_ZN3ccc8CC14x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y7E[];
extern void _ZN3ccc8CC14x8y73pqrEv();
extern void _ZN3ccc8CC14x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y73abcEv,_ZThn4_N3ccc8CC14x8y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y73abcEv,_ZThn4_N3ccc8CC14x8y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y7E[];
Class_Descriptor cd__ZN3ccc8CC14x8y7E = {  "_ZN3ccc8CC14x8y7E", // class name
  bases__ZN3ccc8CC14x8y7E, 2,
  &(vtc__ZN3ccc8CC14x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y8  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC14x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x8y83abcEv
  ~CC14x8y8(); // tgen
  CC14x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y8E) C1{ BC2{ v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y83efgEv");}
void  ccc::CC14x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x8y83abcEv");}
ccc::CC14x8y8 ::~CC14x8y8(){ note_dtor("_ZN3ccc8CC14x8y8E", this);} // tgen
ccc::CC14x8y8 ::CC14x8y8(){ note_ctor("_ZN3ccc8CC14x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y8E, buf);
    ::ccc::CC14x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y8E);
    dp->::ccc::CC14x8y8::~CC14x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y8E(Test__ZN3ccc8CC14x8y8E, "_ZN3ccc8CC14x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y8C1Ev();
extern void _ZN3ccc8CC14x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y8E[] = {
  NSPAIR(_ZN3ccc8CC14x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x8y83efgEv();
extern void _ZN3ccc8CC14x8y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y83efgEv,_ZThn4_N3ccc8CC14x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y83abcEv,_ZThn4_N3ccc8CC14x8y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y83efgEv,_ZThn4_N3ccc8CC14x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y83abcEv,_ZThn4_N3ccc8CC14x8y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y8E[];
Class_Descriptor cd__ZN3ccc8CC14x8y8E = {  "_ZN3ccc8CC14x8y8E", // class name
  bases__ZN3ccc8CC14x8y8E, 2,
  &(vtc__ZN3ccc8CC14x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y9  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC14x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x8y93pqrEv
  ~CC14x8y9(); // tgen
  CC14x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x8y9E) C1{ BC2{ v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x8y93efgEv");}
void  ccc::CC14x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x8y93pqrEv");}
ccc::CC14x8y9 ::~CC14x8y9(){ note_dtor("_ZN3ccc8CC14x8y9E", this);} // tgen
ccc::CC14x8y9 ::CC14x8y9(){ note_ctor("_ZN3ccc8CC14x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x8y9E, buf);
    ::ccc::CC14x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x8y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8CC14x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x8y9E);
    dp->::ccc::CC14x8y9::~CC14x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x8y9E(Test__ZN3ccc8CC14x8y9E, "_ZN3ccc8CC14x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x8y9C1Ev();
extern void _ZN3ccc8CC14x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x8y9E[] = {
  NSPAIR(_ZN3ccc8CC14x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC14x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y9E[];
extern void _ZN3ccc8CC14x8y93pqrEv();
extern void _ZN3ccc8CC14x8y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x8y93efgEv,_ZThn4_N3ccc8CC14x8y93efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x8y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x8y93efgEv,_ZThn4_N3ccc8CC14x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x8y9E[];
Class_Descriptor cd__ZN3ccc8CC14x8y9E = {  "_ZN3ccc8CC14x8y9E", // class name
  bases__ZN3ccc8CC14x8y9E, 2,
  &(vtc__ZN3ccc8CC14x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x8y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y10  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC14x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x8y103abcEv
  ~CC14x8y10(); // tgen
  CC14x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y10E) C1{ BC2{ v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x8y103pqrEv");}
void  ccc::CC14x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x8y103abcEv");}
ccc::CC14x8y10 ::~CC14x8y10(){ note_dtor("_ZN3ccc9CC14x8y10E", this);} // tgen
ccc::CC14x8y10 ::CC14x8y10(){ note_ctor("_ZN3ccc9CC14x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y10E, buf);
    ::ccc::CC14x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y10E);
    dp->::ccc::CC14x8y10::~CC14x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y10E(Test__ZN3ccc9CC14x8y10E, "_ZN3ccc9CC14x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y10C1Ev();
extern void _ZN3ccc9CC14x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y10E[] = {
  NSPAIR(_ZN3ccc9CC14x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y10E[];
extern void _ZN3ccc9CC14x8y103pqrEv();
extern void _ZN3ccc9CC14x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x8y103abcEv,_ZThn4_N3ccc9CC14x8y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x8y103abcEv,_ZThn4_N3ccc9CC14x8y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y10E[];
Class_Descriptor cd__ZN3ccc9CC14x8y10E = {  "_ZN3ccc9CC14x8y10E", // class name
  bases__ZN3ccc9CC14x8y10E, 2,
  &(vtc__ZN3ccc9CC14x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y11  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC14x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x8y113efgEv
  ~CC14x8y11(); // tgen
  CC14x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y11E) C1{ BC2{ v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x8y113pqrEv");}
void  ccc::CC14x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x8y113efgEv");}
ccc::CC14x8y11 ::~CC14x8y11(){ note_dtor("_ZN3ccc9CC14x8y11E", this);} // tgen
ccc::CC14x8y11 ::CC14x8y11(){ note_ctor("_ZN3ccc9CC14x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y11E, buf);
    ::ccc::CC14x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y11E);
    dp->::ccc::CC14x8y11::~CC14x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y11E(Test__ZN3ccc9CC14x8y11E, "_ZN3ccc9CC14x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y11C1Ev();
extern void _ZN3ccc9CC14x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y11E[] = {
  NSPAIR(_ZN3ccc9CC14x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y11E[];
extern void _ZN3ccc9CC14x8y113pqrEv();
extern void _ZN3ccc9CC14x8y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x8y113efgEv,_ZThn4_N3ccc9CC14x8y113efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x8y113efgEv,_ZThn4_N3ccc9CC14x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y11E[];
Class_Descriptor cd__ZN3ccc9CC14x8y11E = {  "_ZN3ccc9CC14x8y11E", // class name
  bases__ZN3ccc9CC14x8y11E, 2,
  &(vtc__ZN3ccc9CC14x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y12  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC14x8y123abcEv
  ~CC14x8y12(); // tgen
  CC14x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y12E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x8y123abcEv");}
ccc::CC14x8y12 ::~CC14x8y12(){ note_dtor("_ZN3ccc9CC14x8y12E", this);} // tgen
ccc::CC14x8y12 ::CC14x8y12(){ note_ctor("_ZN3ccc9CC14x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y12E, buf);
    ::ccc::CC14x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y12E);
    dp->::ccc::CC14x8y12::~CC14x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y12E(Test__ZN3ccc9CC14x8y12E, "_ZN3ccc9CC14x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y12C1Ev();
extern void _ZN3ccc9CC14x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y12E[] = {
  NSPAIR(_ZN3ccc9CC14x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x8y123abcEv,_ZThn4_N3ccc9CC14x8y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x8y123abcEv,_ZThn4_N3ccc9CC14x8y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y12E[];
Class_Descriptor cd__ZN3ccc9CC14x8y12E = {  "_ZN3ccc9CC14x8y12E", // class name
  bases__ZN3ccc9CC14x8y12E, 2,
  &(vtc__ZN3ccc9CC14x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y13  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC14x8y133efgEv
  ~CC14x8y13(); // tgen
  CC14x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y13E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x8y133efgEv");}
ccc::CC14x8y13 ::~CC14x8y13(){ note_dtor("_ZN3ccc9CC14x8y13E", this);} // tgen
ccc::CC14x8y13 ::CC14x8y13(){ note_ctor("_ZN3ccc9CC14x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y13E, buf);
    ::ccc::CC14x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y13E);
    dp->::ccc::CC14x8y13::~CC14x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y13E(Test__ZN3ccc9CC14x8y13E, "_ZN3ccc9CC14x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y13C1Ev();
extern void _ZN3ccc9CC14x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y13E[] = {
  NSPAIR(_ZN3ccc9CC14x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x8y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x8y133efgEv,_ZThn4_N3ccc9CC14x8y133efgEv)();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x8y133efgEv,_ZThn4_N3ccc9CC14x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y13E[];
Class_Descriptor cd__ZN3ccc9CC14x8y13E = {  "_ZN3ccc9CC14x8y13E", // class name
  bases__ZN3ccc9CC14x8y13E, 2,
  &(vtc__ZN3ccc9CC14x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y14  : ::ccc::AA14 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC14x8y143pqrEv
  ~CC14x8y14(); // tgen
  CC14x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y14E) C1{ BC2{ v1} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC14x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x8y143pqrEv");}
ccc::CC14x8y14 ::~CC14x8y14(){ note_dtor("_ZN3ccc9CC14x8y14E", this);} // tgen
ccc::CC14x8y14 ::CC14x8y14(){ note_ctor("_ZN3ccc9CC14x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y14E, buf);
    ::ccc::CC14x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y14E);
    dp->::ccc::CC14x8y14::~CC14x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y14E(Test__ZN3ccc9CC14x8y14E, "_ZN3ccc9CC14x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y14C1Ev();
extern void _ZN3ccc9CC14x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y14E[] = {
  NSPAIR(_ZN3ccc9CC14x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y14E[];
extern void _ZN3ccc9CC14x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x8y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y14E[];
Class_Descriptor cd__ZN3ccc9CC14x8y14E = {  "_ZN3ccc9CC14x8y14E", // class name
  bases__ZN3ccc9CC14x8y14E, 2,
  &(vtc__ZN3ccc9CC14x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x8y15  : ::ccc::AA14 , ::ccc::BB8 {
  ~CC14x8y15(); // tgen
  CC14x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x8y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x8y15 ::~CC14x8y15(){ note_dtor("_ZN3ccc9CC14x8y15E", this);} // tgen
ccc::CC14x8y15 ::CC14x8y15(){ note_ctor("_ZN3ccc9CC14x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x8y15E, buf);
    ::ccc::CC14x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x8y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc9CC14x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x8y15E);
    dp->::ccc::CC14x8y15::~CC14x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x8y15E(Test__ZN3ccc9CC14x8y15E, "_ZN3ccc9CC14x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x8y15C1Ev();
extern void _ZN3ccc9CC14x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x8y15E[] = {
  NSPAIR(_ZN3ccc9CC14x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC14x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x8y15E[];
Class_Descriptor cd__ZN3ccc9CC14x8y15E = {  "_ZN3ccc9CC14x8y15E", // class name
  bases__ZN3ccc9CC14x8y15E, 2,
  &(vtc__ZN3ccc9CC14x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x8y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y0  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC14x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC14x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y03pqrEv
  ~CC14x9y0(); // tgen
  CC14x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y0E) C1{ BC2{ v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y03abcEv");}
void  ccc::CC14x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y03efgEv");}
void  ccc::CC14x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y03pqrEv");}
ccc::CC14x9y0 ::~CC14x9y0(){ note_dtor("_ZN3ccc8CC14x9y0E", this);} // tgen
ccc::CC14x9y0 ::CC14x9y0(){ note_ctor("_ZN3ccc8CC14x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y0E, buf);
    ::ccc::CC14x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y0E);
    dp->::ccc::CC14x9y0::~CC14x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y0E(Test__ZN3ccc8CC14x9y0E, "_ZN3ccc8CC14x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y0C1Ev();
extern void _ZN3ccc8CC14x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y0E[] = {
  NSPAIR(_ZN3ccc8CC14x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y0E[];
extern void _ZN3ccc8CC14x9y03pqrEv();
extern void _ZN3ccc8CC14x9y03abcEv();
extern void _ZN3ccc8CC14x9y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y03efgEv,_ZThn4_N3ccc8CC14x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y03pqrEv,_ZThn4_N3ccc8CC14x9y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y03efgEv,_ZThn4_N3ccc8CC14x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y03pqrEv,_ZThn4_N3ccc8CC14x9y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y0E[];
Class_Descriptor cd__ZN3ccc8CC14x9y0E = {  "_ZN3ccc8CC14x9y0E", // class name
  bases__ZN3ccc8CC14x9y0E, 2,
  &(vtc__ZN3ccc8CC14x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y1  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC14x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x9y13efgEv
  ~CC14x9y1(); // tgen
  CC14x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y1E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y13abcEv");}
void  ccc::CC14x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y13pqrEv");}
void  ccc::CC14x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y13efgEv");}
ccc::CC14x9y1 ::~CC14x9y1(){ note_dtor("_ZN3ccc8CC14x9y1E", this);} // tgen
ccc::CC14x9y1 ::CC14x9y1(){ note_ctor("_ZN3ccc8CC14x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y1E, buf);
    ::ccc::CC14x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y1E);
    dp->::ccc::CC14x9y1::~CC14x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y1E(Test__ZN3ccc8CC14x9y1E, "_ZN3ccc8CC14x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y1C1Ev();
extern void _ZN3ccc8CC14x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y1E[] = {
  NSPAIR(_ZN3ccc8CC14x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y1E[];
extern void _ZN3ccc8CC14x9y13pqrEv();
extern void _ZN3ccc8CC14x9y13abcEv();
extern void _ZN3ccc8CC14x9y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y13efgEv,_ZThn4_N3ccc8CC14x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y13pqrEv,_ZThn4_N3ccc8CC14x9y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y13efgEv,_ZThn4_N3ccc8CC14x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y13pqrEv,_ZThn4_N3ccc8CC14x9y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y1E[];
Class_Descriptor cd__ZN3ccc8CC14x9y1E = {  "_ZN3ccc8CC14x9y1E", // class name
  bases__ZN3ccc8CC14x9y1E, 2,
  &(vtc__ZN3ccc8CC14x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y2  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC14x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC14x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y23pqrEv
  ~CC14x9y2(); // tgen
  CC14x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y2E) C1{ BC2{ v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y23efgEv");}
void  ccc::CC14x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y23abcEv");}
void  ccc::CC14x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y23pqrEv");}
ccc::CC14x9y2 ::~CC14x9y2(){ note_dtor("_ZN3ccc8CC14x9y2E", this);} // tgen
ccc::CC14x9y2 ::CC14x9y2(){ note_ctor("_ZN3ccc8CC14x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y2E, buf);
    ::ccc::CC14x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y2E);
    dp->::ccc::CC14x9y2::~CC14x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y2E(Test__ZN3ccc8CC14x9y2E, "_ZN3ccc8CC14x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y2C1Ev();
extern void _ZN3ccc8CC14x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y2E[] = {
  NSPAIR(_ZN3ccc8CC14x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y2E[];
extern void _ZN3ccc8CC14x9y23pqrEv();
extern void _ZN3ccc8CC14x9y23efgEv();
extern void _ZN3ccc8CC14x9y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y23efgEv,_ZThn4_N3ccc8CC14x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y23pqrEv,_ZThn4_N3ccc8CC14x9y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y23efgEv,_ZThn4_N3ccc8CC14x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y23pqrEv,_ZThn4_N3ccc8CC14x9y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y2E[];
Class_Descriptor cd__ZN3ccc8CC14x9y2E = {  "_ZN3ccc8CC14x9y2E", // class name
  bases__ZN3ccc8CC14x9y2E, 2,
  &(vtc__ZN3ccc8CC14x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y3  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC14x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x9y33abcEv
  ~CC14x9y3(); // tgen
  CC14x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y3E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y33efgEv");}
void  ccc::CC14x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y33pqrEv");}
void  ccc::CC14x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y33abcEv");}
ccc::CC14x9y3 ::~CC14x9y3(){ note_dtor("_ZN3ccc8CC14x9y3E", this);} // tgen
ccc::CC14x9y3 ::CC14x9y3(){ note_ctor("_ZN3ccc8CC14x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y3E, buf);
    ::ccc::CC14x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y3E);
    dp->::ccc::CC14x9y3::~CC14x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y3E(Test__ZN3ccc8CC14x9y3E, "_ZN3ccc8CC14x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y3C1Ev();
extern void _ZN3ccc8CC14x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y3E[] = {
  NSPAIR(_ZN3ccc8CC14x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y3E[];
extern void _ZN3ccc8CC14x9y33pqrEv();
extern void _ZN3ccc8CC14x9y33efgEv();
extern void _ZN3ccc8CC14x9y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y33efgEv,_ZThn4_N3ccc8CC14x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y33pqrEv,_ZThn4_N3ccc8CC14x9y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y33efgEv,_ZThn4_N3ccc8CC14x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y33pqrEv,_ZThn4_N3ccc8CC14x9y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y3E[];
Class_Descriptor cd__ZN3ccc8CC14x9y3E = {  "_ZN3ccc8CC14x9y3E", // class name
  bases__ZN3ccc8CC14x9y3E, 2,
  &(vtc__ZN3ccc8CC14x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y4  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC14x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC14x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC14x9y43efgEv
  ~CC14x9y4(); // tgen
  CC14x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y4E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y43pqrEv");}
void  ccc::CC14x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y43abcEv");}
void  ccc::CC14x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y43efgEv");}
ccc::CC14x9y4 ::~CC14x9y4(){ note_dtor("_ZN3ccc8CC14x9y4E", this);} // tgen
ccc::CC14x9y4 ::CC14x9y4(){ note_ctor("_ZN3ccc8CC14x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y4E, buf);
    ::ccc::CC14x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y4E);
    dp->::ccc::CC14x9y4::~CC14x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y4E(Test__ZN3ccc8CC14x9y4E, "_ZN3ccc8CC14x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y4C1Ev();
extern void _ZN3ccc8CC14x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y4E[] = {
  NSPAIR(_ZN3ccc8CC14x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y4E[];
extern void _ZN3ccc8CC14x9y43pqrEv();
extern void _ZN3ccc8CC14x9y43abcEv();
extern void _ZN3ccc8CC14x9y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y43efgEv,_ZThn4_N3ccc8CC14x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y43pqrEv,_ZThn4_N3ccc8CC14x9y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y43efgEv,_ZThn4_N3ccc8CC14x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y43pqrEv,_ZThn4_N3ccc8CC14x9y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y4E[];
Class_Descriptor cd__ZN3ccc8CC14x9y4E = {  "_ZN3ccc8CC14x9y4E", // class name
  bases__ZN3ccc8CC14x9y4E, 2,
  &(vtc__ZN3ccc8CC14x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y5  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC14x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC14x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC14x9y53abcEv
  ~CC14x9y5(); // tgen
  CC14x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y5E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y53pqrEv");}
void  ccc::CC14x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y53efgEv");}
void  ccc::CC14x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y53abcEv");}
ccc::CC14x9y5 ::~CC14x9y5(){ note_dtor("_ZN3ccc8CC14x9y5E", this);} // tgen
ccc::CC14x9y5 ::CC14x9y5(){ note_ctor("_ZN3ccc8CC14x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y5E, buf);
    ::ccc::CC14x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y5E);
    dp->::ccc::CC14x9y5::~CC14x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y5E(Test__ZN3ccc8CC14x9y5E, "_ZN3ccc8CC14x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y5C1Ev();
extern void _ZN3ccc8CC14x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y5E[] = {
  NSPAIR(_ZN3ccc8CC14x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y5E[];
extern void _ZN3ccc8CC14x9y53pqrEv();
extern void _ZN3ccc8CC14x9y53efgEv();
extern void _ZN3ccc8CC14x9y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y53efgEv,_ZThn4_N3ccc8CC14x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y53pqrEv,_ZThn4_N3ccc8CC14x9y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y53efgEv,_ZThn4_N3ccc8CC14x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y53pqrEv,_ZThn4_N3ccc8CC14x9y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y5E[];
Class_Descriptor cd__ZN3ccc8CC14x9y5E = {  "_ZN3ccc8CC14x9y5E", // class name
  bases__ZN3ccc8CC14x9y5E, 2,
  &(vtc__ZN3ccc8CC14x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y6  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC14x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC14x9y63efgEv
  ~CC14x9y6(); // tgen
  CC14x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y6E) C1{ BC2{ v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y63abcEv");}
void  ccc::CC14x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y63efgEv");}
ccc::CC14x9y6 ::~CC14x9y6(){ note_dtor("_ZN3ccc8CC14x9y6E", this);} // tgen
ccc::CC14x9y6 ::CC14x9y6(){ note_ctor("_ZN3ccc8CC14x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y6E, buf);
    ::ccc::CC14x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y6E);
    dp->::ccc::CC14x9y6::~CC14x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y6E(Test__ZN3ccc8CC14x9y6E, "_ZN3ccc8CC14x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y6C1Ev();
extern void _ZN3ccc8CC14x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y6E[] = {
  NSPAIR(_ZN3ccc8CC14x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x9y63abcEv();
extern void _ZN3ccc8CC14x9y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y63efgEv,_ZThn4_N3ccc8CC14x9y63efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y63efgEv,_ZThn4_N3ccc8CC14x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y6E[];
Class_Descriptor cd__ZN3ccc8CC14x9y6E = {  "_ZN3ccc8CC14x9y6E", // class name
  bases__ZN3ccc8CC14x9y6E, 2,
  &(vtc__ZN3ccc8CC14x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y7  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC14x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y73pqrEv
  ~CC14x9y7(); // tgen
  CC14x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y7E) C1{ BC2{ v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y73abcEv");}
void  ccc::CC14x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y73pqrEv");}
ccc::CC14x9y7 ::~CC14x9y7(){ note_dtor("_ZN3ccc8CC14x9y7E", this);} // tgen
ccc::CC14x9y7 ::CC14x9y7(){ note_ctor("_ZN3ccc8CC14x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y7E, buf);
    ::ccc::CC14x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y7E);
    dp->::ccc::CC14x9y7::~CC14x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y7E(Test__ZN3ccc8CC14x9y7E, "_ZN3ccc8CC14x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y7C1Ev();
extern void _ZN3ccc8CC14x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y7E[] = {
  NSPAIR(_ZN3ccc8CC14x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y7E[];
extern void _ZN3ccc8CC14x9y73pqrEv();
extern void _ZN3ccc8CC14x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y73pqrEv,_ZThn4_N3ccc8CC14x9y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y73pqrEv,_ZThn4_N3ccc8CC14x9y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y7E[];
Class_Descriptor cd__ZN3ccc8CC14x9y7E = {  "_ZN3ccc8CC14x9y7E", // class name
  bases__ZN3ccc8CC14x9y7E, 2,
  &(vtc__ZN3ccc8CC14x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y8  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC14x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC14x9y83abcEv
  ~CC14x9y8(); // tgen
  CC14x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y8E) C1{ BC2{ v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y83efgEv");}
void  ccc::CC14x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC14x9y83abcEv");}
ccc::CC14x9y8 ::~CC14x9y8(){ note_dtor("_ZN3ccc8CC14x9y8E", this);} // tgen
ccc::CC14x9y8 ::CC14x9y8(){ note_ctor("_ZN3ccc8CC14x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y8E, buf);
    ::ccc::CC14x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y8E);
    dp->::ccc::CC14x9y8::~CC14x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y8E(Test__ZN3ccc8CC14x9y8E, "_ZN3ccc8CC14x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y8C1Ev();
extern void _ZN3ccc8CC14x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y8E[] = {
  NSPAIR(_ZN3ccc8CC14x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc8CC14x9y83efgEv();
extern void _ZN3ccc8CC14x9y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y83efgEv,_ZThn4_N3ccc8CC14x9y83efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y83efgEv,_ZThn4_N3ccc8CC14x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y8E[];
Class_Descriptor cd__ZN3ccc8CC14x9y8E = {  "_ZN3ccc8CC14x9y8E", // class name
  bases__ZN3ccc8CC14x9y8E, 2,
  &(vtc__ZN3ccc8CC14x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y9  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC14x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC14x9y93pqrEv
  ~CC14x9y9(); // tgen
  CC14x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC14x9y9E) C1{ BC2{ v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC14x9y93efgEv");}
void  ccc::CC14x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC14x9y93pqrEv");}
ccc::CC14x9y9 ::~CC14x9y9(){ note_dtor("_ZN3ccc8CC14x9y9E", this);} // tgen
ccc::CC14x9y9 ::CC14x9y9(){ note_ctor("_ZN3ccc8CC14x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC14x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC14x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC14x9y9E, buf);
    ::ccc::CC14x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC14x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC14x9y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc8CC14x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8CC14x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC14x9y9E);
    dp->::ccc::CC14x9y9::~CC14x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC14x9y9E(Test__ZN3ccc8CC14x9y9E, "_ZN3ccc8CC14x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC14x9y9C1Ev();
extern void _ZN3ccc8CC14x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC14x9y9E[] = {
  NSPAIR(_ZN3ccc8CC14x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC14x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC14x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y9E[];
extern void _ZN3ccc8CC14x9y93pqrEv();
extern void _ZN3ccc8CC14x9y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y93efgEv,_ZThn4_N3ccc8CC14x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC14x9y93pqrEv,_ZThn4_N3ccc8CC14x9y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc8CC14x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC14x9y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC14x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y93efgEv,_ZThn4_N3ccc8CC14x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc8CC14x9y93pqrEv,_ZThn4_N3ccc8CC14x9y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc8CC14x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC14x9y9E[];
Class_Descriptor cd__ZN3ccc8CC14x9y9E = {  "_ZN3ccc8CC14x9y9E", // class name
  bases__ZN3ccc8CC14x9y9E, 2,
  &(vtc__ZN3ccc8CC14x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC14x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC14x9y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y10  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC14x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x9y103abcEv
  ~CC14x9y10(); // tgen
  CC14x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y10E) C1{ BC2{ v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x9y103pqrEv");}
void  ccc::CC14x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x9y103abcEv");}
ccc::CC14x9y10 ::~CC14x9y10(){ note_dtor("_ZN3ccc9CC14x9y10E", this);} // tgen
ccc::CC14x9y10 ::CC14x9y10(){ note_ctor("_ZN3ccc9CC14x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y10E, buf);
    ::ccc::CC14x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y10E);
    dp->::ccc::CC14x9y10::~CC14x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y10E(Test__ZN3ccc9CC14x9y10E, "_ZN3ccc9CC14x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y10C1Ev();
extern void _ZN3ccc9CC14x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y10E[] = {
  NSPAIR(_ZN3ccc9CC14x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y10E[];
extern void _ZN3ccc9CC14x9y103pqrEv();
extern void _ZN3ccc9CC14x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x9y103pqrEv,_ZThn4_N3ccc9CC14x9y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x9y103pqrEv,_ZThn4_N3ccc9CC14x9y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y10E[];
Class_Descriptor cd__ZN3ccc9CC14x9y10E = {  "_ZN3ccc9CC14x9y10E", // class name
  bases__ZN3ccc9CC14x9y10E, 2,
  &(vtc__ZN3ccc9CC14x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y11  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC14x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x9y113efgEv
  ~CC14x9y11(); // tgen
  CC14x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y11E) C1{ BC2{ v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x9y113pqrEv");}
void  ccc::CC14x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x9y113efgEv");}
ccc::CC14x9y11 ::~CC14x9y11(){ note_dtor("_ZN3ccc9CC14x9y11E", this);} // tgen
ccc::CC14x9y11 ::CC14x9y11(){ note_ctor("_ZN3ccc9CC14x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y11E, buf);
    ::ccc::CC14x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y11E);
    dp->::ccc::CC14x9y11::~CC14x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y11E(Test__ZN3ccc9CC14x9y11E, "_ZN3ccc9CC14x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y11C1Ev();
extern void _ZN3ccc9CC14x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y11E[] = {
  NSPAIR(_ZN3ccc9CC14x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y11E[];
extern void _ZN3ccc9CC14x9y113pqrEv();
extern void _ZN3ccc9CC14x9y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x9y113efgEv,_ZThn4_N3ccc9CC14x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x9y113pqrEv,_ZThn4_N3ccc9CC14x9y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x9y113efgEv,_ZThn4_N3ccc9CC14x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x9y113pqrEv,_ZThn4_N3ccc9CC14x9y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y11E[];
Class_Descriptor cd__ZN3ccc9CC14x9y11E = {  "_ZN3ccc9CC14x9y11E", // class name
  bases__ZN3ccc9CC14x9y11E, 2,
  &(vtc__ZN3ccc9CC14x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y12  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC14x9y123abcEv
  ~CC14x9y12(); // tgen
  CC14x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y12E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x9y123abcEv");}
ccc::CC14x9y12 ::~CC14x9y12(){ note_dtor("_ZN3ccc9CC14x9y12E", this);} // tgen
ccc::CC14x9y12 ::CC14x9y12(){ note_ctor("_ZN3ccc9CC14x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y12E, buf);
    ::ccc::CC14x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y12E);
    dp->::ccc::CC14x9y12::~CC14x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y12E(Test__ZN3ccc9CC14x9y12E, "_ZN3ccc9CC14x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y12C1Ev();
extern void _ZN3ccc9CC14x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y12E[] = {
  NSPAIR(_ZN3ccc9CC14x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y12E[];
Class_Descriptor cd__ZN3ccc9CC14x9y12E = {  "_ZN3ccc9CC14x9y12E", // class name
  bases__ZN3ccc9CC14x9y12E, 2,
  &(vtc__ZN3ccc9CC14x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y13  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC14x9y133efgEv
  ~CC14x9y13(); // tgen
  CC14x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y13E) C1{ BC2{ v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC14x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x9y133efgEv");}
ccc::CC14x9y13 ::~CC14x9y13(){ note_dtor("_ZN3ccc9CC14x9y13E", this);} // tgen
ccc::CC14x9y13 ::CC14x9y13(){ note_ctor("_ZN3ccc9CC14x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y13E, buf);
    ::ccc::CC14x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y13E);
    dp->::ccc::CC14x9y13::~CC14x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y13E(Test__ZN3ccc9CC14x9y13E, "_ZN3ccc9CC14x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y13C1Ev();
extern void _ZN3ccc9CC14x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y13E[] = {
  NSPAIR(_ZN3ccc9CC14x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x9y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x9y133efgEv,_ZThn4_N3ccc9CC14x9y133efgEv)();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x9y133efgEv,_ZThn4_N3ccc9CC14x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y13E[];
Class_Descriptor cd__ZN3ccc9CC14x9y13E = {  "_ZN3ccc9CC14x9y13E", // class name
  bases__ZN3ccc9CC14x9y13E, 2,
  &(vtc__ZN3ccc9CC14x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y14  : ::ccc::AA14 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC14x9y143pqrEv
  ~CC14x9y14(); // tgen
  CC14x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y14E) C1{ BC2{ v1} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC14x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x9y143pqrEv");}
ccc::CC14x9y14 ::~CC14x9y14(){ note_dtor("_ZN3ccc9CC14x9y14E", this);} // tgen
ccc::CC14x9y14 ::CC14x9y14(){ note_ctor("_ZN3ccc9CC14x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y14E, buf);
    ::ccc::CC14x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y14E);
    dp->::ccc::CC14x9y14::~CC14x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y14E(Test__ZN3ccc9CC14x9y14E, "_ZN3ccc9CC14x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y14C1Ev();
extern void _ZN3ccc9CC14x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y14E[] = {
  NSPAIR(_ZN3ccc9CC14x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y14E[];
extern void _ZN3ccc9CC14x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x9y143pqrEv,_ZThn4_N3ccc9CC14x9y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x9y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x9y143pqrEv,_ZThn4_N3ccc9CC14x9y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y14E[];
Class_Descriptor cd__ZN3ccc9CC14x9y14E = {  "_ZN3ccc9CC14x9y14E", // class name
  bases__ZN3ccc9CC14x9y14E, 2,
  &(vtc__ZN3ccc9CC14x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x9y15  : ::ccc::AA14 , ::ccc::BB9 {
  ~CC14x9y15(); // tgen
  CC14x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC14x9y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x9y15 ::~CC14x9y15(){ note_dtor("_ZN3ccc9CC14x9y15E", this);} // tgen
ccc::CC14x9y15 ::CC14x9y15(){ note_ctor("_ZN3ccc9CC14x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC14x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x9y15E, buf);
    ::ccc::CC14x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x9y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc9CC14x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x9y15E);
    dp->::ccc::CC14x9y15::~CC14x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x9y15E(Test__ZN3ccc9CC14x9y15E, "_ZN3ccc9CC14x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x9y15C1Ev();
extern void _ZN3ccc9CC14x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC14x9y15E[] = {
  NSPAIR(_ZN3ccc9CC14x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC14x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC14x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x9y15E[];
Class_Descriptor cd__ZN3ccc9CC14x9y15E = {  "_ZN3ccc9CC14x9y15E", // class name
  bases__ZN3ccc9CC14x9y15E, 2,
  &(vtc__ZN3ccc9CC14x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x9y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y0  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC14x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y03pqrEv
  ~CC14x10y0(); // tgen
  CC14x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y0E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y03abcEv");}
void  ccc::CC14x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y03efgEv");}
void  ccc::CC14x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y03pqrEv");}
ccc::CC14x10y0 ::~CC14x10y0(){ note_dtor("_ZN3ccc9CC14x10y0E", this);} // tgen
ccc::CC14x10y0 ::CC14x10y0(){ note_ctor("_ZN3ccc9CC14x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y0E, buf);
    ::ccc::CC14x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y0E);
    dp->::ccc::CC14x10y0::~CC14x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y0E(Test__ZN3ccc9CC14x10y0E, "_ZN3ccc9CC14x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y0C1Ev();
extern void _ZN3ccc9CC14x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y0E[] = {
  NSPAIR(_ZN3ccc9CC14x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y0E[];
extern void _ZN3ccc9CC14x10y03pqrEv();
extern void _ZN3ccc9CC14x10y03abcEv();
extern void _ZN3ccc9CC14x10y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y03pqrEv,_ZThn4_N3ccc9CC14x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y03abcEv,_ZThn4_N3ccc9CC14x10y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y03pqrEv,_ZThn4_N3ccc9CC14x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y03abcEv,_ZThn4_N3ccc9CC14x10y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y0E[];
Class_Descriptor cd__ZN3ccc9CC14x10y0E = {  "_ZN3ccc9CC14x10y0E", // class name
  bases__ZN3ccc9CC14x10y0E, 2,
  &(vtc__ZN3ccc9CC14x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y1  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC14x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x10y13efgEv
  ~CC14x10y1(); // tgen
  CC14x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y1E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y13abcEv");}
void  ccc::CC14x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y13pqrEv");}
void  ccc::CC14x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y13efgEv");}
ccc::CC14x10y1 ::~CC14x10y1(){ note_dtor("_ZN3ccc9CC14x10y1E", this);} // tgen
ccc::CC14x10y1 ::CC14x10y1(){ note_ctor("_ZN3ccc9CC14x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y1E, buf);
    ::ccc::CC14x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y1E);
    dp->::ccc::CC14x10y1::~CC14x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y1E(Test__ZN3ccc9CC14x10y1E, "_ZN3ccc9CC14x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y1C1Ev();
extern void _ZN3ccc9CC14x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y1E[] = {
  NSPAIR(_ZN3ccc9CC14x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y1E[];
extern void _ZN3ccc9CC14x10y13pqrEv();
extern void _ZN3ccc9CC14x10y13abcEv();
extern void _ZN3ccc9CC14x10y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y13pqrEv,_ZThn4_N3ccc9CC14x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y13abcEv,_ZThn4_N3ccc9CC14x10y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y13pqrEv,_ZThn4_N3ccc9CC14x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y13abcEv,_ZThn4_N3ccc9CC14x10y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y1E[];
Class_Descriptor cd__ZN3ccc9CC14x10y1E = {  "_ZN3ccc9CC14x10y1E", // class name
  bases__ZN3ccc9CC14x10y1E, 2,
  &(vtc__ZN3ccc9CC14x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y2  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC14x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y23pqrEv
  ~CC14x10y2(); // tgen
  CC14x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y2E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y23efgEv");}
void  ccc::CC14x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y23abcEv");}
void  ccc::CC14x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y23pqrEv");}
ccc::CC14x10y2 ::~CC14x10y2(){ note_dtor("_ZN3ccc9CC14x10y2E", this);} // tgen
ccc::CC14x10y2 ::CC14x10y2(){ note_ctor("_ZN3ccc9CC14x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y2E, buf);
    ::ccc::CC14x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y2E);
    dp->::ccc::CC14x10y2::~CC14x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y2E(Test__ZN3ccc9CC14x10y2E, "_ZN3ccc9CC14x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y2C1Ev();
extern void _ZN3ccc9CC14x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y2E[] = {
  NSPAIR(_ZN3ccc9CC14x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y2E[];
extern void _ZN3ccc9CC14x10y23pqrEv();
extern void _ZN3ccc9CC14x10y23efgEv();
extern void _ZN3ccc9CC14x10y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y23pqrEv,_ZThn4_N3ccc9CC14x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y23abcEv,_ZThn4_N3ccc9CC14x10y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y23pqrEv,_ZThn4_N3ccc9CC14x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y23abcEv,_ZThn4_N3ccc9CC14x10y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y2E[];
Class_Descriptor cd__ZN3ccc9CC14x10y2E = {  "_ZN3ccc9CC14x10y2E", // class name
  bases__ZN3ccc9CC14x10y2E, 2,
  &(vtc__ZN3ccc9CC14x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y3  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC14x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x10y33abcEv
  ~CC14x10y3(); // tgen
  CC14x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y3E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y33efgEv");}
void  ccc::CC14x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y33pqrEv");}
void  ccc::CC14x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y33abcEv");}
ccc::CC14x10y3 ::~CC14x10y3(){ note_dtor("_ZN3ccc9CC14x10y3E", this);} // tgen
ccc::CC14x10y3 ::CC14x10y3(){ note_ctor("_ZN3ccc9CC14x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y3E, buf);
    ::ccc::CC14x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y3E);
    dp->::ccc::CC14x10y3::~CC14x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y3E(Test__ZN3ccc9CC14x10y3E, "_ZN3ccc9CC14x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y3C1Ev();
extern void _ZN3ccc9CC14x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y3E[] = {
  NSPAIR(_ZN3ccc9CC14x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y3E[];
extern void _ZN3ccc9CC14x10y33pqrEv();
extern void _ZN3ccc9CC14x10y33efgEv();
extern void _ZN3ccc9CC14x10y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y33pqrEv,_ZThn4_N3ccc9CC14x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y33abcEv,_ZThn4_N3ccc9CC14x10y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y33pqrEv,_ZThn4_N3ccc9CC14x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y33abcEv,_ZThn4_N3ccc9CC14x10y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y3E[];
Class_Descriptor cd__ZN3ccc9CC14x10y3E = {  "_ZN3ccc9CC14x10y3E", // class name
  bases__ZN3ccc9CC14x10y3E, 2,
  &(vtc__ZN3ccc9CC14x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y4  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC14x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x10y43efgEv
  ~CC14x10y4(); // tgen
  CC14x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y4E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y43pqrEv");}
void  ccc::CC14x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y43abcEv");}
void  ccc::CC14x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y43efgEv");}
ccc::CC14x10y4 ::~CC14x10y4(){ note_dtor("_ZN3ccc9CC14x10y4E", this);} // tgen
ccc::CC14x10y4 ::CC14x10y4(){ note_ctor("_ZN3ccc9CC14x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y4E, buf);
    ::ccc::CC14x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y4E);
    dp->::ccc::CC14x10y4::~CC14x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y4E(Test__ZN3ccc9CC14x10y4E, "_ZN3ccc9CC14x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y4C1Ev();
extern void _ZN3ccc9CC14x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y4E[] = {
  NSPAIR(_ZN3ccc9CC14x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y4E[];
extern void _ZN3ccc9CC14x10y43pqrEv();
extern void _ZN3ccc9CC14x10y43abcEv();
extern void _ZN3ccc9CC14x10y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y43pqrEv,_ZThn4_N3ccc9CC14x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y43abcEv,_ZThn4_N3ccc9CC14x10y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y43pqrEv,_ZThn4_N3ccc9CC14x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y43abcEv,_ZThn4_N3ccc9CC14x10y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y4E[];
Class_Descriptor cd__ZN3ccc9CC14x10y4E = {  "_ZN3ccc9CC14x10y4E", // class name
  bases__ZN3ccc9CC14x10y4E, 2,
  &(vtc__ZN3ccc9CC14x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y5  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC14x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x10y53abcEv
  ~CC14x10y5(); // tgen
  CC14x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y5E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y53pqrEv");}
void  ccc::CC14x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y53efgEv");}
void  ccc::CC14x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y53abcEv");}
ccc::CC14x10y5 ::~CC14x10y5(){ note_dtor("_ZN3ccc9CC14x10y5E", this);} // tgen
ccc::CC14x10y5 ::CC14x10y5(){ note_ctor("_ZN3ccc9CC14x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y5E, buf);
    ::ccc::CC14x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y5E);
    dp->::ccc::CC14x10y5::~CC14x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y5E(Test__ZN3ccc9CC14x10y5E, "_ZN3ccc9CC14x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y5C1Ev();
extern void _ZN3ccc9CC14x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y5E[] = {
  NSPAIR(_ZN3ccc9CC14x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y5E[];
extern void _ZN3ccc9CC14x10y53pqrEv();
extern void _ZN3ccc9CC14x10y53efgEv();
extern void _ZN3ccc9CC14x10y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y53pqrEv,_ZThn4_N3ccc9CC14x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y53abcEv,_ZThn4_N3ccc9CC14x10y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y53pqrEv,_ZThn4_N3ccc9CC14x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y53abcEv,_ZThn4_N3ccc9CC14x10y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y5E[];
Class_Descriptor cd__ZN3ccc9CC14x10y5E = {  "_ZN3ccc9CC14x10y5E", // class name
  bases__ZN3ccc9CC14x10y5E, 2,
  &(vtc__ZN3ccc9CC14x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y6  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC14x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x10y63efgEv
  ~CC14x10y6(); // tgen
  CC14x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y6E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y63abcEv");}
void  ccc::CC14x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y63efgEv");}
ccc::CC14x10y6 ::~CC14x10y6(){ note_dtor("_ZN3ccc9CC14x10y6E", this);} // tgen
ccc::CC14x10y6 ::CC14x10y6(){ note_ctor("_ZN3ccc9CC14x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y6E, buf);
    ::ccc::CC14x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y6E);
    dp->::ccc::CC14x10y6::~CC14x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y6E(Test__ZN3ccc9CC14x10y6E, "_ZN3ccc9CC14x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y6C1Ev();
extern void _ZN3ccc9CC14x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y6E[] = {
  NSPAIR(_ZN3ccc9CC14x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x10y63abcEv();
extern void _ZN3ccc9CC14x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y63abcEv,_ZThn4_N3ccc9CC14x10y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y63abcEv,_ZThn4_N3ccc9CC14x10y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y6E[];
Class_Descriptor cd__ZN3ccc9CC14x10y6E = {  "_ZN3ccc9CC14x10y6E", // class name
  bases__ZN3ccc9CC14x10y6E, 2,
  &(vtc__ZN3ccc9CC14x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y7  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC14x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y73pqrEv
  ~CC14x10y7(); // tgen
  CC14x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y7E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y73abcEv");}
void  ccc::CC14x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y73pqrEv");}
ccc::CC14x10y7 ::~CC14x10y7(){ note_dtor("_ZN3ccc9CC14x10y7E", this);} // tgen
ccc::CC14x10y7 ::CC14x10y7(){ note_ctor("_ZN3ccc9CC14x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y7E, buf);
    ::ccc::CC14x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y7E);
    dp->::ccc::CC14x10y7::~CC14x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y7E(Test__ZN3ccc9CC14x10y7E, "_ZN3ccc9CC14x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y7C1Ev();
extern void _ZN3ccc9CC14x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y7E[] = {
  NSPAIR(_ZN3ccc9CC14x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y7E[];
extern void _ZN3ccc9CC14x10y73pqrEv();
extern void _ZN3ccc9CC14x10y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y73pqrEv,_ZThn4_N3ccc9CC14x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y73abcEv,_ZThn4_N3ccc9CC14x10y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y73pqrEv,_ZThn4_N3ccc9CC14x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y73abcEv,_ZThn4_N3ccc9CC14x10y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y7E[];
Class_Descriptor cd__ZN3ccc9CC14x10y7E = {  "_ZN3ccc9CC14x10y7E", // class name
  bases__ZN3ccc9CC14x10y7E, 2,
  &(vtc__ZN3ccc9CC14x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y8  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC14x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x10y83abcEv
  ~CC14x10y8(); // tgen
  CC14x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y8E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y83efgEv");}
void  ccc::CC14x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x10y83abcEv");}
ccc::CC14x10y8 ::~CC14x10y8(){ note_dtor("_ZN3ccc9CC14x10y8E", this);} // tgen
ccc::CC14x10y8 ::CC14x10y8(){ note_ctor("_ZN3ccc9CC14x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y8E, buf);
    ::ccc::CC14x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y8E);
    dp->::ccc::CC14x10y8::~CC14x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y8E(Test__ZN3ccc9CC14x10y8E, "_ZN3ccc9CC14x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y8C1Ev();
extern void _ZN3ccc9CC14x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y8E[] = {
  NSPAIR(_ZN3ccc9CC14x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x10y83efgEv();
extern void _ZN3ccc9CC14x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y83abcEv,_ZThn4_N3ccc9CC14x10y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y83abcEv,_ZThn4_N3ccc9CC14x10y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y8E[];
Class_Descriptor cd__ZN3ccc9CC14x10y8E = {  "_ZN3ccc9CC14x10y8E", // class name
  bases__ZN3ccc9CC14x10y8E, 2,
  &(vtc__ZN3ccc9CC14x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y9  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC14x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x10y93pqrEv
  ~CC14x10y9(); // tgen
  CC14x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x10y9E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x10y93efgEv");}
void  ccc::CC14x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x10y93pqrEv");}
ccc::CC14x10y9 ::~CC14x10y9(){ note_dtor("_ZN3ccc9CC14x10y9E", this);} // tgen
ccc::CC14x10y9 ::CC14x10y9(){ note_ctor("_ZN3ccc9CC14x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x10y9E, buf);
    ::ccc::CC14x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x10y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9CC14x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x10y9E);
    dp->::ccc::CC14x10y9::~CC14x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x10y9E(Test__ZN3ccc9CC14x10y9E, "_ZN3ccc9CC14x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x10y9C1Ev();
extern void _ZN3ccc9CC14x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x10y9E[] = {
  NSPAIR(_ZN3ccc9CC14x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC14x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y9E[];
extern void _ZN3ccc9CC14x10y93pqrEv();
extern void _ZN3ccc9CC14x10y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x10y93pqrEv,_ZThn4_N3ccc9CC14x10y93pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x10y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x10y93pqrEv,_ZThn4_N3ccc9CC14x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x10y9E[];
Class_Descriptor cd__ZN3ccc9CC14x10y9E = {  "_ZN3ccc9CC14x10y9E", // class name
  bases__ZN3ccc9CC14x10y9E, 2,
  &(vtc__ZN3ccc9CC14x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x10y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y10  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC14x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x10y103abcEv
  ~CC14x10y10(); // tgen
  CC14x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y10E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x10y103pqrEv");}
void  ccc::CC14x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x10y103abcEv");}
ccc::CC14x10y10 ::~CC14x10y10(){ note_dtor("_ZN3ccc10CC14x10y10E", this);} // tgen
ccc::CC14x10y10 ::CC14x10y10(){ note_ctor("_ZN3ccc10CC14x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y10E, buf);
    ::ccc::CC14x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y10E);
    dp->::ccc::CC14x10y10::~CC14x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y10E(Test__ZN3ccc10CC14x10y10E, "_ZN3ccc10CC14x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y10C1Ev();
extern void _ZN3ccc10CC14x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y10E[] = {
  NSPAIR(_ZN3ccc10CC14x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y10E[];
extern void _ZN3ccc10CC14x10y103pqrEv();
extern void _ZN3ccc10CC14x10y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x10y103pqrEv,_ZThn4_N3ccc10CC14x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC14x10y103abcEv,_ZThn4_N3ccc10CC14x10y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x10y103pqrEv,_ZThn4_N3ccc10CC14x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x10y103abcEv,_ZThn4_N3ccc10CC14x10y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y10E[];
Class_Descriptor cd__ZN3ccc10CC14x10y10E = {  "_ZN3ccc10CC14x10y10E", // class name
  bases__ZN3ccc10CC14x10y10E, 2,
  &(vtc__ZN3ccc10CC14x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y11  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC14x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x10y113efgEv
  ~CC14x10y11(); // tgen
  CC14x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y11E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x10y113pqrEv");}
void  ccc::CC14x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x10y113efgEv");}
ccc::CC14x10y11 ::~CC14x10y11(){ note_dtor("_ZN3ccc10CC14x10y11E", this);} // tgen
ccc::CC14x10y11 ::CC14x10y11(){ note_ctor("_ZN3ccc10CC14x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y11E, buf);
    ::ccc::CC14x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y11E);
    dp->::ccc::CC14x10y11::~CC14x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y11E(Test__ZN3ccc10CC14x10y11E, "_ZN3ccc10CC14x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y11C1Ev();
extern void _ZN3ccc10CC14x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y11E[] = {
  NSPAIR(_ZN3ccc10CC14x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y11E[];
extern void _ZN3ccc10CC14x10y113pqrEv();
extern void _ZN3ccc10CC14x10y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x10y113pqrEv,_ZThn4_N3ccc10CC14x10y113pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x10y113pqrEv,_ZThn4_N3ccc10CC14x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y11E[];
Class_Descriptor cd__ZN3ccc10CC14x10y11E = {  "_ZN3ccc10CC14x10y11E", // class name
  bases__ZN3ccc10CC14x10y11E, 2,
  &(vtc__ZN3ccc10CC14x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y12  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC14x10y123abcEv
  ~CC14x10y12(); // tgen
  CC14x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y12E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x10y123abcEv");}
ccc::CC14x10y12 ::~CC14x10y12(){ note_dtor("_ZN3ccc10CC14x10y12E", this);} // tgen
ccc::CC14x10y12 ::CC14x10y12(){ note_ctor("_ZN3ccc10CC14x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y12E, buf);
    ::ccc::CC14x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y12E);
    dp->::ccc::CC14x10y12::~CC14x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y12E(Test__ZN3ccc10CC14x10y12E, "_ZN3ccc10CC14x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y12C1Ev();
extern void _ZN3ccc10CC14x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y12E[] = {
  NSPAIR(_ZN3ccc10CC14x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x10y123abcEv,_ZThn4_N3ccc10CC14x10y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x10y123abcEv,_ZThn4_N3ccc10CC14x10y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y12E[];
Class_Descriptor cd__ZN3ccc10CC14x10y12E = {  "_ZN3ccc10CC14x10y12E", // class name
  bases__ZN3ccc10CC14x10y12E, 2,
  &(vtc__ZN3ccc10CC14x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y13  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC14x10y133efgEv
  ~CC14x10y13(); // tgen
  CC14x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y13E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x10y133efgEv");}
ccc::CC14x10y13 ::~CC14x10y13(){ note_dtor("_ZN3ccc10CC14x10y13E", this);} // tgen
ccc::CC14x10y13 ::CC14x10y13(){ note_ctor("_ZN3ccc10CC14x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y13E, buf);
    ::ccc::CC14x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y13E);
    dp->::ccc::CC14x10y13::~CC14x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y13E(Test__ZN3ccc10CC14x10y13E, "_ZN3ccc10CC14x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y13C1Ev();
extern void _ZN3ccc10CC14x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y13E[] = {
  NSPAIR(_ZN3ccc10CC14x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y13E[];
Class_Descriptor cd__ZN3ccc10CC14x10y13E = {  "_ZN3ccc10CC14x10y13E", // class name
  bases__ZN3ccc10CC14x10y13E, 2,
  &(vtc__ZN3ccc10CC14x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y14  : ::ccc::AA14 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC14x10y143pqrEv
  ~CC14x10y14(); // tgen
  CC14x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y14E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC14x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x10y143pqrEv");}
ccc::CC14x10y14 ::~CC14x10y14(){ note_dtor("_ZN3ccc10CC14x10y14E", this);} // tgen
ccc::CC14x10y14 ::CC14x10y14(){ note_ctor("_ZN3ccc10CC14x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y14E, buf);
    ::ccc::CC14x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y14E);
    dp->::ccc::CC14x10y14::~CC14x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y14E(Test__ZN3ccc10CC14x10y14E, "_ZN3ccc10CC14x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y14C1Ev();
extern void _ZN3ccc10CC14x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y14E[] = {
  NSPAIR(_ZN3ccc10CC14x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y14E[];
extern void _ZN3ccc10CC14x10y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x10y143pqrEv,_ZThn4_N3ccc10CC14x10y143pqrEv)();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x10y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x10y143pqrEv,_ZThn4_N3ccc10CC14x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y14E[];
Class_Descriptor cd__ZN3ccc10CC14x10y14E = {  "_ZN3ccc10CC14x10y14E", // class name
  bases__ZN3ccc10CC14x10y14E, 2,
  &(vtc__ZN3ccc10CC14x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x10y15  : ::ccc::AA14 , ::ccc::BB10 {
  ~CC14x10y15(); // tgen
  CC14x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x10y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x10y15 ::~CC14x10y15(){ note_dtor("_ZN3ccc10CC14x10y15E", this);} // tgen
ccc::CC14x10y15 ::CC14x10y15(){ note_ctor("_ZN3ccc10CC14x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x10y15E, buf);
    ::ccc::CC14x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x10y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc10CC14x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x10y15E);
    dp->::ccc::CC14x10y15::~CC14x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x10y15E(Test__ZN3ccc10CC14x10y15E, "_ZN3ccc10CC14x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x10y15C1Ev();
extern void _ZN3ccc10CC14x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x10y15E[] = {
  NSPAIR(_ZN3ccc10CC14x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC14x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x10y15E[];
Class_Descriptor cd__ZN3ccc10CC14x10y15E = {  "_ZN3ccc10CC14x10y15E", // class name
  bases__ZN3ccc10CC14x10y15E, 2,
  &(vtc__ZN3ccc10CC14x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x10y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y0  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC14x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y03pqrEv
  ~CC14x11y0(); // tgen
  CC14x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y0E) C1{ BC2{ v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y03abcEv");}
void  ccc::CC14x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y03efgEv");}
void  ccc::CC14x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y03pqrEv");}
ccc::CC14x11y0 ::~CC14x11y0(){ note_dtor("_ZN3ccc9CC14x11y0E", this);} // tgen
ccc::CC14x11y0 ::CC14x11y0(){ note_ctor("_ZN3ccc9CC14x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y0E, buf);
    ::ccc::CC14x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y0E);
    dp->::ccc::CC14x11y0::~CC14x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y0E(Test__ZN3ccc9CC14x11y0E, "_ZN3ccc9CC14x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y0C1Ev();
extern void _ZN3ccc9CC14x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y0E[] = {
  NSPAIR(_ZN3ccc9CC14x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y0E[];
extern void _ZN3ccc9CC14x11y03pqrEv();
extern void _ZN3ccc9CC14x11y03abcEv();
extern void _ZN3ccc9CC14x11y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y03pqrEv,_ZThn4_N3ccc9CC14x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y03efgEv,_ZThn4_N3ccc9CC14x11y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y03pqrEv,_ZThn4_N3ccc9CC14x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y03efgEv,_ZThn4_N3ccc9CC14x11y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y0E[];
Class_Descriptor cd__ZN3ccc9CC14x11y0E = {  "_ZN3ccc9CC14x11y0E", // class name
  bases__ZN3ccc9CC14x11y0E, 2,
  &(vtc__ZN3ccc9CC14x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y0E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y1  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC14x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x11y13efgEv
  ~CC14x11y1(); // tgen
  CC14x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y1E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y13abcEv");}
void  ccc::CC14x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y13pqrEv");}
void  ccc::CC14x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y13efgEv");}
ccc::CC14x11y1 ::~CC14x11y1(){ note_dtor("_ZN3ccc9CC14x11y1E", this);} // tgen
ccc::CC14x11y1 ::CC14x11y1(){ note_ctor("_ZN3ccc9CC14x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y1E, buf);
    ::ccc::CC14x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y1E);
    dp->::ccc::CC14x11y1::~CC14x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y1E(Test__ZN3ccc9CC14x11y1E, "_ZN3ccc9CC14x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y1C1Ev();
extern void _ZN3ccc9CC14x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y1E[] = {
  NSPAIR(_ZN3ccc9CC14x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y1E[];
extern void _ZN3ccc9CC14x11y13pqrEv();
extern void _ZN3ccc9CC14x11y13abcEv();
extern void _ZN3ccc9CC14x11y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y13pqrEv,_ZThn4_N3ccc9CC14x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y13efgEv,_ZThn4_N3ccc9CC14x11y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y13pqrEv,_ZThn4_N3ccc9CC14x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y13efgEv,_ZThn4_N3ccc9CC14x11y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y1E[];
Class_Descriptor cd__ZN3ccc9CC14x11y1E = {  "_ZN3ccc9CC14x11y1E", // class name
  bases__ZN3ccc9CC14x11y1E, 2,
  &(vtc__ZN3ccc9CC14x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y1E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y2  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC14x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y23pqrEv
  ~CC14x11y2(); // tgen
  CC14x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y2E) C1{ BC2{ v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y23efgEv");}
void  ccc::CC14x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y23abcEv");}
void  ccc::CC14x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y23pqrEv");}
ccc::CC14x11y2 ::~CC14x11y2(){ note_dtor("_ZN3ccc9CC14x11y2E", this);} // tgen
ccc::CC14x11y2 ::CC14x11y2(){ note_ctor("_ZN3ccc9CC14x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y2E, buf);
    ::ccc::CC14x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y2E);
    dp->::ccc::CC14x11y2::~CC14x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y2E(Test__ZN3ccc9CC14x11y2E, "_ZN3ccc9CC14x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y2C1Ev();
extern void _ZN3ccc9CC14x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y2E[] = {
  NSPAIR(_ZN3ccc9CC14x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y2E[];
extern void _ZN3ccc9CC14x11y23pqrEv();
extern void _ZN3ccc9CC14x11y23efgEv();
extern void _ZN3ccc9CC14x11y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y23pqrEv,_ZThn4_N3ccc9CC14x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y23efgEv,_ZThn4_N3ccc9CC14x11y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y23pqrEv,_ZThn4_N3ccc9CC14x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y23efgEv,_ZThn4_N3ccc9CC14x11y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y2E[];
Class_Descriptor cd__ZN3ccc9CC14x11y2E = {  "_ZN3ccc9CC14x11y2E", // class name
  bases__ZN3ccc9CC14x11y2E, 2,
  &(vtc__ZN3ccc9CC14x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y2E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y3  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC14x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x11y33abcEv
  ~CC14x11y3(); // tgen
  CC14x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y3E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y33efgEv");}
void  ccc::CC14x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y33pqrEv");}
void  ccc::CC14x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y33abcEv");}
ccc::CC14x11y3 ::~CC14x11y3(){ note_dtor("_ZN3ccc9CC14x11y3E", this);} // tgen
ccc::CC14x11y3 ::CC14x11y3(){ note_ctor("_ZN3ccc9CC14x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y3E, buf);
    ::ccc::CC14x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y3E);
    dp->::ccc::CC14x11y3::~CC14x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y3E(Test__ZN3ccc9CC14x11y3E, "_ZN3ccc9CC14x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y3C1Ev();
extern void _ZN3ccc9CC14x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y3E[] = {
  NSPAIR(_ZN3ccc9CC14x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y3E[];
extern void _ZN3ccc9CC14x11y33pqrEv();
extern void _ZN3ccc9CC14x11y33efgEv();
extern void _ZN3ccc9CC14x11y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y33pqrEv,_ZThn4_N3ccc9CC14x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y33efgEv,_ZThn4_N3ccc9CC14x11y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y33pqrEv,_ZThn4_N3ccc9CC14x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y33efgEv,_ZThn4_N3ccc9CC14x11y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y3E[];
Class_Descriptor cd__ZN3ccc9CC14x11y3E = {  "_ZN3ccc9CC14x11y3E", // class name
  bases__ZN3ccc9CC14x11y3E, 2,
  &(vtc__ZN3ccc9CC14x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y3E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y4  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC14x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x11y43efgEv
  ~CC14x11y4(); // tgen
  CC14x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y4E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y43pqrEv");}
void  ccc::CC14x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y43abcEv");}
void  ccc::CC14x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y43efgEv");}
ccc::CC14x11y4 ::~CC14x11y4(){ note_dtor("_ZN3ccc9CC14x11y4E", this);} // tgen
ccc::CC14x11y4 ::CC14x11y4(){ note_ctor("_ZN3ccc9CC14x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y4E, buf);
    ::ccc::CC14x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y4E);
    dp->::ccc::CC14x11y4::~CC14x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y4E(Test__ZN3ccc9CC14x11y4E, "_ZN3ccc9CC14x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y4C1Ev();
extern void _ZN3ccc9CC14x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y4E[] = {
  NSPAIR(_ZN3ccc9CC14x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y4E[];
extern void _ZN3ccc9CC14x11y43pqrEv();
extern void _ZN3ccc9CC14x11y43abcEv();
extern void _ZN3ccc9CC14x11y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y43pqrEv,_ZThn4_N3ccc9CC14x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y43efgEv,_ZThn4_N3ccc9CC14x11y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y43pqrEv,_ZThn4_N3ccc9CC14x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y43efgEv,_ZThn4_N3ccc9CC14x11y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y4E[];
Class_Descriptor cd__ZN3ccc9CC14x11y4E = {  "_ZN3ccc9CC14x11y4E", // class name
  bases__ZN3ccc9CC14x11y4E, 2,
  &(vtc__ZN3ccc9CC14x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y4E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y5  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC14x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x11y53abcEv
  ~CC14x11y5(); // tgen
  CC14x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y5E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y53pqrEv");}
void  ccc::CC14x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y53efgEv");}
void  ccc::CC14x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y53abcEv");}
ccc::CC14x11y5 ::~CC14x11y5(){ note_dtor("_ZN3ccc9CC14x11y5E", this);} // tgen
ccc::CC14x11y5 ::CC14x11y5(){ note_ctor("_ZN3ccc9CC14x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y5E, buf);
    ::ccc::CC14x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y5E);
    dp->::ccc::CC14x11y5::~CC14x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y5E(Test__ZN3ccc9CC14x11y5E, "_ZN3ccc9CC14x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y5C1Ev();
extern void _ZN3ccc9CC14x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y5E[] = {
  NSPAIR(_ZN3ccc9CC14x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y5E[];
extern void _ZN3ccc9CC14x11y53pqrEv();
extern void _ZN3ccc9CC14x11y53efgEv();
extern void _ZN3ccc9CC14x11y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y53pqrEv,_ZThn4_N3ccc9CC14x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y53efgEv,_ZThn4_N3ccc9CC14x11y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y53pqrEv,_ZThn4_N3ccc9CC14x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y53efgEv,_ZThn4_N3ccc9CC14x11y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y5E[];
Class_Descriptor cd__ZN3ccc9CC14x11y5E = {  "_ZN3ccc9CC14x11y5E", // class name
  bases__ZN3ccc9CC14x11y5E, 2,
  &(vtc__ZN3ccc9CC14x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y5E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y6  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC14x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x11y63efgEv
  ~CC14x11y6(); // tgen
  CC14x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y6E) C1{ BC2{ v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y63abcEv");}
void  ccc::CC14x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y63efgEv");}
ccc::CC14x11y6 ::~CC14x11y6(){ note_dtor("_ZN3ccc9CC14x11y6E", this);} // tgen
ccc::CC14x11y6 ::CC14x11y6(){ note_ctor("_ZN3ccc9CC14x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y6E, buf);
    ::ccc::CC14x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y6E);
    dp->::ccc::CC14x11y6::~CC14x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y6E(Test__ZN3ccc9CC14x11y6E, "_ZN3ccc9CC14x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y6C1Ev();
extern void _ZN3ccc9CC14x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y6E[] = {
  NSPAIR(_ZN3ccc9CC14x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x11y63abcEv();
extern void _ZN3ccc9CC14x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y63efgEv,_ZThn4_N3ccc9CC14x11y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y63efgEv,_ZThn4_N3ccc9CC14x11y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y6E[];
Class_Descriptor cd__ZN3ccc9CC14x11y6E = {  "_ZN3ccc9CC14x11y6E", // class name
  bases__ZN3ccc9CC14x11y6E, 2,
  &(vtc__ZN3ccc9CC14x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y6E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y7  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC14x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y73pqrEv
  ~CC14x11y7(); // tgen
  CC14x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y7E) C1{ BC2{ v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y73abcEv");}
void  ccc::CC14x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y73pqrEv");}
ccc::CC14x11y7 ::~CC14x11y7(){ note_dtor("_ZN3ccc9CC14x11y7E", this);} // tgen
ccc::CC14x11y7 ::CC14x11y7(){ note_ctor("_ZN3ccc9CC14x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y7E, buf);
    ::ccc::CC14x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y7E);
    dp->::ccc::CC14x11y7::~CC14x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y7E(Test__ZN3ccc9CC14x11y7E, "_ZN3ccc9CC14x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y7C1Ev();
extern void _ZN3ccc9CC14x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y7E[] = {
  NSPAIR(_ZN3ccc9CC14x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y7E[];
extern void _ZN3ccc9CC14x11y73pqrEv();
extern void _ZN3ccc9CC14x11y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y73pqrEv,_ZThn4_N3ccc9CC14x11y73pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y73pqrEv,_ZThn4_N3ccc9CC14x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y7E[];
Class_Descriptor cd__ZN3ccc9CC14x11y7E = {  "_ZN3ccc9CC14x11y7E", // class name
  bases__ZN3ccc9CC14x11y7E, 2,
  &(vtc__ZN3ccc9CC14x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y7E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y8  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC14x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x11y83abcEv
  ~CC14x11y8(); // tgen
  CC14x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y8E) C1{ BC2{ v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y83efgEv");}
void  ccc::CC14x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x11y83abcEv");}
ccc::CC14x11y8 ::~CC14x11y8(){ note_dtor("_ZN3ccc9CC14x11y8E", this);} // tgen
ccc::CC14x11y8 ::CC14x11y8(){ note_ctor("_ZN3ccc9CC14x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y8E, buf);
    ::ccc::CC14x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y8E);
    dp->::ccc::CC14x11y8::~CC14x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y8E(Test__ZN3ccc9CC14x11y8E, "_ZN3ccc9CC14x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y8C1Ev();
extern void _ZN3ccc9CC14x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y8E[] = {
  NSPAIR(_ZN3ccc9CC14x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x11y83efgEv();
extern void _ZN3ccc9CC14x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y83efgEv,_ZThn4_N3ccc9CC14x11y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y83efgEv,_ZThn4_N3ccc9CC14x11y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y8E[];
Class_Descriptor cd__ZN3ccc9CC14x11y8E = {  "_ZN3ccc9CC14x11y8E", // class name
  bases__ZN3ccc9CC14x11y8E, 2,
  &(vtc__ZN3ccc9CC14x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y8E),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y9  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC14x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x11y93pqrEv
  ~CC14x11y9(); // tgen
  CC14x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x11y9E) C1{ BC2{ v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x11y93efgEv");}
void  ccc::CC14x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x11y93pqrEv");}
ccc::CC14x11y9 ::~CC14x11y9(){ note_dtor("_ZN3ccc9CC14x11y9E", this);} // tgen
ccc::CC14x11y9 ::CC14x11y9(){ note_ctor("_ZN3ccc9CC14x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x11y9E, buf);
    ::ccc::CC14x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x11y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9CC14x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x11y9E);
    dp->::ccc::CC14x11y9::~CC14x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x11y9E(Test__ZN3ccc9CC14x11y9E, "_ZN3ccc9CC14x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x11y9C1Ev();
extern void _ZN3ccc9CC14x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x11y9E[] = {
  NSPAIR(_ZN3ccc9CC14x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC14x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y9E[];
extern void _ZN3ccc9CC14x11y93pqrEv();
extern void _ZN3ccc9CC14x11y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y93pqrEv,_ZThn4_N3ccc9CC14x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC14x11y93efgEv,_ZThn4_N3ccc9CC14x11y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x11y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y93pqrEv,_ZThn4_N3ccc9CC14x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x11y93efgEv,_ZThn4_N3ccc9CC14x11y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x11y9E[];
Class_Descriptor cd__ZN3ccc9CC14x11y9E = {  "_ZN3ccc9CC14x11y9E", // class name
  bases__ZN3ccc9CC14x11y9E, 2,
  &(vtc__ZN3ccc9CC14x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x11y9E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y10  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC14x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x11y103abcEv
  ~CC14x11y10(); // tgen
  CC14x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y10E) C1{ BC2{ v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x11y103pqrEv");}
void  ccc::CC14x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x11y103abcEv");}
ccc::CC14x11y10 ::~CC14x11y10(){ note_dtor("_ZN3ccc10CC14x11y10E", this);} // tgen
ccc::CC14x11y10 ::CC14x11y10(){ note_ctor("_ZN3ccc10CC14x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y10E, buf);
    ::ccc::CC14x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y10E);
    dp->::ccc::CC14x11y10::~CC14x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y10E(Test__ZN3ccc10CC14x11y10E, "_ZN3ccc10CC14x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y10C1Ev();
extern void _ZN3ccc10CC14x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y10E[] = {
  NSPAIR(_ZN3ccc10CC14x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y10E[];
extern void _ZN3ccc10CC14x11y103pqrEv();
extern void _ZN3ccc10CC14x11y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x11y103pqrEv,_ZThn4_N3ccc10CC14x11y103pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x11y103pqrEv,_ZThn4_N3ccc10CC14x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y10E[];
Class_Descriptor cd__ZN3ccc10CC14x11y10E = {  "_ZN3ccc10CC14x11y10E", // class name
  bases__ZN3ccc10CC14x11y10E, 2,
  &(vtc__ZN3ccc10CC14x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y10E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y11  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC14x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x11y113efgEv
  ~CC14x11y11(); // tgen
  CC14x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y11E) C1{ BC2{ v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x11y113pqrEv");}
void  ccc::CC14x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x11y113efgEv");}
ccc::CC14x11y11 ::~CC14x11y11(){ note_dtor("_ZN3ccc10CC14x11y11E", this);} // tgen
ccc::CC14x11y11 ::CC14x11y11(){ note_ctor("_ZN3ccc10CC14x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y11E, buf);
    ::ccc::CC14x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y11E);
    dp->::ccc::CC14x11y11::~CC14x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y11E(Test__ZN3ccc10CC14x11y11E, "_ZN3ccc10CC14x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y11C1Ev();
extern void _ZN3ccc10CC14x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y11E[] = {
  NSPAIR(_ZN3ccc10CC14x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y11E[];
extern void _ZN3ccc10CC14x11y113pqrEv();
extern void _ZN3ccc10CC14x11y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x11y113pqrEv,_ZThn4_N3ccc10CC14x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc10CC14x11y113efgEv,_ZThn4_N3ccc10CC14x11y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x11y113pqrEv,_ZThn4_N3ccc10CC14x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x11y113efgEv,_ZThn4_N3ccc10CC14x11y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y11E[];
Class_Descriptor cd__ZN3ccc10CC14x11y11E = {  "_ZN3ccc10CC14x11y11E", // class name
  bases__ZN3ccc10CC14x11y11E, 2,
  &(vtc__ZN3ccc10CC14x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y11E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y12  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC14x11y123abcEv
  ~CC14x11y12(); // tgen
  CC14x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y12E) C1{ BC2{ v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC14x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x11y123abcEv");}
ccc::CC14x11y12 ::~CC14x11y12(){ note_dtor("_ZN3ccc10CC14x11y12E", this);} // tgen
ccc::CC14x11y12 ::CC14x11y12(){ note_ctor("_ZN3ccc10CC14x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y12E, buf);
    ::ccc::CC14x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y12E);
    dp->::ccc::CC14x11y12::~CC14x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y12E(Test__ZN3ccc10CC14x11y12E, "_ZN3ccc10CC14x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y12C1Ev();
extern void _ZN3ccc10CC14x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y12E[] = {
  NSPAIR(_ZN3ccc10CC14x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y12E[];
Class_Descriptor cd__ZN3ccc10CC14x11y12E = {  "_ZN3ccc10CC14x11y12E", // class name
  bases__ZN3ccc10CC14x11y12E, 2,
  &(vtc__ZN3ccc10CC14x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y12E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y13  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC14x11y133efgEv
  ~CC14x11y13(); // tgen
  CC14x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y13E) C1{ BC2{ v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC14x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x11y133efgEv");}
ccc::CC14x11y13 ::~CC14x11y13(){ note_dtor("_ZN3ccc10CC14x11y13E", this);} // tgen
ccc::CC14x11y13 ::CC14x11y13(){ note_ctor("_ZN3ccc10CC14x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y13E, buf);
    ::ccc::CC14x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y13E);
    dp->::ccc::CC14x11y13::~CC14x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y13E(Test__ZN3ccc10CC14x11y13E, "_ZN3ccc10CC14x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y13C1Ev();
extern void _ZN3ccc10CC14x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y13E[] = {
  NSPAIR(_ZN3ccc10CC14x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x11y133efgEv,_ZThn4_N3ccc10CC14x11y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x11y133efgEv,_ZThn4_N3ccc10CC14x11y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y13E[];
Class_Descriptor cd__ZN3ccc10CC14x11y13E = {  "_ZN3ccc10CC14x11y13E", // class name
  bases__ZN3ccc10CC14x11y13E, 2,
  &(vtc__ZN3ccc10CC14x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y13E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y14  : ::ccc::AA14 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC14x11y143pqrEv
  ~CC14x11y14(); // tgen
  CC14x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y14E) C1{ BC2{ v1} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC14x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x11y143pqrEv");}
ccc::CC14x11y14 ::~CC14x11y14(){ note_dtor("_ZN3ccc10CC14x11y14E", this);} // tgen
ccc::CC14x11y14 ::CC14x11y14(){ note_ctor("_ZN3ccc10CC14x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y14E, buf);
    ::ccc::CC14x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y14E);
    dp->::ccc::CC14x11y14::~CC14x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y14E(Test__ZN3ccc10CC14x11y14E, "_ZN3ccc10CC14x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y14C1Ev();
extern void _ZN3ccc10CC14x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y14E[] = {
  NSPAIR(_ZN3ccc10CC14x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y14E[];
extern void _ZN3ccc10CC14x11y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x11y143pqrEv,_ZThn4_N3ccc10CC14x11y143pqrEv)();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x11y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x11y143pqrEv,_ZThn4_N3ccc10CC14x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y14E[];
Class_Descriptor cd__ZN3ccc10CC14x11y14E = {  "_ZN3ccc10CC14x11y14E", // class name
  bases__ZN3ccc10CC14x11y14E, 2,
  &(vtc__ZN3ccc10CC14x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y14E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x11y15  : ::ccc::AA14 , ::ccc::BB11 {
  ~CC14x11y15(); // tgen
  CC14x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x11y15E) C1{ BC2{ v1} BC3{ v2 v3}}
}
namespace ccc { 
ccc::CC14x11y15 ::~CC14x11y15(){ note_dtor("_ZN3ccc10CC14x11y15E", this);} // tgen
ccc::CC14x11y15 ::CC14x11y15(){ note_ctor("_ZN3ccc10CC14x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x11y15E, buf);
    ::ccc::CC14x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x11y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc10CC14x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x11y15E);
    dp->::ccc::CC14x11y15::~CC14x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x11y15E(Test__ZN3ccc10CC14x11y15E, "_ZN3ccc10CC14x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x11y15C1Ev();
extern void _ZN3ccc10CC14x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x11y15E[] = {
  NSPAIR(_ZN3ccc10CC14x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC14x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x11y15E[];
Class_Descriptor cd__ZN3ccc10CC14x11y15E = {  "_ZN3ccc10CC14x11y15E", // class name
  bases__ZN3ccc10CC14x11y15E, 2,
  &(vtc__ZN3ccc10CC14x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x11y15E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y0  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC14x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y03pqrEv
  ~CC14x12y0(); // tgen
  CC14x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y0E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y03abcEv");}
void  ccc::CC14x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y03efgEv");}
void  ccc::CC14x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y03pqrEv");}
ccc::CC14x12y0 ::~CC14x12y0(){ note_dtor("_ZN3ccc9CC14x12y0E", this);} // tgen
ccc::CC14x12y0 ::CC14x12y0(){ note_ctor("_ZN3ccc9CC14x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y0E, buf);
    ::ccc::CC14x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y0E);
    dp->::ccc::CC14x12y0::~CC14x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y0E(Test__ZN3ccc9CC14x12y0E, "_ZN3ccc9CC14x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y0C1Ev();
extern void _ZN3ccc9CC14x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y0E[] = {
  NSPAIR(_ZN3ccc9CC14x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y0E[];
extern void _ZN3ccc9CC14x12y03pqrEv();
extern void _ZN3ccc9CC14x12y03abcEv();
extern void _ZN3ccc9CC14x12y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y03abcEv,_ZThn4_N3ccc9CC14x12y03abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y03abcEv,_ZThn4_N3ccc9CC14x12y03abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y0E[];
Class_Descriptor cd__ZN3ccc9CC14x12y0E = {  "_ZN3ccc9CC14x12y0E", // class name
  bases__ZN3ccc9CC14x12y0E, 2,
  &(vtc__ZN3ccc9CC14x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y1  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC14x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x12y13efgEv
  ~CC14x12y1(); // tgen
  CC14x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y1E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y13abcEv");}
void  ccc::CC14x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y13pqrEv");}
void  ccc::CC14x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y13efgEv");}
ccc::CC14x12y1 ::~CC14x12y1(){ note_dtor("_ZN3ccc9CC14x12y1E", this);} // tgen
ccc::CC14x12y1 ::CC14x12y1(){ note_ctor("_ZN3ccc9CC14x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y1E, buf);
    ::ccc::CC14x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y1E);
    dp->::ccc::CC14x12y1::~CC14x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y1E(Test__ZN3ccc9CC14x12y1E, "_ZN3ccc9CC14x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y1C1Ev();
extern void _ZN3ccc9CC14x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y1E[] = {
  NSPAIR(_ZN3ccc9CC14x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y1E[];
extern void _ZN3ccc9CC14x12y13pqrEv();
extern void _ZN3ccc9CC14x12y13abcEv();
extern void _ZN3ccc9CC14x12y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y13abcEv,_ZThn4_N3ccc9CC14x12y13abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y13abcEv,_ZThn4_N3ccc9CC14x12y13abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y1E[];
Class_Descriptor cd__ZN3ccc9CC14x12y1E = {  "_ZN3ccc9CC14x12y1E", // class name
  bases__ZN3ccc9CC14x12y1E, 2,
  &(vtc__ZN3ccc9CC14x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y2  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC14x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y23pqrEv
  ~CC14x12y2(); // tgen
  CC14x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y2E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y23efgEv");}
void  ccc::CC14x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y23abcEv");}
void  ccc::CC14x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y23pqrEv");}
ccc::CC14x12y2 ::~CC14x12y2(){ note_dtor("_ZN3ccc9CC14x12y2E", this);} // tgen
ccc::CC14x12y2 ::CC14x12y2(){ note_ctor("_ZN3ccc9CC14x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y2E, buf);
    ::ccc::CC14x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y2E);
    dp->::ccc::CC14x12y2::~CC14x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y2E(Test__ZN3ccc9CC14x12y2E, "_ZN3ccc9CC14x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y2C1Ev();
extern void _ZN3ccc9CC14x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y2E[] = {
  NSPAIR(_ZN3ccc9CC14x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y2E[];
extern void _ZN3ccc9CC14x12y23pqrEv();
extern void _ZN3ccc9CC14x12y23efgEv();
extern void _ZN3ccc9CC14x12y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y23abcEv,_ZThn4_N3ccc9CC14x12y23abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y23abcEv,_ZThn4_N3ccc9CC14x12y23abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y2E[];
Class_Descriptor cd__ZN3ccc9CC14x12y2E = {  "_ZN3ccc9CC14x12y2E", // class name
  bases__ZN3ccc9CC14x12y2E, 2,
  &(vtc__ZN3ccc9CC14x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y3  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC14x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x12y33abcEv
  ~CC14x12y3(); // tgen
  CC14x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y3E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y33efgEv");}
void  ccc::CC14x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y33pqrEv");}
void  ccc::CC14x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y33abcEv");}
ccc::CC14x12y3 ::~CC14x12y3(){ note_dtor("_ZN3ccc9CC14x12y3E", this);} // tgen
ccc::CC14x12y3 ::CC14x12y3(){ note_ctor("_ZN3ccc9CC14x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y3E, buf);
    ::ccc::CC14x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y3E);
    dp->::ccc::CC14x12y3::~CC14x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y3E(Test__ZN3ccc9CC14x12y3E, "_ZN3ccc9CC14x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y3C1Ev();
extern void _ZN3ccc9CC14x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y3E[] = {
  NSPAIR(_ZN3ccc9CC14x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y3E[];
extern void _ZN3ccc9CC14x12y33pqrEv();
extern void _ZN3ccc9CC14x12y33efgEv();
extern void _ZN3ccc9CC14x12y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y33abcEv,_ZThn4_N3ccc9CC14x12y33abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y33abcEv,_ZThn4_N3ccc9CC14x12y33abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y3E[];
Class_Descriptor cd__ZN3ccc9CC14x12y3E = {  "_ZN3ccc9CC14x12y3E", // class name
  bases__ZN3ccc9CC14x12y3E, 2,
  &(vtc__ZN3ccc9CC14x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y4  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC14x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x12y43efgEv
  ~CC14x12y4(); // tgen
  CC14x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y4E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y43pqrEv");}
void  ccc::CC14x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y43abcEv");}
void  ccc::CC14x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y43efgEv");}
ccc::CC14x12y4 ::~CC14x12y4(){ note_dtor("_ZN3ccc9CC14x12y4E", this);} // tgen
ccc::CC14x12y4 ::CC14x12y4(){ note_ctor("_ZN3ccc9CC14x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y4E, buf);
    ::ccc::CC14x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y4E);
    dp->::ccc::CC14x12y4::~CC14x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y4E(Test__ZN3ccc9CC14x12y4E, "_ZN3ccc9CC14x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y4C1Ev();
extern void _ZN3ccc9CC14x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y4E[] = {
  NSPAIR(_ZN3ccc9CC14x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y4E[];
extern void _ZN3ccc9CC14x12y43pqrEv();
extern void _ZN3ccc9CC14x12y43abcEv();
extern void _ZN3ccc9CC14x12y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y43abcEv,_ZThn4_N3ccc9CC14x12y43abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y43abcEv,_ZThn4_N3ccc9CC14x12y43abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y4E[];
Class_Descriptor cd__ZN3ccc9CC14x12y4E = {  "_ZN3ccc9CC14x12y4E", // class name
  bases__ZN3ccc9CC14x12y4E, 2,
  &(vtc__ZN3ccc9CC14x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y5  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC14x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x12y53abcEv
  ~CC14x12y5(); // tgen
  CC14x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y5E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y53pqrEv");}
void  ccc::CC14x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y53efgEv");}
void  ccc::CC14x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y53abcEv");}
ccc::CC14x12y5 ::~CC14x12y5(){ note_dtor("_ZN3ccc9CC14x12y5E", this);} // tgen
ccc::CC14x12y5 ::CC14x12y5(){ note_ctor("_ZN3ccc9CC14x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y5E, buf);
    ::ccc::CC14x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y5E);
    dp->::ccc::CC14x12y5::~CC14x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y5E(Test__ZN3ccc9CC14x12y5E, "_ZN3ccc9CC14x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y5C1Ev();
extern void _ZN3ccc9CC14x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y5E[] = {
  NSPAIR(_ZN3ccc9CC14x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y5E[];
extern void _ZN3ccc9CC14x12y53pqrEv();
extern void _ZN3ccc9CC14x12y53efgEv();
extern void _ZN3ccc9CC14x12y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y53abcEv,_ZThn4_N3ccc9CC14x12y53abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y53abcEv,_ZThn4_N3ccc9CC14x12y53abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y5E[];
Class_Descriptor cd__ZN3ccc9CC14x12y5E = {  "_ZN3ccc9CC14x12y5E", // class name
  bases__ZN3ccc9CC14x12y5E, 2,
  &(vtc__ZN3ccc9CC14x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y6  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC14x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x12y63efgEv
  ~CC14x12y6(); // tgen
  CC14x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y6E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y63abcEv");}
void  ccc::CC14x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y63efgEv");}
ccc::CC14x12y6 ::~CC14x12y6(){ note_dtor("_ZN3ccc9CC14x12y6E", this);} // tgen
ccc::CC14x12y6 ::CC14x12y6(){ note_ctor("_ZN3ccc9CC14x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y6E, buf);
    ::ccc::CC14x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y6E);
    dp->::ccc::CC14x12y6::~CC14x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y6E(Test__ZN3ccc9CC14x12y6E, "_ZN3ccc9CC14x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y6C1Ev();
extern void _ZN3ccc9CC14x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y6E[] = {
  NSPAIR(_ZN3ccc9CC14x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x12y63abcEv();
extern void _ZN3ccc9CC14x12y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y63abcEv,_ZThn4_N3ccc9CC14x12y63abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y63abcEv,_ZThn4_N3ccc9CC14x12y63abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y6E[];
Class_Descriptor cd__ZN3ccc9CC14x12y6E = {  "_ZN3ccc9CC14x12y6E", // class name
  bases__ZN3ccc9CC14x12y6E, 2,
  &(vtc__ZN3ccc9CC14x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y7  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC14x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y73pqrEv
  ~CC14x12y7(); // tgen
  CC14x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y7E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y73abcEv");}
void  ccc::CC14x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y73pqrEv");}
ccc::CC14x12y7 ::~CC14x12y7(){ note_dtor("_ZN3ccc9CC14x12y7E", this);} // tgen
ccc::CC14x12y7 ::CC14x12y7(){ note_ctor("_ZN3ccc9CC14x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y7E, buf);
    ::ccc::CC14x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y7E);
    dp->::ccc::CC14x12y7::~CC14x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y7E(Test__ZN3ccc9CC14x12y7E, "_ZN3ccc9CC14x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y7C1Ev();
extern void _ZN3ccc9CC14x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y7E[] = {
  NSPAIR(_ZN3ccc9CC14x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y7E[];
extern void _ZN3ccc9CC14x12y73pqrEv();
extern void _ZN3ccc9CC14x12y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y73abcEv,_ZThn4_N3ccc9CC14x12y73abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y73abcEv,_ZThn4_N3ccc9CC14x12y73abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y7E[];
Class_Descriptor cd__ZN3ccc9CC14x12y7E = {  "_ZN3ccc9CC14x12y7E", // class name
  bases__ZN3ccc9CC14x12y7E, 2,
  &(vtc__ZN3ccc9CC14x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y8  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC14x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x12y83abcEv
  ~CC14x12y8(); // tgen
  CC14x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y8E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y83efgEv");}
void  ccc::CC14x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x12y83abcEv");}
ccc::CC14x12y8 ::~CC14x12y8(){ note_dtor("_ZN3ccc9CC14x12y8E", this);} // tgen
ccc::CC14x12y8 ::CC14x12y8(){ note_ctor("_ZN3ccc9CC14x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y8E, buf);
    ::ccc::CC14x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y8E);
    dp->::ccc::CC14x12y8::~CC14x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y8E(Test__ZN3ccc9CC14x12y8E, "_ZN3ccc9CC14x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y8C1Ev();
extern void _ZN3ccc9CC14x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y8E[] = {
  NSPAIR(_ZN3ccc9CC14x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x12y83efgEv();
extern void _ZN3ccc9CC14x12y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x12y83abcEv,_ZThn4_N3ccc9CC14x12y83abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x12y83abcEv,_ZThn4_N3ccc9CC14x12y83abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y8E[];
Class_Descriptor cd__ZN3ccc9CC14x12y8E = {  "_ZN3ccc9CC14x12y8E", // class name
  bases__ZN3ccc9CC14x12y8E, 2,
  &(vtc__ZN3ccc9CC14x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y9  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC14x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x12y93pqrEv
  ~CC14x12y9(); // tgen
  CC14x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x12y9E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x12y93efgEv");}
void  ccc::CC14x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x12y93pqrEv");}
ccc::CC14x12y9 ::~CC14x12y9(){ note_dtor("_ZN3ccc9CC14x12y9E", this);} // tgen
ccc::CC14x12y9 ::CC14x12y9(){ note_ctor("_ZN3ccc9CC14x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x12y9E, buf);
    ::ccc::CC14x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x12y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9CC14x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x12y9E);
    dp->::ccc::CC14x12y9::~CC14x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x12y9E(Test__ZN3ccc9CC14x12y9E, "_ZN3ccc9CC14x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x12y9C1Ev();
extern void _ZN3ccc9CC14x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x12y9E[] = {
  NSPAIR(_ZN3ccc9CC14x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC14x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y9E[];
extern void _ZN3ccc9CC14x12y93pqrEv();
extern void _ZN3ccc9CC14x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x12y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x12y9E[];
Class_Descriptor cd__ZN3ccc9CC14x12y9E = {  "_ZN3ccc9CC14x12y9E", // class name
  bases__ZN3ccc9CC14x12y9E, 2,
  &(vtc__ZN3ccc9CC14x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x12y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y10  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC14x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x12y103abcEv
  ~CC14x12y10(); // tgen
  CC14x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y10E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x12y103pqrEv");}
void  ccc::CC14x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x12y103abcEv");}
ccc::CC14x12y10 ::~CC14x12y10(){ note_dtor("_ZN3ccc10CC14x12y10E", this);} // tgen
ccc::CC14x12y10 ::CC14x12y10(){ note_ctor("_ZN3ccc10CC14x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y10E, buf);
    ::ccc::CC14x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y10E);
    dp->::ccc::CC14x12y10::~CC14x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y10E(Test__ZN3ccc10CC14x12y10E, "_ZN3ccc10CC14x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y10C1Ev();
extern void _ZN3ccc10CC14x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y10E[] = {
  NSPAIR(_ZN3ccc10CC14x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y10E[];
extern void _ZN3ccc10CC14x12y103pqrEv();
extern void _ZN3ccc10CC14x12y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x12y103abcEv,_ZThn4_N3ccc10CC14x12y103abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x12y103abcEv,_ZThn4_N3ccc10CC14x12y103abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y10E[];
Class_Descriptor cd__ZN3ccc10CC14x12y10E = {  "_ZN3ccc10CC14x12y10E", // class name
  bases__ZN3ccc10CC14x12y10E, 2,
  &(vtc__ZN3ccc10CC14x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y11  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC14x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x12y113efgEv
  ~CC14x12y11(); // tgen
  CC14x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y11E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x12y113pqrEv");}
void  ccc::CC14x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x12y113efgEv");}
ccc::CC14x12y11 ::~CC14x12y11(){ note_dtor("_ZN3ccc10CC14x12y11E", this);} // tgen
ccc::CC14x12y11 ::CC14x12y11(){ note_ctor("_ZN3ccc10CC14x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y11E, buf);
    ::ccc::CC14x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y11E);
    dp->::ccc::CC14x12y11::~CC14x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y11E(Test__ZN3ccc10CC14x12y11E, "_ZN3ccc10CC14x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y11C1Ev();
extern void _ZN3ccc10CC14x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y11E[] = {
  NSPAIR(_ZN3ccc10CC14x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y11E[];
extern void _ZN3ccc10CC14x12y113pqrEv();
extern void _ZN3ccc10CC14x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y11E[];
Class_Descriptor cd__ZN3ccc10CC14x12y11E = {  "_ZN3ccc10CC14x12y11E", // class name
  bases__ZN3ccc10CC14x12y11E, 2,
  &(vtc__ZN3ccc10CC14x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y12  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC14x12y123abcEv
  ~CC14x12y12(); // tgen
  CC14x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y12E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC14x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x12y123abcEv");}
ccc::CC14x12y12 ::~CC14x12y12(){ note_dtor("_ZN3ccc10CC14x12y12E", this);} // tgen
ccc::CC14x12y12 ::CC14x12y12(){ note_ctor("_ZN3ccc10CC14x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y12E, buf);
    ::ccc::CC14x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y12E);
    dp->::ccc::CC14x12y12::~CC14x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y12E(Test__ZN3ccc10CC14x12y12E, "_ZN3ccc10CC14x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y12C1Ev();
extern void _ZN3ccc10CC14x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y12E[] = {
  NSPAIR(_ZN3ccc10CC14x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x12y123abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x12y123abcEv,_ZThn4_N3ccc10CC14x12y123abcEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x12y123abcEv,_ZThn4_N3ccc10CC14x12y123abcEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y12E[];
Class_Descriptor cd__ZN3ccc10CC14x12y12E = {  "_ZN3ccc10CC14x12y12E", // class name
  bases__ZN3ccc10CC14x12y12E, 2,
  &(vtc__ZN3ccc10CC14x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y13  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC14x12y133efgEv
  ~CC14x12y13(); // tgen
  CC14x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y13E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC14x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x12y133efgEv");}
ccc::CC14x12y13 ::~CC14x12y13(){ note_dtor("_ZN3ccc10CC14x12y13E", this);} // tgen
ccc::CC14x12y13 ::CC14x12y13(){ note_ctor("_ZN3ccc10CC14x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y13E, buf);
    ::ccc::CC14x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y13E);
    dp->::ccc::CC14x12y13::~CC14x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y13E(Test__ZN3ccc10CC14x12y13E, "_ZN3ccc10CC14x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y13C1Ev();
extern void _ZN3ccc10CC14x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y13E[] = {
  NSPAIR(_ZN3ccc10CC14x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y13E[];
Class_Descriptor cd__ZN3ccc10CC14x12y13E = {  "_ZN3ccc10CC14x12y13E", // class name
  bases__ZN3ccc10CC14x12y13E, 2,
  &(vtc__ZN3ccc10CC14x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y14  : ::ccc::AA14 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC14x12y143pqrEv
  ~CC14x12y14(); // tgen
  CC14x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y14E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC14x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x12y143pqrEv");}
ccc::CC14x12y14 ::~CC14x12y14(){ note_dtor("_ZN3ccc10CC14x12y14E", this);} // tgen
ccc::CC14x12y14 ::CC14x12y14(){ note_ctor("_ZN3ccc10CC14x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y14E, buf);
    ::ccc::CC14x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y14E);
    dp->::ccc::CC14x12y14::~CC14x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y14E(Test__ZN3ccc10CC14x12y14E, "_ZN3ccc10CC14x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y14C1Ev();
extern void _ZN3ccc10CC14x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y14E[] = {
  NSPAIR(_ZN3ccc10CC14x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y14E[];
extern void _ZN3ccc10CC14x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x12y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y14E[];
Class_Descriptor cd__ZN3ccc10CC14x12y14E = {  "_ZN3ccc10CC14x12y14E", // class name
  bases__ZN3ccc10CC14x12y14E, 2,
  &(vtc__ZN3ccc10CC14x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y14E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x12y15  : ::ccc::AA14 , ::ccc::BB12 {
  ~CC14x12y15(); // tgen
  CC14x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x12y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC14x12y15 ::~CC14x12y15(){ note_dtor("_ZN3ccc10CC14x12y15E", this);} // tgen
ccc::CC14x12y15 ::CC14x12y15(){ note_ctor("_ZN3ccc10CC14x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x12y15E, buf);
    ::ccc::CC14x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x12y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc10CC14x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x12y15E);
    dp->::ccc::CC14x12y15::~CC14x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x12y15E(Test__ZN3ccc10CC14x12y15E, "_ZN3ccc10CC14x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x12y15C1Ev();
extern void _ZN3ccc10CC14x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x12y15E[] = {
  NSPAIR(_ZN3ccc10CC14x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC14x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x12y15E[];
Class_Descriptor cd__ZN3ccc10CC14x12y15E = {  "_ZN3ccc10CC14x12y15E", // class name
  bases__ZN3ccc10CC14x12y15E, 2,
  &(vtc__ZN3ccc10CC14x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x12y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y0  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC14x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y03pqrEv
  ~CC14x13y0(); // tgen
  CC14x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y0E) C1{ BC2{ v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y03abcEv");}
void  ccc::CC14x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y03efgEv");}
void  ccc::CC14x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y03pqrEv");}
ccc::CC14x13y0 ::~CC14x13y0(){ note_dtor("_ZN3ccc9CC14x13y0E", this);} // tgen
ccc::CC14x13y0 ::CC14x13y0(){ note_ctor("_ZN3ccc9CC14x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y0E, buf);
    ::ccc::CC14x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y0E);
    dp->::ccc::CC14x13y0::~CC14x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y0E(Test__ZN3ccc9CC14x13y0E, "_ZN3ccc9CC14x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y0C1Ev();
extern void _ZN3ccc9CC14x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y0E[] = {
  NSPAIR(_ZN3ccc9CC14x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y0E[];
extern void _ZN3ccc9CC14x13y03pqrEv();
extern void _ZN3ccc9CC14x13y03abcEv();
extern void _ZN3ccc9CC14x13y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y03efgEv,_ZThn4_N3ccc9CC14x13y03efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y03efgEv,_ZThn4_N3ccc9CC14x13y03efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y0E[];
Class_Descriptor cd__ZN3ccc9CC14x13y0E = {  "_ZN3ccc9CC14x13y0E", // class name
  bases__ZN3ccc9CC14x13y0E, 2,
  &(vtc__ZN3ccc9CC14x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y1  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC14x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x13y13efgEv
  ~CC14x13y1(); // tgen
  CC14x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y1E) C1{ BC2{ v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y13abcEv");}
void  ccc::CC14x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y13pqrEv");}
void  ccc::CC14x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y13efgEv");}
ccc::CC14x13y1 ::~CC14x13y1(){ note_dtor("_ZN3ccc9CC14x13y1E", this);} // tgen
ccc::CC14x13y1 ::CC14x13y1(){ note_ctor("_ZN3ccc9CC14x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y1E, buf);
    ::ccc::CC14x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y1E);
    dp->::ccc::CC14x13y1::~CC14x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y1E(Test__ZN3ccc9CC14x13y1E, "_ZN3ccc9CC14x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y1C1Ev();
extern void _ZN3ccc9CC14x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y1E[] = {
  NSPAIR(_ZN3ccc9CC14x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y1E[];
extern void _ZN3ccc9CC14x13y13pqrEv();
extern void _ZN3ccc9CC14x13y13abcEv();
extern void _ZN3ccc9CC14x13y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y13efgEv,_ZThn4_N3ccc9CC14x13y13efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y13efgEv,_ZThn4_N3ccc9CC14x13y13efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y1E[];
Class_Descriptor cd__ZN3ccc9CC14x13y1E = {  "_ZN3ccc9CC14x13y1E", // class name
  bases__ZN3ccc9CC14x13y1E, 2,
  &(vtc__ZN3ccc9CC14x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y2  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC14x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y23pqrEv
  ~CC14x13y2(); // tgen
  CC14x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y2E) C1{ BC2{ v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y23efgEv");}
void  ccc::CC14x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y23abcEv");}
void  ccc::CC14x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y23pqrEv");}
ccc::CC14x13y2 ::~CC14x13y2(){ note_dtor("_ZN3ccc9CC14x13y2E", this);} // tgen
ccc::CC14x13y2 ::CC14x13y2(){ note_ctor("_ZN3ccc9CC14x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y2E, buf);
    ::ccc::CC14x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y2E);
    dp->::ccc::CC14x13y2::~CC14x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y2E(Test__ZN3ccc9CC14x13y2E, "_ZN3ccc9CC14x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y2C1Ev();
extern void _ZN3ccc9CC14x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y2E[] = {
  NSPAIR(_ZN3ccc9CC14x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y2E[];
extern void _ZN3ccc9CC14x13y23pqrEv();
extern void _ZN3ccc9CC14x13y23efgEv();
extern void _ZN3ccc9CC14x13y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y23efgEv,_ZThn4_N3ccc9CC14x13y23efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y23efgEv,_ZThn4_N3ccc9CC14x13y23efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y2E[];
Class_Descriptor cd__ZN3ccc9CC14x13y2E = {  "_ZN3ccc9CC14x13y2E", // class name
  bases__ZN3ccc9CC14x13y2E, 2,
  &(vtc__ZN3ccc9CC14x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y3  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC14x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x13y33abcEv
  ~CC14x13y3(); // tgen
  CC14x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y3E) C1{ BC2{ v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y33efgEv");}
void  ccc::CC14x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y33pqrEv");}
void  ccc::CC14x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y33abcEv");}
ccc::CC14x13y3 ::~CC14x13y3(){ note_dtor("_ZN3ccc9CC14x13y3E", this);} // tgen
ccc::CC14x13y3 ::CC14x13y3(){ note_ctor("_ZN3ccc9CC14x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y3E, buf);
    ::ccc::CC14x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y3E);
    dp->::ccc::CC14x13y3::~CC14x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y3E(Test__ZN3ccc9CC14x13y3E, "_ZN3ccc9CC14x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y3C1Ev();
extern void _ZN3ccc9CC14x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y3E[] = {
  NSPAIR(_ZN3ccc9CC14x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y3E[];
extern void _ZN3ccc9CC14x13y33pqrEv();
extern void _ZN3ccc9CC14x13y33efgEv();
extern void _ZN3ccc9CC14x13y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y33efgEv,_ZThn4_N3ccc9CC14x13y33efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y33efgEv,_ZThn4_N3ccc9CC14x13y33efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y3E[];
Class_Descriptor cd__ZN3ccc9CC14x13y3E = {  "_ZN3ccc9CC14x13y3E", // class name
  bases__ZN3ccc9CC14x13y3E, 2,
  &(vtc__ZN3ccc9CC14x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y4  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC14x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x13y43efgEv
  ~CC14x13y4(); // tgen
  CC14x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y4E) C1{ BC2{ v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y43pqrEv");}
void  ccc::CC14x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y43abcEv");}
void  ccc::CC14x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y43efgEv");}
ccc::CC14x13y4 ::~CC14x13y4(){ note_dtor("_ZN3ccc9CC14x13y4E", this);} // tgen
ccc::CC14x13y4 ::CC14x13y4(){ note_ctor("_ZN3ccc9CC14x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y4E, buf);
    ::ccc::CC14x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y4E);
    dp->::ccc::CC14x13y4::~CC14x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y4E(Test__ZN3ccc9CC14x13y4E, "_ZN3ccc9CC14x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y4C1Ev();
extern void _ZN3ccc9CC14x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y4E[] = {
  NSPAIR(_ZN3ccc9CC14x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y4E[];
extern void _ZN3ccc9CC14x13y43pqrEv();
extern void _ZN3ccc9CC14x13y43abcEv();
extern void _ZN3ccc9CC14x13y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y43efgEv,_ZThn4_N3ccc9CC14x13y43efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y43efgEv,_ZThn4_N3ccc9CC14x13y43efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y4E[];
Class_Descriptor cd__ZN3ccc9CC14x13y4E = {  "_ZN3ccc9CC14x13y4E", // class name
  bases__ZN3ccc9CC14x13y4E, 2,
  &(vtc__ZN3ccc9CC14x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y5  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC14x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x13y53abcEv
  ~CC14x13y5(); // tgen
  CC14x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y5E) C1{ BC2{ v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y53pqrEv");}
void  ccc::CC14x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y53efgEv");}
void  ccc::CC14x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y53abcEv");}
ccc::CC14x13y5 ::~CC14x13y5(){ note_dtor("_ZN3ccc9CC14x13y5E", this);} // tgen
ccc::CC14x13y5 ::CC14x13y5(){ note_ctor("_ZN3ccc9CC14x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y5E, buf);
    ::ccc::CC14x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y5E);
    dp->::ccc::CC14x13y5::~CC14x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y5E(Test__ZN3ccc9CC14x13y5E, "_ZN3ccc9CC14x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y5C1Ev();
extern void _ZN3ccc9CC14x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y5E[] = {
  NSPAIR(_ZN3ccc9CC14x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y5E[];
extern void _ZN3ccc9CC14x13y53pqrEv();
extern void _ZN3ccc9CC14x13y53efgEv();
extern void _ZN3ccc9CC14x13y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y53efgEv,_ZThn4_N3ccc9CC14x13y53efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y53efgEv,_ZThn4_N3ccc9CC14x13y53efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y5E[];
Class_Descriptor cd__ZN3ccc9CC14x13y5E = {  "_ZN3ccc9CC14x13y5E", // class name
  bases__ZN3ccc9CC14x13y5E, 2,
  &(vtc__ZN3ccc9CC14x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y6  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC14x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x13y63efgEv
  ~CC14x13y6(); // tgen
  CC14x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y6E) C1{ BC2{ v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y63abcEv");}
void  ccc::CC14x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y63efgEv");}
ccc::CC14x13y6 ::~CC14x13y6(){ note_dtor("_ZN3ccc9CC14x13y6E", this);} // tgen
ccc::CC14x13y6 ::CC14x13y6(){ note_ctor("_ZN3ccc9CC14x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y6E, buf);
    ::ccc::CC14x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y6E);
    dp->::ccc::CC14x13y6::~CC14x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y6E(Test__ZN3ccc9CC14x13y6E, "_ZN3ccc9CC14x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y6C1Ev();
extern void _ZN3ccc9CC14x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y6E[] = {
  NSPAIR(_ZN3ccc9CC14x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x13y63abcEv();
extern void _ZN3ccc9CC14x13y63efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y63efgEv,_ZThn4_N3ccc9CC14x13y63efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y63efgEv,_ZThn4_N3ccc9CC14x13y63efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y6E[];
Class_Descriptor cd__ZN3ccc9CC14x13y6E = {  "_ZN3ccc9CC14x13y6E", // class name
  bases__ZN3ccc9CC14x13y6E, 2,
  &(vtc__ZN3ccc9CC14x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y7  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC14x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y73pqrEv
  ~CC14x13y7(); // tgen
  CC14x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y7E) C1{ BC2{ v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y73abcEv");}
void  ccc::CC14x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y73pqrEv");}
ccc::CC14x13y7 ::~CC14x13y7(){ note_dtor("_ZN3ccc9CC14x13y7E", this);} // tgen
ccc::CC14x13y7 ::CC14x13y7(){ note_ctor("_ZN3ccc9CC14x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y7E, buf);
    ::ccc::CC14x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y7E);
    dp->::ccc::CC14x13y7::~CC14x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y7E(Test__ZN3ccc9CC14x13y7E, "_ZN3ccc9CC14x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y7C1Ev();
extern void _ZN3ccc9CC14x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y7E[] = {
  NSPAIR(_ZN3ccc9CC14x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y7E[];
extern void _ZN3ccc9CC14x13y73pqrEv();
extern void _ZN3ccc9CC14x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y7E[];
Class_Descriptor cd__ZN3ccc9CC14x13y7E = {  "_ZN3ccc9CC14x13y7E", // class name
  bases__ZN3ccc9CC14x13y7E, 2,
  &(vtc__ZN3ccc9CC14x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y8  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC14x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x13y83abcEv
  ~CC14x13y8(); // tgen
  CC14x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y8E) C1{ BC2{ v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y83efgEv");}
void  ccc::CC14x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x13y83abcEv");}
ccc::CC14x13y8 ::~CC14x13y8(){ note_dtor("_ZN3ccc9CC14x13y8E", this);} // tgen
ccc::CC14x13y8 ::CC14x13y8(){ note_ctor("_ZN3ccc9CC14x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y8E, buf);
    ::ccc::CC14x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y8E);
    dp->::ccc::CC14x13y8::~CC14x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y8E(Test__ZN3ccc9CC14x13y8E, "_ZN3ccc9CC14x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y8C1Ev();
extern void _ZN3ccc9CC14x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y8E[] = {
  NSPAIR(_ZN3ccc9CC14x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x13y83efgEv();
extern void _ZN3ccc9CC14x13y83abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y83efgEv,_ZThn4_N3ccc9CC14x13y83efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y83efgEv,_ZThn4_N3ccc9CC14x13y83efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y8E[];
Class_Descriptor cd__ZN3ccc9CC14x13y8E = {  "_ZN3ccc9CC14x13y8E", // class name
  bases__ZN3ccc9CC14x13y8E, 2,
  &(vtc__ZN3ccc9CC14x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y9  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC14x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x13y93pqrEv
  ~CC14x13y9(); // tgen
  CC14x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x13y9E) C1{ BC2{ v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x13y93efgEv");}
void  ccc::CC14x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x13y93pqrEv");}
ccc::CC14x13y9 ::~CC14x13y9(){ note_dtor("_ZN3ccc9CC14x13y9E", this);} // tgen
ccc::CC14x13y9 ::CC14x13y9(){ note_ctor("_ZN3ccc9CC14x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x13y9E, buf);
    ::ccc::CC14x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x13y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9CC14x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x13y9E);
    dp->::ccc::CC14x13y9::~CC14x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x13y9E(Test__ZN3ccc9CC14x13y9E, "_ZN3ccc9CC14x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x13y9C1Ev();
extern void _ZN3ccc9CC14x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x13y9E[] = {
  NSPAIR(_ZN3ccc9CC14x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC14x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y9E[];
extern void _ZN3ccc9CC14x13y93pqrEv();
extern void _ZN3ccc9CC14x13y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x13y93efgEv,_ZThn4_N3ccc9CC14x13y93efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x13y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x13y93efgEv,_ZThn4_N3ccc9CC14x13y93efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x13y9E[];
Class_Descriptor cd__ZN3ccc9CC14x13y9E = {  "_ZN3ccc9CC14x13y9E", // class name
  bases__ZN3ccc9CC14x13y9E, 2,
  &(vtc__ZN3ccc9CC14x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x13y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y10  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC14x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x13y103abcEv
  ~CC14x13y10(); // tgen
  CC14x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y10E) C1{ BC2{ v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x13y103pqrEv");}
void  ccc::CC14x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x13y103abcEv");}
ccc::CC14x13y10 ::~CC14x13y10(){ note_dtor("_ZN3ccc10CC14x13y10E", this);} // tgen
ccc::CC14x13y10 ::CC14x13y10(){ note_ctor("_ZN3ccc10CC14x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y10E, buf);
    ::ccc::CC14x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y10E);
    dp->::ccc::CC14x13y10::~CC14x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y10E(Test__ZN3ccc10CC14x13y10E, "_ZN3ccc10CC14x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y10C1Ev();
extern void _ZN3ccc10CC14x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y10E[] = {
  NSPAIR(_ZN3ccc10CC14x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y10E[];
extern void _ZN3ccc10CC14x13y103pqrEv();
extern void _ZN3ccc10CC14x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y10E[];
Class_Descriptor cd__ZN3ccc10CC14x13y10E = {  "_ZN3ccc10CC14x13y10E", // class name
  bases__ZN3ccc10CC14x13y10E, 2,
  &(vtc__ZN3ccc10CC14x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y11  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC14x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x13y113efgEv
  ~CC14x13y11(); // tgen
  CC14x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y11E) C1{ BC2{ v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x13y113pqrEv");}
void  ccc::CC14x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x13y113efgEv");}
ccc::CC14x13y11 ::~CC14x13y11(){ note_dtor("_ZN3ccc10CC14x13y11E", this);} // tgen
ccc::CC14x13y11 ::CC14x13y11(){ note_ctor("_ZN3ccc10CC14x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y11E, buf);
    ::ccc::CC14x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y11E);
    dp->::ccc::CC14x13y11::~CC14x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y11E(Test__ZN3ccc10CC14x13y11E, "_ZN3ccc10CC14x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y11C1Ev();
extern void _ZN3ccc10CC14x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y11E[] = {
  NSPAIR(_ZN3ccc10CC14x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y11E[];
extern void _ZN3ccc10CC14x13y113pqrEv();
extern void _ZN3ccc10CC14x13y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x13y113efgEv,_ZThn4_N3ccc10CC14x13y113efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x13y113efgEv,_ZThn4_N3ccc10CC14x13y113efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y11E[];
Class_Descriptor cd__ZN3ccc10CC14x13y11E = {  "_ZN3ccc10CC14x13y11E", // class name
  bases__ZN3ccc10CC14x13y11E, 2,
  &(vtc__ZN3ccc10CC14x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y12  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC14x13y123abcEv
  ~CC14x13y12(); // tgen
  CC14x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y12E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC14x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x13y123abcEv");}
ccc::CC14x13y12 ::~CC14x13y12(){ note_dtor("_ZN3ccc10CC14x13y12E", this);} // tgen
ccc::CC14x13y12 ::CC14x13y12(){ note_ctor("_ZN3ccc10CC14x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y12E, buf);
    ::ccc::CC14x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y12E);
    dp->::ccc::CC14x13y12::~CC14x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y12E(Test__ZN3ccc10CC14x13y12E, "_ZN3ccc10CC14x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y12C1Ev();
extern void _ZN3ccc10CC14x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y12E[] = {
  NSPAIR(_ZN3ccc10CC14x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y12E[];
Class_Descriptor cd__ZN3ccc10CC14x13y12E = {  "_ZN3ccc10CC14x13y12E", // class name
  bases__ZN3ccc10CC14x13y12E, 2,
  &(vtc__ZN3ccc10CC14x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y13  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC14x13y133efgEv
  ~CC14x13y13(); // tgen
  CC14x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y13E) C1{ BC2{ v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC14x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x13y133efgEv");}
ccc::CC14x13y13 ::~CC14x13y13(){ note_dtor("_ZN3ccc10CC14x13y13E", this);} // tgen
ccc::CC14x13y13 ::CC14x13y13(){ note_ctor("_ZN3ccc10CC14x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y13E, buf);
    ::ccc::CC14x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y13E);
    dp->::ccc::CC14x13y13::~CC14x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y13E(Test__ZN3ccc10CC14x13y13E, "_ZN3ccc10CC14x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y13C1Ev();
extern void _ZN3ccc10CC14x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y13E[] = {
  NSPAIR(_ZN3ccc10CC14x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x13y133efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x13y133efgEv,_ZThn4_N3ccc10CC14x13y133efgEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x13y133efgEv,_ZThn4_N3ccc10CC14x13y133efgEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y13E[];
Class_Descriptor cd__ZN3ccc10CC14x13y13E = {  "_ZN3ccc10CC14x13y13E", // class name
  bases__ZN3ccc10CC14x13y13E, 2,
  &(vtc__ZN3ccc10CC14x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y14  : ::ccc::AA14 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC14x13y143pqrEv
  ~CC14x13y14(); // tgen
  CC14x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y14E) C1{ BC2{ v1} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC14x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x13y143pqrEv");}
ccc::CC14x13y14 ::~CC14x13y14(){ note_dtor("_ZN3ccc10CC14x13y14E", this);} // tgen
ccc::CC14x13y14 ::CC14x13y14(){ note_ctor("_ZN3ccc10CC14x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y14E, buf);
    ::ccc::CC14x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y14E);
    dp->::ccc::CC14x13y14::~CC14x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y14E(Test__ZN3ccc10CC14x13y14E, "_ZN3ccc10CC14x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y14C1Ev();
extern void _ZN3ccc10CC14x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y14E[] = {
  NSPAIR(_ZN3ccc10CC14x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y14E[];
extern void _ZN3ccc10CC14x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x13y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y14E[];
Class_Descriptor cd__ZN3ccc10CC14x13y14E = {  "_ZN3ccc10CC14x13y14E", // class name
  bases__ZN3ccc10CC14x13y14E, 2,
  &(vtc__ZN3ccc10CC14x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y14E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x13y15  : ::ccc::AA14 , ::ccc::BB13 {
  ~CC14x13y15(); // tgen
  CC14x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x13y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC14x13y15 ::~CC14x13y15(){ note_dtor("_ZN3ccc10CC14x13y15E", this);} // tgen
ccc::CC14x13y15 ::CC14x13y15(){ note_ctor("_ZN3ccc10CC14x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x13y15E, buf);
    ::ccc::CC14x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x13y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc10CC14x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x13y15E);
    dp->::ccc::CC14x13y15::~CC14x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x13y15E(Test__ZN3ccc10CC14x13y15E, "_ZN3ccc10CC14x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x13y15C1Ev();
extern void _ZN3ccc10CC14x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x13y15E[] = {
  NSPAIR(_ZN3ccc10CC14x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC14x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x13y15E[];
Class_Descriptor cd__ZN3ccc10CC14x13y15E = {  "_ZN3ccc10CC14x13y15E", // class name
  bases__ZN3ccc10CC14x13y15E, 2,
  &(vtc__ZN3ccc10CC14x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x13y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y0  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC14x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y03pqrEv
  ~CC14x14y0(); // tgen
  CC14x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y0E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y03abcEv");}
void  ccc::CC14x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y03efgEv");}
void  ccc::CC14x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y03pqrEv");}
ccc::CC14x14y0 ::~CC14x14y0(){ note_dtor("_ZN3ccc9CC14x14y0E", this);} // tgen
ccc::CC14x14y0 ::CC14x14y0(){ note_ctor("_ZN3ccc9CC14x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y0E, buf);
    ::ccc::CC14x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y0E);
    dp->::ccc::CC14x14y0::~CC14x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y0E(Test__ZN3ccc9CC14x14y0E, "_ZN3ccc9CC14x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y0C1Ev();
extern void _ZN3ccc9CC14x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y0E[] = {
  NSPAIR(_ZN3ccc9CC14x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y0E[];
extern void _ZN3ccc9CC14x14y03pqrEv();
extern void _ZN3ccc9CC14x14y03abcEv();
extern void _ZN3ccc9CC14x14y03efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y03pqrEv,_ZThn4_N3ccc9CC14x14y03pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y03efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y03pqrEv,_ZThn4_N3ccc9CC14x14y03pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y0E[];
Class_Descriptor cd__ZN3ccc9CC14x14y0E = {  "_ZN3ccc9CC14x14y0E", // class name
  bases__ZN3ccc9CC14x14y0E, 2,
  &(vtc__ZN3ccc9CC14x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y0E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y1  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC14x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x14y13efgEv
  ~CC14x14y1(); // tgen
  CC14x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y1E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y13abcEv");}
void  ccc::CC14x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y13pqrEv");}
void  ccc::CC14x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y13efgEv");}
ccc::CC14x14y1 ::~CC14x14y1(){ note_dtor("_ZN3ccc9CC14x14y1E", this);} // tgen
ccc::CC14x14y1 ::CC14x14y1(){ note_ctor("_ZN3ccc9CC14x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y1E, buf);
    ::ccc::CC14x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y1E);
    dp->::ccc::CC14x14y1::~CC14x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y1E(Test__ZN3ccc9CC14x14y1E, "_ZN3ccc9CC14x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y1C1Ev();
extern void _ZN3ccc9CC14x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y1E[] = {
  NSPAIR(_ZN3ccc9CC14x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y1E[];
extern void _ZN3ccc9CC14x14y13pqrEv();
extern void _ZN3ccc9CC14x14y13abcEv();
extern void _ZN3ccc9CC14x14y13efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y13pqrEv,_ZThn4_N3ccc9CC14x14y13pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y13efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y13pqrEv,_ZThn4_N3ccc9CC14x14y13pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y1E[];
Class_Descriptor cd__ZN3ccc9CC14x14y1E = {  "_ZN3ccc9CC14x14y1E", // class name
  bases__ZN3ccc9CC14x14y1E, 2,
  &(vtc__ZN3ccc9CC14x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y1E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y2  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC14x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y23pqrEv
  ~CC14x14y2(); // tgen
  CC14x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y2E) C1{ BC2{ v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y23efgEv");}
void  ccc::CC14x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y23abcEv");}
void  ccc::CC14x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y23pqrEv");}
ccc::CC14x14y2 ::~CC14x14y2(){ note_dtor("_ZN3ccc9CC14x14y2E", this);} // tgen
ccc::CC14x14y2 ::CC14x14y2(){ note_ctor("_ZN3ccc9CC14x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y2E, buf);
    ::ccc::CC14x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y2E);
    dp->::ccc::CC14x14y2::~CC14x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y2E(Test__ZN3ccc9CC14x14y2E, "_ZN3ccc9CC14x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y2C1Ev();
extern void _ZN3ccc9CC14x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y2E[] = {
  NSPAIR(_ZN3ccc9CC14x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y2E[];
extern void _ZN3ccc9CC14x14y23pqrEv();
extern void _ZN3ccc9CC14x14y23efgEv();
extern void _ZN3ccc9CC14x14y23abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y23pqrEv,_ZThn4_N3ccc9CC14x14y23pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y23abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y23pqrEv,_ZThn4_N3ccc9CC14x14y23pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y2E[];
Class_Descriptor cd__ZN3ccc9CC14x14y2E = {  "_ZN3ccc9CC14x14y2E", // class name
  bases__ZN3ccc9CC14x14y2E, 2,
  &(vtc__ZN3ccc9CC14x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y2E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y3  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC14x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x14y33abcEv
  ~CC14x14y3(); // tgen
  CC14x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y3E) C1{ BC2{ v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y33efgEv");}
void  ccc::CC14x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y33pqrEv");}
void  ccc::CC14x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y33abcEv");}
ccc::CC14x14y3 ::~CC14x14y3(){ note_dtor("_ZN3ccc9CC14x14y3E", this);} // tgen
ccc::CC14x14y3 ::CC14x14y3(){ note_ctor("_ZN3ccc9CC14x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y3E, buf);
    ::ccc::CC14x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y3E);
    dp->::ccc::CC14x14y3::~CC14x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y3E(Test__ZN3ccc9CC14x14y3E, "_ZN3ccc9CC14x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y3C1Ev();
extern void _ZN3ccc9CC14x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y3E[] = {
  NSPAIR(_ZN3ccc9CC14x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y3E[];
extern void _ZN3ccc9CC14x14y33pqrEv();
extern void _ZN3ccc9CC14x14y33efgEv();
extern void _ZN3ccc9CC14x14y33abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y33pqrEv,_ZThn4_N3ccc9CC14x14y33pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y33abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y33pqrEv,_ZThn4_N3ccc9CC14x14y33pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y3E[];
Class_Descriptor cd__ZN3ccc9CC14x14y3E = {  "_ZN3ccc9CC14x14y3E", // class name
  bases__ZN3ccc9CC14x14y3E, 2,
  &(vtc__ZN3ccc9CC14x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y3E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y4  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC14x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x14y43efgEv
  ~CC14x14y4(); // tgen
  CC14x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y4E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y43pqrEv");}
void  ccc::CC14x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y43abcEv");}
void  ccc::CC14x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y43efgEv");}
ccc::CC14x14y4 ::~CC14x14y4(){ note_dtor("_ZN3ccc9CC14x14y4E", this);} // tgen
ccc::CC14x14y4 ::CC14x14y4(){ note_ctor("_ZN3ccc9CC14x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y4E, buf);
    ::ccc::CC14x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y4E);
    dp->::ccc::CC14x14y4::~CC14x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y4E(Test__ZN3ccc9CC14x14y4E, "_ZN3ccc9CC14x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y4C1Ev();
extern void _ZN3ccc9CC14x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y4E[] = {
  NSPAIR(_ZN3ccc9CC14x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y4E[];
extern void _ZN3ccc9CC14x14y43pqrEv();
extern void _ZN3ccc9CC14x14y43abcEv();
extern void _ZN3ccc9CC14x14y43efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y43pqrEv,_ZThn4_N3ccc9CC14x14y43pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y43efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y43pqrEv,_ZThn4_N3ccc9CC14x14y43pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y4E[];
Class_Descriptor cd__ZN3ccc9CC14x14y4E = {  "_ZN3ccc9CC14x14y4E", // class name
  bases__ZN3ccc9CC14x14y4E, 2,
  &(vtc__ZN3ccc9CC14x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y4E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y5  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC14x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x14y53abcEv
  ~CC14x14y5(); // tgen
  CC14x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y5E) C1{ BC2{ v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y53pqrEv");}
void  ccc::CC14x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y53efgEv");}
void  ccc::CC14x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y53abcEv");}
ccc::CC14x14y5 ::~CC14x14y5(){ note_dtor("_ZN3ccc9CC14x14y5E", this);} // tgen
ccc::CC14x14y5 ::CC14x14y5(){ note_ctor("_ZN3ccc9CC14x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y5E, buf);
    ::ccc::CC14x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y5E);
    dp->::ccc::CC14x14y5::~CC14x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y5E(Test__ZN3ccc9CC14x14y5E, "_ZN3ccc9CC14x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y5C1Ev();
extern void _ZN3ccc9CC14x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y5E[] = {
  NSPAIR(_ZN3ccc9CC14x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y5E[];
extern void _ZN3ccc9CC14x14y53pqrEv();
extern void _ZN3ccc9CC14x14y53efgEv();
extern void _ZN3ccc9CC14x14y53abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y53pqrEv,_ZThn4_N3ccc9CC14x14y53pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y53abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y53pqrEv,_ZThn4_N3ccc9CC14x14y53pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y5E[];
Class_Descriptor cd__ZN3ccc9CC14x14y5E = {  "_ZN3ccc9CC14x14y5E", // class name
  bases__ZN3ccc9CC14x14y5E, 2,
  &(vtc__ZN3ccc9CC14x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y5E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y6  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC14x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x14y63efgEv
  ~CC14x14y6(); // tgen
  CC14x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y6E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y63abcEv");}
void  ccc::CC14x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y63efgEv");}
ccc::CC14x14y6 ::~CC14x14y6(){ note_dtor("_ZN3ccc9CC14x14y6E", this);} // tgen
ccc::CC14x14y6 ::CC14x14y6(){ note_ctor("_ZN3ccc9CC14x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y6E, buf);
    ::ccc::CC14x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y6E);
    dp->::ccc::CC14x14y6::~CC14x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y6E(Test__ZN3ccc9CC14x14y6E, "_ZN3ccc9CC14x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y6C1Ev();
extern void _ZN3ccc9CC14x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y6E[] = {
  NSPAIR(_ZN3ccc9CC14x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x14y63abcEv();
extern void _ZN3ccc9CC14x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y63efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y6E[];
Class_Descriptor cd__ZN3ccc9CC14x14y6E = {  "_ZN3ccc9CC14x14y6E", // class name
  bases__ZN3ccc9CC14x14y6E, 2,
  &(vtc__ZN3ccc9CC14x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y6E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y7  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC14x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y73pqrEv
  ~CC14x14y7(); // tgen
  CC14x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y7E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y73abcEv");}
void  ccc::CC14x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y73pqrEv");}
ccc::CC14x14y7 ::~CC14x14y7(){ note_dtor("_ZN3ccc9CC14x14y7E", this);} // tgen
ccc::CC14x14y7 ::CC14x14y7(){ note_ctor("_ZN3ccc9CC14x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y7E, buf);
    ::ccc::CC14x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y7E);
    dp->::ccc::CC14x14y7::~CC14x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y7E(Test__ZN3ccc9CC14x14y7E, "_ZN3ccc9CC14x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y7C1Ev();
extern void _ZN3ccc9CC14x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y7E[] = {
  NSPAIR(_ZN3ccc9CC14x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y7E[];
extern void _ZN3ccc9CC14x14y73pqrEv();
extern void _ZN3ccc9CC14x14y73abcEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y73pqrEv,_ZThn4_N3ccc9CC14x14y73pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y73abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y73pqrEv,_ZThn4_N3ccc9CC14x14y73pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y7E[];
Class_Descriptor cd__ZN3ccc9CC14x14y7E = {  "_ZN3ccc9CC14x14y7E", // class name
  bases__ZN3ccc9CC14x14y7E, 2,
  &(vtc__ZN3ccc9CC14x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y7E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y8  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC14x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x14y83abcEv
  ~CC14x14y8(); // tgen
  CC14x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y8E) C1{ BC2{ v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y83efgEv");}
void  ccc::CC14x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x14y83abcEv");}
ccc::CC14x14y8 ::~CC14x14y8(){ note_dtor("_ZN3ccc9CC14x14y8E", this);} // tgen
ccc::CC14x14y8 ::CC14x14y8(){ note_ctor("_ZN3ccc9CC14x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y8E, buf);
    ::ccc::CC14x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y8E);
    dp->::ccc::CC14x14y8::~CC14x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y8E(Test__ZN3ccc9CC14x14y8E, "_ZN3ccc9CC14x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y8C1Ev();
extern void _ZN3ccc9CC14x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y8E[] = {
  NSPAIR(_ZN3ccc9CC14x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x14y83efgEv();
extern void _ZN3ccc9CC14x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y83abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y8E[];
Class_Descriptor cd__ZN3ccc9CC14x14y8E = {  "_ZN3ccc9CC14x14y8E", // class name
  bases__ZN3ccc9CC14x14y8E, 2,
  &(vtc__ZN3ccc9CC14x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y8E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y9  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC14x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x14y93pqrEv
  ~CC14x14y9(); // tgen
  CC14x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x14y9E) C1{ BC2{ v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x14y93efgEv");}
void  ccc::CC14x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x14y93pqrEv");}
ccc::CC14x14y9 ::~CC14x14y9(){ note_dtor("_ZN3ccc9CC14x14y9E", this);} // tgen
ccc::CC14x14y9 ::CC14x14y9(){ note_ctor("_ZN3ccc9CC14x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC14x14y9E, buf);
    ::ccc::CC14x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC14x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x14y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9CC14x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x14y9E);
    dp->::ccc::CC14x14y9::~CC14x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x14y9E(Test__ZN3ccc9CC14x14y9E, "_ZN3ccc9CC14x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC14x14y9C1Ev();
extern void _ZN3ccc9CC14x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x14y9E[] = {
  NSPAIR(_ZN3ccc9CC14x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC14x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y9E[];
extern void _ZN3ccc9CC14x14y93pqrEv();
extern void _ZN3ccc9CC14x14y93efgEv();
extern void ABISELECT(_ZThn8_N3ccc9CC14x14y93pqrEv,_ZThn4_N3ccc9CC14x14y93pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x14y93efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc9CC14x14y93pqrEv,_ZThn4_N3ccc9CC14x14y93pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x14y9E[];
Class_Descriptor cd__ZN3ccc9CC14x14y9E = {  "_ZN3ccc9CC14x14y9E", // class name
  bases__ZN3ccc9CC14x14y9E, 2,
  &(vtc__ZN3ccc9CC14x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC14x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x14y9E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y10  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC14x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x14y103abcEv
  ~CC14x14y10(); // tgen
  CC14x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y10E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x14y103pqrEv");}
void  ccc::CC14x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x14y103abcEv");}
ccc::CC14x14y10 ::~CC14x14y10(){ note_dtor("_ZN3ccc10CC14x14y10E", this);} // tgen
ccc::CC14x14y10 ::CC14x14y10(){ note_ctor("_ZN3ccc10CC14x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y10E, buf);
    ::ccc::CC14x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y10E);
    dp->::ccc::CC14x14y10::~CC14x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y10E(Test__ZN3ccc10CC14x14y10E, "_ZN3ccc10CC14x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y10C1Ev();
extern void _ZN3ccc10CC14x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y10E[] = {
  NSPAIR(_ZN3ccc10CC14x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y10E[];
extern void _ZN3ccc10CC14x14y103pqrEv();
extern void _ZN3ccc10CC14x14y103abcEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x14y103pqrEv,_ZThn4_N3ccc10CC14x14y103pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y103abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x14y103pqrEv,_ZThn4_N3ccc10CC14x14y103pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y10E[];
Class_Descriptor cd__ZN3ccc10CC14x14y10E = {  "_ZN3ccc10CC14x14y10E", // class name
  bases__ZN3ccc10CC14x14y10E, 2,
  &(vtc__ZN3ccc10CC14x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y10E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y11  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC14x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x14y113efgEv
  ~CC14x14y11(); // tgen
  CC14x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y11E) C1{ BC2{ v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC14x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x14y113pqrEv");}
void  ccc::CC14x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x14y113efgEv");}
ccc::CC14x14y11 ::~CC14x14y11(){ note_dtor("_ZN3ccc10CC14x14y11E", this);} // tgen
ccc::CC14x14y11 ::CC14x14y11(){ note_ctor("_ZN3ccc10CC14x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y11E, buf);
    ::ccc::CC14x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y11E);
    dp->::ccc::CC14x14y11::~CC14x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y11E(Test__ZN3ccc10CC14x14y11E, "_ZN3ccc10CC14x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y11C1Ev();
extern void _ZN3ccc10CC14x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y11E[] = {
  NSPAIR(_ZN3ccc10CC14x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y11E[];
extern void _ZN3ccc10CC14x14y113pqrEv();
extern void _ZN3ccc10CC14x14y113efgEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x14y113pqrEv,_ZThn4_N3ccc10CC14x14y113pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y113efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x14y113pqrEv,_ZThn4_N3ccc10CC14x14y113pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y11E[];
Class_Descriptor cd__ZN3ccc10CC14x14y11E = {  "_ZN3ccc10CC14x14y11E", // class name
  bases__ZN3ccc10CC14x14y11E, 2,
  &(vtc__ZN3ccc10CC14x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y11E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y12  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC14x14y123abcEv
  ~CC14x14y12(); // tgen
  CC14x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y12E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC14x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x14y123abcEv");}
ccc::CC14x14y12 ::~CC14x14y12(){ note_dtor("_ZN3ccc10CC14x14y12E", this);} // tgen
ccc::CC14x14y12 ::CC14x14y12(){ note_ctor("_ZN3ccc10CC14x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y12E, buf);
    ::ccc::CC14x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y12E);
    dp->::ccc::CC14x14y12::~CC14x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y12E(Test__ZN3ccc10CC14x14y12E, "_ZN3ccc10CC14x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y12C1Ev();
extern void _ZN3ccc10CC14x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y12E[] = {
  NSPAIR(_ZN3ccc10CC14x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y123abcEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y12E[];
Class_Descriptor cd__ZN3ccc10CC14x14y12E = {  "_ZN3ccc10CC14x14y12E", // class name
  bases__ZN3ccc10CC14x14y12E, 2,
  &(vtc__ZN3ccc10CC14x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y12E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y13  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC14x14y133efgEv
  ~CC14x14y13(); // tgen
  CC14x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y13E) C1{ BC2{ v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC14x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x14y133efgEv");}
ccc::CC14x14y13 ::~CC14x14y13(){ note_dtor("_ZN3ccc10CC14x14y13E", this);} // tgen
ccc::CC14x14y13 ::CC14x14y13(){ note_ctor("_ZN3ccc10CC14x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y13E, buf);
    ::ccc::CC14x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y13E);
    dp->::ccc::CC14x14y13::~CC14x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y13E(Test__ZN3ccc10CC14x14y13E, "_ZN3ccc10CC14x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y13C1Ev();
extern void _ZN3ccc10CC14x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y13E[] = {
  NSPAIR(_ZN3ccc10CC14x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y133efgEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y13E[];
Class_Descriptor cd__ZN3ccc10CC14x14y13E = {  "_ZN3ccc10CC14x14y13E", // class name
  bases__ZN3ccc10CC14x14y13E, 2,
  &(vtc__ZN3ccc10CC14x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y13E),7, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y14  : ::ccc::AA14 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC14x14y143pqrEv
  ~CC14x14y14(); // tgen
  CC14x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y14E) C1{ BC2{ v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC14x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x14y143pqrEv");}
ccc::CC14x14y14 ::~CC14x14y14(){ note_dtor("_ZN3ccc10CC14x14y14E", this);} // tgen
ccc::CC14x14y14 ::CC14x14y14(){ note_ctor("_ZN3ccc10CC14x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y14E, buf);
    ::ccc::CC14x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y14E);
    dp->::ccc::CC14x14y14::~CC14x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y14E(Test__ZN3ccc10CC14x14y14E, "_ZN3ccc10CC14x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y14C1Ev();
extern void _ZN3ccc10CC14x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y14E[] = {
  NSPAIR(_ZN3ccc10CC14x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y14E[];
extern void _ZN3ccc10CC14x14y143pqrEv();
extern void ABISELECT(_ZThn8_N3ccc10CC14x14y143pqrEv,_ZThn4_N3ccc10CC14x14y143pqrEv)();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x14y143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn8_N3ccc10CC14x14y143pqrEv,_ZThn4_N3ccc10CC14x14y143pqrEv),
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y14E[];
Class_Descriptor cd__ZN3ccc10CC14x14y14E = {  "_ZN3ccc10CC14x14y14E", // class name
  bases__ZN3ccc10CC14x14y14E, 2,
  &(vtc__ZN3ccc10CC14x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y14E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x14y15  : ::ccc::AA14 , ::ccc::BB14 {
  ~CC14x14y15(); // tgen
  CC14x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x14y15E) C1{ BC2{ v1} BC3{ v2}}
}
namespace ccc { 
ccc::CC14x14y15 ::~CC14x14y15(){ note_dtor("_ZN3ccc10CC14x14y15E", this);} // tgen
ccc::CC14x14y15 ::CC14x14y15(){ note_ctor("_ZN3ccc10CC14x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc10CC14x14y15E, buf);
    ::ccc::CC14x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc10CC14x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x14y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc10CC14x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x14y15E);
    dp->::ccc::CC14x14y15::~CC14x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x14y15E(Test__ZN3ccc10CC14x14y15E, "_ZN3ccc10CC14x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc10CC14x14y15C1Ev();
extern void _ZN3ccc10CC14x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x14y15E[] = {
  NSPAIR(_ZN3ccc10CC14x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC14x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y15E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x14y15E[];
Class_Descriptor cd__ZN3ccc10CC14x14y15E = {  "_ZN3ccc10CC14x14y15E", // class name
  bases__ZN3ccc10CC14x14y15E, 2,
  &(vtc__ZN3ccc10CC14x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc10CC14x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x14y15E),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y0  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC14x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC14x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y03pqrEv
  ~CC14x15y0(); // tgen
  CC14x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y0E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y03abcEv");}
void  ccc::CC14x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y03efgEv");}
void  ccc::CC14x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y03pqrEv");}
ccc::CC14x15y0 ::~CC14x15y0(){ note_dtor("_ZN3ccc9CC14x15y0E", this);} // tgen
ccc::CC14x15y0 ::CC14x15y0(){ note_ctor("_ZN3ccc9CC14x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y0E, buf);
    ::ccc::CC14x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y0E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y0E);
    dp->::ccc::CC14x15y0::~CC14x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y0E(Test__ZN3ccc9CC14x15y0E, "_ZN3ccc9CC14x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y0C1Ev();
extern void _ZN3ccc9CC14x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y0E[] = {
  NSPAIR(_ZN3ccc9CC14x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y0E[];
extern void _ZN3ccc9CC14x15y03pqrEv();
extern void _ZN3ccc9CC14x15y03abcEv();
extern void _ZN3ccc9CC14x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y0E[];
Class_Descriptor cd__ZN3ccc9CC14x15y0E = {  "_ZN3ccc9CC14x15y0E", // class name
  bases__ZN3ccc9CC14x15y0E, 2,
  &(vtc__ZN3ccc9CC14x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y1  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC14x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x15y13efgEv
  ~CC14x15y1(); // tgen
  CC14x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y1E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y13abcEv");}
void  ccc::CC14x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y13pqrEv");}
void  ccc::CC14x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y13efgEv");}
ccc::CC14x15y1 ::~CC14x15y1(){ note_dtor("_ZN3ccc9CC14x15y1E", this);} // tgen
ccc::CC14x15y1 ::CC14x15y1(){ note_ctor("_ZN3ccc9CC14x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y1E, buf);
    ::ccc::CC14x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y1E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y1E);
    dp->::ccc::CC14x15y1::~CC14x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y1E(Test__ZN3ccc9CC14x15y1E, "_ZN3ccc9CC14x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y1C1Ev();
extern void _ZN3ccc9CC14x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y1E[] = {
  NSPAIR(_ZN3ccc9CC14x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y1E[];
extern void _ZN3ccc9CC14x15y13pqrEv();
extern void _ZN3ccc9CC14x15y13abcEv();
extern void _ZN3ccc9CC14x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y1E[];
Class_Descriptor cd__ZN3ccc9CC14x15y1E = {  "_ZN3ccc9CC14x15y1E", // class name
  bases__ZN3ccc9CC14x15y1E, 2,
  &(vtc__ZN3ccc9CC14x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y2  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC14x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC14x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y23pqrEv
  ~CC14x15y2(); // tgen
  CC14x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y2E) C1{ BC2{ v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y23efgEv");}
void  ccc::CC14x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y23abcEv");}
void  ccc::CC14x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y23pqrEv");}
ccc::CC14x15y2 ::~CC14x15y2(){ note_dtor("_ZN3ccc9CC14x15y2E", this);} // tgen
ccc::CC14x15y2 ::CC14x15y2(){ note_ctor("_ZN3ccc9CC14x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y2E, buf);
    ::ccc::CC14x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y2E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y2E);
    dp->::ccc::CC14x15y2::~CC14x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y2E(Test__ZN3ccc9CC14x15y2E, "_ZN3ccc9CC14x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y2C1Ev();
extern void _ZN3ccc9CC14x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y2E[] = {
  NSPAIR(_ZN3ccc9CC14x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y2E[];
extern void _ZN3ccc9CC14x15y23pqrEv();
extern void _ZN3ccc9CC14x15y23efgEv();
extern void _ZN3ccc9CC14x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y2E[];
Class_Descriptor cd__ZN3ccc9CC14x15y2E = {  "_ZN3ccc9CC14x15y2E", // class name
  bases__ZN3ccc9CC14x15y2E, 2,
  &(vtc__ZN3ccc9CC14x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y3  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC14x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x15y33abcEv
  ~CC14x15y3(); // tgen
  CC14x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y3E) C1{ BC2{ v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y33efgEv");}
void  ccc::CC14x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y33pqrEv");}
void  ccc::CC14x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y33abcEv");}
ccc::CC14x15y3 ::~CC14x15y3(){ note_dtor("_ZN3ccc9CC14x15y3E", this);} // tgen
ccc::CC14x15y3 ::CC14x15y3(){ note_ctor("_ZN3ccc9CC14x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y3E, buf);
    ::ccc::CC14x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y3E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y3E);
    dp->::ccc::CC14x15y3::~CC14x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y3E(Test__ZN3ccc9CC14x15y3E, "_ZN3ccc9CC14x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y3C1Ev();
extern void _ZN3ccc9CC14x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y3E[] = {
  NSPAIR(_ZN3ccc9CC14x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y3E[];
extern void _ZN3ccc9CC14x15y33pqrEv();
extern void _ZN3ccc9CC14x15y33efgEv();
extern void _ZN3ccc9CC14x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y3E[];
Class_Descriptor cd__ZN3ccc9CC14x15y3E = {  "_ZN3ccc9CC14x15y3E", // class name
  bases__ZN3ccc9CC14x15y3E, 2,
  &(vtc__ZN3ccc9CC14x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y4  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC14x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC14x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC14x15y43efgEv
  ~CC14x15y4(); // tgen
  CC14x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y4E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y43pqrEv");}
void  ccc::CC14x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y43abcEv");}
void  ccc::CC14x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y43efgEv");}
ccc::CC14x15y4 ::~CC14x15y4(){ note_dtor("_ZN3ccc9CC14x15y4E", this);} // tgen
ccc::CC14x15y4 ::CC14x15y4(){ note_ctor("_ZN3ccc9CC14x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y4E, buf);
    ::ccc::CC14x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y4E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y4E);
    dp->::ccc::CC14x15y4::~CC14x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y4E(Test__ZN3ccc9CC14x15y4E, "_ZN3ccc9CC14x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y4C1Ev();
extern void _ZN3ccc9CC14x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y4E[] = {
  NSPAIR(_ZN3ccc9CC14x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y4E[];
extern void _ZN3ccc9CC14x15y43pqrEv();
extern void _ZN3ccc9CC14x15y43abcEv();
extern void _ZN3ccc9CC14x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y4E[];
Class_Descriptor cd__ZN3ccc9CC14x15y4E = {  "_ZN3ccc9CC14x15y4E", // class name
  bases__ZN3ccc9CC14x15y4E, 2,
  &(vtc__ZN3ccc9CC14x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y5  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC14x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC14x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC14x15y53abcEv
  ~CC14x15y5(); // tgen
  CC14x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y5E) C1{ BC2{ v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC14x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y53pqrEv");}
void  ccc::CC14x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y53efgEv");}
void  ccc::CC14x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y53abcEv");}
ccc::CC14x15y5 ::~CC14x15y5(){ note_dtor("_ZN3ccc9CC14x15y5E", this);} // tgen
ccc::CC14x15y5 ::CC14x15y5(){ note_ctor("_ZN3ccc9CC14x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y5E, buf);
    ::ccc::CC14x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y5E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y5E);
    dp->::ccc::CC14x15y5::~CC14x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y5E(Test__ZN3ccc9CC14x15y5E, "_ZN3ccc9CC14x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y5C1Ev();
extern void _ZN3ccc9CC14x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y5E[] = {
  NSPAIR(_ZN3ccc9CC14x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y5E[];
extern void _ZN3ccc9CC14x15y53pqrEv();
extern void _ZN3ccc9CC14x15y53efgEv();
extern void _ZN3ccc9CC14x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y5E[];
Class_Descriptor cd__ZN3ccc9CC14x15y5E = {  "_ZN3ccc9CC14x15y5E", // class name
  bases__ZN3ccc9CC14x15y5E, 2,
  &(vtc__ZN3ccc9CC14x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y6  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC14x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC14x15y63efgEv
  ~CC14x15y6(); // tgen
  CC14x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y6E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y63abcEv");}
void  ccc::CC14x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y63efgEv");}
ccc::CC14x15y6 ::~CC14x15y6(){ note_dtor("_ZN3ccc9CC14x15y6E", this);} // tgen
ccc::CC14x15y6 ::CC14x15y6(){ note_ctor("_ZN3ccc9CC14x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y6E, buf);
    ::ccc::CC14x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y6E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y6E);
    dp->::ccc::CC14x15y6::~CC14x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y6E(Test__ZN3ccc9CC14x15y6E, "_ZN3ccc9CC14x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y6C1Ev();
extern void _ZN3ccc9CC14x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y6E[] = {
  NSPAIR(_ZN3ccc9CC14x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y6E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x15y63abcEv();
extern void _ZN3ccc9CC14x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y6E[];
Class_Descriptor cd__ZN3ccc9CC14x15y6E = {  "_ZN3ccc9CC14x15y6E", // class name
  bases__ZN3ccc9CC14x15y6E, 2,
  &(vtc__ZN3ccc9CC14x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y7  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC14x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y73pqrEv
  ~CC14x15y7(); // tgen
  CC14x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y7E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y73abcEv");}
void  ccc::CC14x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y73pqrEv");}
ccc::CC14x15y7 ::~CC14x15y7(){ note_dtor("_ZN3ccc9CC14x15y7E", this);} // tgen
ccc::CC14x15y7 ::CC14x15y7(){ note_ctor("_ZN3ccc9CC14x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y7E, buf);
    ::ccc::CC14x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y7E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y7E);
    dp->::ccc::CC14x15y7::~CC14x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y7E(Test__ZN3ccc9CC14x15y7E, "_ZN3ccc9CC14x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y7C1Ev();
extern void _ZN3ccc9CC14x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y7E[] = {
  NSPAIR(_ZN3ccc9CC14x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y7E[];
extern void _ZN3ccc9CC14x15y73pqrEv();
extern void _ZN3ccc9CC14x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y7E[];
Class_Descriptor cd__ZN3ccc9CC14x15y7E = {  "_ZN3ccc9CC14x15y7E", // class name
  bases__ZN3ccc9CC14x15y7E, 2,
  &(vtc__ZN3ccc9CC14x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y8  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC14x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC14x15y83abcEv
  ~CC14x15y8(); // tgen
  CC14x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y8E) C1{ BC2{ v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y83efgEv");}
void  ccc::CC14x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC14x15y83abcEv");}
ccc::CC14x15y8 ::~CC14x15y8(){ note_dtor("_ZN3ccc9CC14x15y8E", this);} // tgen
ccc::CC14x15y8 ::CC14x15y8(){ note_ctor("_ZN3ccc9CC14x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y8E, buf);
    ::ccc::CC14x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y8E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y8E);
    dp->::ccc::CC14x15y8::~CC14x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y8E(Test__ZN3ccc9CC14x15y8E, "_ZN3ccc9CC14x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y8C1Ev();
extern void _ZN3ccc9CC14x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y8E[] = {
  NSPAIR(_ZN3ccc9CC14x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y8E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc9CC14x15y83efgEv();
extern void _ZN3ccc9CC14x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y8E[];
Class_Descriptor cd__ZN3ccc9CC14x15y8E = {  "_ZN3ccc9CC14x15y8E", // class name
  bases__ZN3ccc9CC14x15y8E, 2,
  &(vtc__ZN3ccc9CC14x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y9  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC14x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC14x15y93pqrEv
  ~CC14x15y9(); // tgen
  CC14x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC14x15y9E) C1{ BC2{ v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC14x15y93efgEv");}
void  ccc::CC14x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC14x15y93pqrEv");}
ccc::CC14x15y9 ::~CC14x15y9(){ note_dtor("_ZN3ccc9CC14x15y9E", this);} // tgen
ccc::CC14x15y9 ::CC14x15y9(){ note_ctor("_ZN3ccc9CC14x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC14x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC14x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC14x15y9E, buf);
    ::ccc::CC14x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC14x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC14x15y9E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc9CC14x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC14x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC14x15y9E);
    dp->::ccc::CC14x15y9::~CC14x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC14x15y9E(Test__ZN3ccc9CC14x15y9E, "_ZN3ccc9CC14x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC14x15y9C1Ev();
extern void _ZN3ccc9CC14x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC14x15y9E[] = {
  NSPAIR(_ZN3ccc9CC14x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC14x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC14x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y9E[];
extern void _ZN3ccc9CC14x15y93pqrEv();
extern void _ZN3ccc9CC14x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC14x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC14x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC14x15y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC14x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC14x15y9E[];
Class_Descriptor cd__ZN3ccc9CC14x15y9E = {  "_ZN3ccc9CC14x15y9E", // class name
  bases__ZN3ccc9CC14x15y9E, 2,
  &(vtc__ZN3ccc9CC14x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC14x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC14x15y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y10  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC14x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC14x15y103abcEv
  ~CC14x15y10(); // tgen
  CC14x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y10E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x15y103pqrEv");}
void  ccc::CC14x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x15y103abcEv");}
ccc::CC14x15y10 ::~CC14x15y10(){ note_dtor("_ZN3ccc10CC14x15y10E", this);} // tgen
ccc::CC14x15y10 ::CC14x15y10(){ note_ctor("_ZN3ccc10CC14x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y10E, buf);
    ::ccc::CC14x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y10E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y10E);
    dp->::ccc::CC14x15y10::~CC14x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y10E(Test__ZN3ccc10CC14x15y10E, "_ZN3ccc10CC14x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y10C1Ev();
extern void _ZN3ccc10CC14x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y10E[] = {
  NSPAIR(_ZN3ccc10CC14x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y10E[];
extern void _ZN3ccc10CC14x15y103pqrEv();
extern void _ZN3ccc10CC14x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y10E[];
Class_Descriptor cd__ZN3ccc10CC14x15y10E = {  "_ZN3ccc10CC14x15y10E", // class name
  bases__ZN3ccc10CC14x15y10E, 2,
  &(vtc__ZN3ccc10CC14x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y11  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC14x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC14x15y113efgEv
  ~CC14x15y11(); // tgen
  CC14x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y11E) C1{ BC2{ v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC14x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x15y113pqrEv");}
void  ccc::CC14x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x15y113efgEv");}
ccc::CC14x15y11 ::~CC14x15y11(){ note_dtor("_ZN3ccc10CC14x15y11E", this);} // tgen
ccc::CC14x15y11 ::CC14x15y11(){ note_ctor("_ZN3ccc10CC14x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y11E, buf);
    ::ccc::CC14x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y11E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y11E);
    dp->::ccc::CC14x15y11::~CC14x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y11E(Test__ZN3ccc10CC14x15y11E, "_ZN3ccc10CC14x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y11C1Ev();
extern void _ZN3ccc10CC14x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y11E[] = {
  NSPAIR(_ZN3ccc10CC14x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y11E[];
extern void _ZN3ccc10CC14x15y113pqrEv();
extern void _ZN3ccc10CC14x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y11E[];
Class_Descriptor cd__ZN3ccc10CC14x15y11E = {  "_ZN3ccc10CC14x15y11E", // class name
  bases__ZN3ccc10CC14x15y11E, 2,
  &(vtc__ZN3ccc10CC14x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y12  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC14x15y123abcEv
  ~CC14x15y12(); // tgen
  CC14x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y12E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC14x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC14x15y123abcEv");}
ccc::CC14x15y12 ::~CC14x15y12(){ note_dtor("_ZN3ccc10CC14x15y12E", this);} // tgen
ccc::CC14x15y12 ::CC14x15y12(){ note_ctor("_ZN3ccc10CC14x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y12E, buf);
    ::ccc::CC14x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y12E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y12E);
    dp->::ccc::CC14x15y12::~CC14x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y12E(Test__ZN3ccc10CC14x15y12E, "_ZN3ccc10CC14x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y12C1Ev();
extern void _ZN3ccc10CC14x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y12E[] = {
  NSPAIR(_ZN3ccc10CC14x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y12E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y12E[];
Class_Descriptor cd__ZN3ccc10CC14x15y12E = {  "_ZN3ccc10CC14x15y12E", // class name
  bases__ZN3ccc10CC14x15y12E, 2,
  &(vtc__ZN3ccc10CC14x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y13  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC14x15y133efgEv
  ~CC14x15y13(); // tgen
  CC14x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y13E) C1{ BC2{ v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC14x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC14x15y133efgEv");}
ccc::CC14x15y13 ::~CC14x15y13(){ note_dtor("_ZN3ccc10CC14x15y13E", this);} // tgen
ccc::CC14x15y13 ::CC14x15y13(){ note_ctor("_ZN3ccc10CC14x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y13E, buf);
    ::ccc::CC14x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y13E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y13E);
    dp->::ccc::CC14x15y13::~CC14x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y13E(Test__ZN3ccc10CC14x15y13E, "_ZN3ccc10CC14x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y13C1Ev();
extern void _ZN3ccc10CC14x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y13E[] = {
  NSPAIR(_ZN3ccc10CC14x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y13E[];
extern void _ZN3ccc4AA143pqrEv();
extern void _ZN3ccc10CC14x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y13E[];
Class_Descriptor cd__ZN3ccc10CC14x15y13E = {  "_ZN3ccc10CC14x15y13E", // class name
  bases__ZN3ccc10CC14x15y13E, 2,
  &(vtc__ZN3ccc10CC14x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y14  : ::ccc::AA14 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC14x15y143pqrEv
  ~CC14x15y14(); // tgen
  CC14x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y14E) C1{ BC2{ v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC14x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC14x15y143pqrEv");}
ccc::CC14x15y14 ::~CC14x15y14(){ note_dtor("_ZN3ccc10CC14x15y14E", this);} // tgen
ccc::CC14x15y14 ::CC14x15y14(){ note_ctor("_ZN3ccc10CC14x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y14E, buf);
    ::ccc::CC14x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y14E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y14E);
    dp->::ccc::CC14x15y14::~CC14x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y14E(Test__ZN3ccc10CC14x15y14E, "_ZN3ccc10CC14x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y14C1Ev();
extern void _ZN3ccc10CC14x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y14E[] = {
  NSPAIR(_ZN3ccc10CC14x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y14E[];
extern void _ZN3ccc10CC14x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC14x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y14E[];
Class_Descriptor cd__ZN3ccc10CC14x15y14E = {  "_ZN3ccc10CC14x15y14E", // class name
  bases__ZN3ccc10CC14x15y14E, 2,
  &(vtc__ZN3ccc10CC14x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y14E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC14x15y15  : ::ccc::AA14 , ::ccc::BB15 {
  ~CC14x15y15(); // tgen
  CC14x15y15(); // tgen
};
//SIG(1 _ZN3ccc10CC14x15y15E) C1{ BC2{ v1} BC3{}}
}
namespace ccc { 
ccc::CC14x15y15 ::~CC14x15y15(){ note_dtor("_ZN3ccc10CC14x15y15E", this);} // tgen
ccc::CC14x15y15 ::CC14x15y15(){ note_ctor("_ZN3ccc10CC14x15y15E", this);} // tgen
}
static void Test__ZN3ccc10CC14x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC14x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC14x15y15E, buf);
    ::ccc::CC14x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC14x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC14x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC14x15y15E)");
    check_base_class_offset(lv, (::ccc::AA14*), 0, "_ZN3ccc10CC14x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC14x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC14x15y15E);
    dp->::ccc::CC14x15y15::~CC14x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC14x15y15E(Test__ZN3ccc10CC14x15y15E, "_ZN3ccc10CC14x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC14x15y15C1Ev();
extern void _ZN3ccc10CC14x15y15D1Ev();
Name_Map name_map__ZN3ccc10CC14x15y15E[] = {
  NSPAIR(_ZN3ccc10CC14x15y15C1Ev),
  NSPAIR(_ZN3ccc10CC14x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA14E;
extern VTBL_ENTRY _ZTIN3ccc4AA14E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA14E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC14x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y15E[];
extern void _ZN3ccc4AA143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC14x15y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC14x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC14x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC14x15y15E[];
Class_Descriptor cd__ZN3ccc10CC14x15y15E = {  "_ZN3ccc10CC14x15y15E", // class name
  bases__ZN3ccc10CC14x15y15E, 2,
  &(vtc__ZN3ccc10CC14x15y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC14x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC14x15y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y0  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC15x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y03pqrEv
  ~CC15x0y0(); // tgen
  CC15x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y0E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y03abcEv");}
void  ccc::CC15x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y03efgEv");}
void  ccc::CC15x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y03pqrEv");}
ccc::CC15x0y0 ::~CC15x0y0(){ note_dtor("_ZN3ccc8CC15x0y0E", this);} // tgen
ccc::CC15x0y0 ::CC15x0y0(){ note_ctor("_ZN3ccc8CC15x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y0E, buf);
    ::ccc::CC15x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y0E);
    dp->::ccc::CC15x0y0::~CC15x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y0E(Test__ZN3ccc8CC15x0y0E, "_ZN3ccc8CC15x0y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y0C1Ev();
extern void _ZN3ccc8CC15x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y0E[] = {
  NSPAIR(_ZN3ccc8CC15x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y0E[];
extern void _ZN3ccc8CC15x0y03abcEv();
extern void _ZN3ccc8CC15x0y03efgEv();
extern void _ZN3ccc8CC15x0y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y0E[];
Class_Descriptor cd__ZN3ccc8CC15x0y0E = {  "_ZN3ccc8CC15x0y0E", // class name
  bases__ZN3ccc8CC15x0y0E, 2,
  &(vtc__ZN3ccc8CC15x0y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y1  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC15x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x0y13efgEv
  ~CC15x0y1(); // tgen
  CC15x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y1E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y13abcEv");}
void  ccc::CC15x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y13pqrEv");}
void  ccc::CC15x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y13efgEv");}
ccc::CC15x0y1 ::~CC15x0y1(){ note_dtor("_ZN3ccc8CC15x0y1E", this);} // tgen
ccc::CC15x0y1 ::CC15x0y1(){ note_ctor("_ZN3ccc8CC15x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y1E, buf);
    ::ccc::CC15x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y1E);
    dp->::ccc::CC15x0y1::~CC15x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y1E(Test__ZN3ccc8CC15x0y1E, "_ZN3ccc8CC15x0y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y1C1Ev();
extern void _ZN3ccc8CC15x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y1E[] = {
  NSPAIR(_ZN3ccc8CC15x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y1E[];
extern void _ZN3ccc8CC15x0y13abcEv();
extern void _ZN3ccc8CC15x0y13efgEv();
extern void _ZN3ccc8CC15x0y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y1E[];
Class_Descriptor cd__ZN3ccc8CC15x0y1E = {  "_ZN3ccc8CC15x0y1E", // class name
  bases__ZN3ccc8CC15x0y1E, 2,
  &(vtc__ZN3ccc8CC15x0y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y2  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC15x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y23pqrEv
  ~CC15x0y2(); // tgen
  CC15x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y2E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y23efgEv");}
void  ccc::CC15x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y23abcEv");}
void  ccc::CC15x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y23pqrEv");}
ccc::CC15x0y2 ::~CC15x0y2(){ note_dtor("_ZN3ccc8CC15x0y2E", this);} // tgen
ccc::CC15x0y2 ::CC15x0y2(){ note_ctor("_ZN3ccc8CC15x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y2E, buf);
    ::ccc::CC15x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y2E);
    dp->::ccc::CC15x0y2::~CC15x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y2E(Test__ZN3ccc8CC15x0y2E, "_ZN3ccc8CC15x0y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y2C1Ev();
extern void _ZN3ccc8CC15x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y2E[] = {
  NSPAIR(_ZN3ccc8CC15x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y2E[];
extern void _ZN3ccc8CC15x0y23abcEv();
extern void _ZN3ccc8CC15x0y23efgEv();
extern void _ZN3ccc8CC15x0y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y2E[];
Class_Descriptor cd__ZN3ccc8CC15x0y2E = {  "_ZN3ccc8CC15x0y2E", // class name
  bases__ZN3ccc8CC15x0y2E, 2,
  &(vtc__ZN3ccc8CC15x0y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y3  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC15x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x0y33abcEv
  ~CC15x0y3(); // tgen
  CC15x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y3E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y33efgEv");}
void  ccc::CC15x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y33pqrEv");}
void  ccc::CC15x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y33abcEv");}
ccc::CC15x0y3 ::~CC15x0y3(){ note_dtor("_ZN3ccc8CC15x0y3E", this);} // tgen
ccc::CC15x0y3 ::CC15x0y3(){ note_ctor("_ZN3ccc8CC15x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y3E, buf);
    ::ccc::CC15x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y3E);
    dp->::ccc::CC15x0y3::~CC15x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y3E(Test__ZN3ccc8CC15x0y3E, "_ZN3ccc8CC15x0y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y3C1Ev();
extern void _ZN3ccc8CC15x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y3E[] = {
  NSPAIR(_ZN3ccc8CC15x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y3E[];
extern void _ZN3ccc8CC15x0y33abcEv();
extern void _ZN3ccc8CC15x0y33efgEv();
extern void _ZN3ccc8CC15x0y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y3E[];
Class_Descriptor cd__ZN3ccc8CC15x0y3E = {  "_ZN3ccc8CC15x0y3E", // class name
  bases__ZN3ccc8CC15x0y3E, 2,
  &(vtc__ZN3ccc8CC15x0y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y4  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC15x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x0y43efgEv
  ~CC15x0y4(); // tgen
  CC15x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y4E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y43pqrEv");}
void  ccc::CC15x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y43abcEv");}
void  ccc::CC15x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y43efgEv");}
ccc::CC15x0y4 ::~CC15x0y4(){ note_dtor("_ZN3ccc8CC15x0y4E", this);} // tgen
ccc::CC15x0y4 ::CC15x0y4(){ note_ctor("_ZN3ccc8CC15x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y4E, buf);
    ::ccc::CC15x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y4E);
    dp->::ccc::CC15x0y4::~CC15x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y4E(Test__ZN3ccc8CC15x0y4E, "_ZN3ccc8CC15x0y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y4C1Ev();
extern void _ZN3ccc8CC15x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y4E[] = {
  NSPAIR(_ZN3ccc8CC15x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y4E[];
extern void _ZN3ccc8CC15x0y43abcEv();
extern void _ZN3ccc8CC15x0y43efgEv();
extern void _ZN3ccc8CC15x0y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y4E[];
Class_Descriptor cd__ZN3ccc8CC15x0y4E = {  "_ZN3ccc8CC15x0y4E", // class name
  bases__ZN3ccc8CC15x0y4E, 2,
  &(vtc__ZN3ccc8CC15x0y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y5  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC15x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x0y53abcEv
  ~CC15x0y5(); // tgen
  CC15x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y5E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y53pqrEv");}
void  ccc::CC15x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y53efgEv");}
void  ccc::CC15x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y53abcEv");}
ccc::CC15x0y5 ::~CC15x0y5(){ note_dtor("_ZN3ccc8CC15x0y5E", this);} // tgen
ccc::CC15x0y5 ::CC15x0y5(){ note_ctor("_ZN3ccc8CC15x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y5E, buf);
    ::ccc::CC15x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y5E);
    dp->::ccc::CC15x0y5::~CC15x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y5E(Test__ZN3ccc8CC15x0y5E, "_ZN3ccc8CC15x0y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y5C1Ev();
extern void _ZN3ccc8CC15x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y5E[] = {
  NSPAIR(_ZN3ccc8CC15x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y5E[];
extern void _ZN3ccc8CC15x0y53abcEv();
extern void _ZN3ccc8CC15x0y53efgEv();
extern void _ZN3ccc8CC15x0y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y5E[];
Class_Descriptor cd__ZN3ccc8CC15x0y5E = {  "_ZN3ccc8CC15x0y5E", // class name
  bases__ZN3ccc8CC15x0y5E, 2,
  &(vtc__ZN3ccc8CC15x0y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y6  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC15x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x0y63efgEv
  ~CC15x0y6(); // tgen
  CC15x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y6E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y63abcEv");}
void  ccc::CC15x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y63efgEv");}
ccc::CC15x0y6 ::~CC15x0y6(){ note_dtor("_ZN3ccc8CC15x0y6E", this);} // tgen
ccc::CC15x0y6 ::CC15x0y6(){ note_ctor("_ZN3ccc8CC15x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y6E, buf);
    ::ccc::CC15x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y6E);
    dp->::ccc::CC15x0y6::~CC15x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y6E(Test__ZN3ccc8CC15x0y6E, "_ZN3ccc8CC15x0y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y6C1Ev();
extern void _ZN3ccc8CC15x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y6E[] = {
  NSPAIR(_ZN3ccc8CC15x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y6E[];
extern void _ZN3ccc8CC15x0y63abcEv();
extern void _ZN3ccc8CC15x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y6E[];
Class_Descriptor cd__ZN3ccc8CC15x0y6E = {  "_ZN3ccc8CC15x0y6E", // class name
  bases__ZN3ccc8CC15x0y6E, 2,
  &(vtc__ZN3ccc8CC15x0y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y7  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC15x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y73pqrEv
  ~CC15x0y7(); // tgen
  CC15x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y7E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y73abcEv");}
void  ccc::CC15x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y73pqrEv");}
ccc::CC15x0y7 ::~CC15x0y7(){ note_dtor("_ZN3ccc8CC15x0y7E", this);} // tgen
ccc::CC15x0y7 ::CC15x0y7(){ note_ctor("_ZN3ccc8CC15x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y7E, buf);
    ::ccc::CC15x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y7E);
    dp->::ccc::CC15x0y7::~CC15x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y7E(Test__ZN3ccc8CC15x0y7E, "_ZN3ccc8CC15x0y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y7C1Ev();
extern void _ZN3ccc8CC15x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y7E[] = {
  NSPAIR(_ZN3ccc8CC15x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y7E[];
extern void _ZN3ccc8CC15x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC15x0y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y7E[];
Class_Descriptor cd__ZN3ccc8CC15x0y7E = {  "_ZN3ccc8CC15x0y7E", // class name
  bases__ZN3ccc8CC15x0y7E, 2,
  &(vtc__ZN3ccc8CC15x0y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y8  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC15x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x0y83abcEv
  ~CC15x0y8(); // tgen
  CC15x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y8E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y83efgEv");}
void  ccc::CC15x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x0y83abcEv");}
ccc::CC15x0y8 ::~CC15x0y8(){ note_dtor("_ZN3ccc8CC15x0y8E", this);} // tgen
ccc::CC15x0y8 ::CC15x0y8(){ note_ctor("_ZN3ccc8CC15x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y8E, buf);
    ::ccc::CC15x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y8E);
    dp->::ccc::CC15x0y8::~CC15x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y8E(Test__ZN3ccc8CC15x0y8E, "_ZN3ccc8CC15x0y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y8C1Ev();
extern void _ZN3ccc8CC15x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y8E[] = {
  NSPAIR(_ZN3ccc8CC15x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y8E[];
extern void _ZN3ccc8CC15x0y83abcEv();
extern void _ZN3ccc8CC15x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y8E[];
Class_Descriptor cd__ZN3ccc8CC15x0y8E = {  "_ZN3ccc8CC15x0y8E", // class name
  bases__ZN3ccc8CC15x0y8E, 2,
  &(vtc__ZN3ccc8CC15x0y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y9  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC15x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x0y93pqrEv
  ~CC15x0y9(); // tgen
  CC15x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x0y9E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x0y93efgEv");}
void  ccc::CC15x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x0y93pqrEv");}
ccc::CC15x0y9 ::~CC15x0y9(){ note_dtor("_ZN3ccc8CC15x0y9E", this);} // tgen
ccc::CC15x0y9 ::CC15x0y9(){ note_ctor("_ZN3ccc8CC15x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x0y9E, buf);
    ::ccc::CC15x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x0y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC15x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x0y9E);
    dp->::ccc::CC15x0y9::~CC15x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x0y9E(Test__ZN3ccc8CC15x0y9E, "_ZN3ccc8CC15x0y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x0y9C1Ev();
extern void _ZN3ccc8CC15x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x0y9E[] = {
  NSPAIR(_ZN3ccc8CC15x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC15x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC15x0y93efgEv();
extern void _ZN3ccc8CC15x0y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x0y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x0y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x0y9E[];
Class_Descriptor cd__ZN3ccc8CC15x0y9E = {  "_ZN3ccc8CC15x0y9E", // class name
  bases__ZN3ccc8CC15x0y9E, 2,
  &(vtc__ZN3ccc8CC15x0y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x0y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y10  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC15x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x0y103abcEv
  ~CC15x0y10(); // tgen
  CC15x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y10E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x0y103pqrEv");}
void  ccc::CC15x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x0y103abcEv");}
ccc::CC15x0y10 ::~CC15x0y10(){ note_dtor("_ZN3ccc9CC15x0y10E", this);} // tgen
ccc::CC15x0y10 ::CC15x0y10(){ note_ctor("_ZN3ccc9CC15x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y10E, buf);
    ::ccc::CC15x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y10E);
    dp->::ccc::CC15x0y10::~CC15x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y10E(Test__ZN3ccc9CC15x0y10E, "_ZN3ccc9CC15x0y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y10C1Ev();
extern void _ZN3ccc9CC15x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y10E[] = {
  NSPAIR(_ZN3ccc9CC15x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y10E[];
extern void _ZN3ccc9CC15x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc9CC15x0y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y10E[];
Class_Descriptor cd__ZN3ccc9CC15x0y10E = {  "_ZN3ccc9CC15x0y10E", // class name
  bases__ZN3ccc9CC15x0y10E, 2,
  &(vtc__ZN3ccc9CC15x0y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y11  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC15x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x0y113efgEv
  ~CC15x0y11(); // tgen
  CC15x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y11E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x0y113pqrEv");}
void  ccc::CC15x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x0y113efgEv");}
ccc::CC15x0y11 ::~CC15x0y11(){ note_dtor("_ZN3ccc9CC15x0y11E", this);} // tgen
ccc::CC15x0y11 ::CC15x0y11(){ note_ctor("_ZN3ccc9CC15x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y11E, buf);
    ::ccc::CC15x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y11E);
    dp->::ccc::CC15x0y11::~CC15x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y11E(Test__ZN3ccc9CC15x0y11E, "_ZN3ccc9CC15x0y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y11C1Ev();
extern void _ZN3ccc9CC15x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y11E[] = {
  NSPAIR(_ZN3ccc9CC15x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc9CC15x0y113efgEv();
extern void _ZN3ccc9CC15x0y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y11E[];
Class_Descriptor cd__ZN3ccc9CC15x0y11E = {  "_ZN3ccc9CC15x0y11E", // class name
  bases__ZN3ccc9CC15x0y11E, 2,
  &(vtc__ZN3ccc9CC15x0y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y12  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC15x0y123abcEv
  ~CC15x0y12(); // tgen
  CC15x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y12E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x0y123abcEv");}
ccc::CC15x0y12 ::~CC15x0y12(){ note_dtor("_ZN3ccc9CC15x0y12E", this);} // tgen
ccc::CC15x0y12 ::CC15x0y12(){ note_ctor("_ZN3ccc9CC15x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y12E, buf);
    ::ccc::CC15x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y12E);
    dp->::ccc::CC15x0y12::~CC15x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y12E(Test__ZN3ccc9CC15x0y12E, "_ZN3ccc9CC15x0y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y12C1Ev();
extern void _ZN3ccc9CC15x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y12E[] = {
  NSPAIR(_ZN3ccc9CC15x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y12E[];
extern void _ZN3ccc9CC15x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y12E[];
Class_Descriptor cd__ZN3ccc9CC15x0y12E = {  "_ZN3ccc9CC15x0y12E", // class name
  bases__ZN3ccc9CC15x0y12E, 2,
  &(vtc__ZN3ccc9CC15x0y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y13  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC15x0y133efgEv
  ~CC15x0y13(); // tgen
  CC15x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y13E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x0y133efgEv");}
ccc::CC15x0y13 ::~CC15x0y13(){ note_dtor("_ZN3ccc9CC15x0y13E", this);} // tgen
ccc::CC15x0y13 ::CC15x0y13(){ note_ctor("_ZN3ccc9CC15x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y13E, buf);
    ::ccc::CC15x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y13E);
    dp->::ccc::CC15x0y13::~CC15x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y13E(Test__ZN3ccc9CC15x0y13E, "_ZN3ccc9CC15x0y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y13C1Ev();
extern void _ZN3ccc9CC15x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y13E[] = {
  NSPAIR(_ZN3ccc9CC15x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc9CC15x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y13E[];
Class_Descriptor cd__ZN3ccc9CC15x0y13E = {  "_ZN3ccc9CC15x0y13E", // class name
  bases__ZN3ccc9CC15x0y13E, 2,
  &(vtc__ZN3ccc9CC15x0y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y14  : ::ccc::AA15 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC15x0y143pqrEv
  ~CC15x0y14(); // tgen
  CC15x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y14E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x0y143pqrEv");}
ccc::CC15x0y14 ::~CC15x0y14(){ note_dtor("_ZN3ccc9CC15x0y14E", this);} // tgen
ccc::CC15x0y14 ::CC15x0y14(){ note_ctor("_ZN3ccc9CC15x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y14E, buf);
    ::ccc::CC15x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y14E);
    dp->::ccc::CC15x0y14::~CC15x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y14E(Test__ZN3ccc9CC15x0y14E, "_ZN3ccc9CC15x0y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y14C1Ev();
extern void _ZN3ccc9CC15x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y14E[] = {
  NSPAIR(_ZN3ccc9CC15x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc9CC15x0y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x0y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y14E[];
Class_Descriptor cd__ZN3ccc9CC15x0y14E = {  "_ZN3ccc9CC15x0y14E", // class name
  bases__ZN3ccc9CC15x0y14E, 2,
  &(vtc__ZN3ccc9CC15x0y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x0y15  : ::ccc::AA15 , ::ccc::BB0 {
  ~CC15x0y15(); // tgen
  CC15x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x0y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x0y15 ::~CC15x0y15(){ note_dtor("_ZN3ccc9CC15x0y15E", this);} // tgen
ccc::CC15x0y15 ::CC15x0y15(){ note_ctor("_ZN3ccc9CC15x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x0y15E, buf);
    ::ccc::CC15x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x0y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC15x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x0y15E);
    dp->::ccc::CC15x0y15::~CC15x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x0y15E(Test__ZN3ccc9CC15x0y15E, "_ZN3ccc9CC15x0y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x0y15C1Ev();
extern void _ZN3ccc9CC15x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x0y15E[] = {
  NSPAIR(_ZN3ccc9CC15x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC15x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB0E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x0y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x0y15E[];
Class_Descriptor cd__ZN3ccc9CC15x0y15E = {  "_ZN3ccc9CC15x0y15E", // class name
  bases__ZN3ccc9CC15x0y15E, 2,
  &(vtc__ZN3ccc9CC15x0y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x0y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y0  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC15x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y03pqrEv
  ~CC15x1y0(); // tgen
  CC15x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y0E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y03abcEv");}
void  ccc::CC15x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y03efgEv");}
void  ccc::CC15x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y03pqrEv");}
ccc::CC15x1y0 ::~CC15x1y0(){ note_dtor("_ZN3ccc8CC15x1y0E", this);} // tgen
ccc::CC15x1y0 ::CC15x1y0(){ note_ctor("_ZN3ccc8CC15x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y0E, buf);
    ::ccc::CC15x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y0E);
    dp->::ccc::CC15x1y0::~CC15x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y0E(Test__ZN3ccc8CC15x1y0E, "_ZN3ccc8CC15x1y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y0C1Ev();
extern void _ZN3ccc8CC15x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y0E[] = {
  NSPAIR(_ZN3ccc8CC15x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y0E[];
extern void _ZN3ccc8CC15x1y03abcEv();
extern void _ZN3ccc8CC15x1y03pqrEv();
extern void _ZN3ccc8CC15x1y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y0E[];
Class_Descriptor cd__ZN3ccc8CC15x1y0E = {  "_ZN3ccc8CC15x1y0E", // class name
  bases__ZN3ccc8CC15x1y0E, 2,
  &(vtc__ZN3ccc8CC15x1y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y1  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC15x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x1y13efgEv
  ~CC15x1y1(); // tgen
  CC15x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y1E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y13abcEv");}
void  ccc::CC15x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y13pqrEv");}
void  ccc::CC15x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y13efgEv");}
ccc::CC15x1y1 ::~CC15x1y1(){ note_dtor("_ZN3ccc8CC15x1y1E", this);} // tgen
ccc::CC15x1y1 ::CC15x1y1(){ note_ctor("_ZN3ccc8CC15x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y1E, buf);
    ::ccc::CC15x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y1E);
    dp->::ccc::CC15x1y1::~CC15x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y1E(Test__ZN3ccc8CC15x1y1E, "_ZN3ccc8CC15x1y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y1C1Ev();
extern void _ZN3ccc8CC15x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y1E[] = {
  NSPAIR(_ZN3ccc8CC15x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y1E[];
extern void _ZN3ccc8CC15x1y13abcEv();
extern void _ZN3ccc8CC15x1y13pqrEv();
extern void _ZN3ccc8CC15x1y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y1E[];
Class_Descriptor cd__ZN3ccc8CC15x1y1E = {  "_ZN3ccc8CC15x1y1E", // class name
  bases__ZN3ccc8CC15x1y1E, 2,
  &(vtc__ZN3ccc8CC15x1y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y2  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC15x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y23pqrEv
  ~CC15x1y2(); // tgen
  CC15x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y2E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y23efgEv");}
void  ccc::CC15x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y23abcEv");}
void  ccc::CC15x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y23pqrEv");}
ccc::CC15x1y2 ::~CC15x1y2(){ note_dtor("_ZN3ccc8CC15x1y2E", this);} // tgen
ccc::CC15x1y2 ::CC15x1y2(){ note_ctor("_ZN3ccc8CC15x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y2E, buf);
    ::ccc::CC15x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y2E);
    dp->::ccc::CC15x1y2::~CC15x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y2E(Test__ZN3ccc8CC15x1y2E, "_ZN3ccc8CC15x1y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y2C1Ev();
extern void _ZN3ccc8CC15x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y2E[] = {
  NSPAIR(_ZN3ccc8CC15x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y2E[];
extern void _ZN3ccc8CC15x1y23abcEv();
extern void _ZN3ccc8CC15x1y23pqrEv();
extern void _ZN3ccc8CC15x1y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y2E[];
Class_Descriptor cd__ZN3ccc8CC15x1y2E = {  "_ZN3ccc8CC15x1y2E", // class name
  bases__ZN3ccc8CC15x1y2E, 2,
  &(vtc__ZN3ccc8CC15x1y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y3  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC15x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x1y33abcEv
  ~CC15x1y3(); // tgen
  CC15x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y3E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y33efgEv");}
void  ccc::CC15x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y33pqrEv");}
void  ccc::CC15x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y33abcEv");}
ccc::CC15x1y3 ::~CC15x1y3(){ note_dtor("_ZN3ccc8CC15x1y3E", this);} // tgen
ccc::CC15x1y3 ::CC15x1y3(){ note_ctor("_ZN3ccc8CC15x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y3E, buf);
    ::ccc::CC15x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y3E);
    dp->::ccc::CC15x1y3::~CC15x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y3E(Test__ZN3ccc8CC15x1y3E, "_ZN3ccc8CC15x1y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y3C1Ev();
extern void _ZN3ccc8CC15x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y3E[] = {
  NSPAIR(_ZN3ccc8CC15x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y3E[];
extern void _ZN3ccc8CC15x1y33abcEv();
extern void _ZN3ccc8CC15x1y33pqrEv();
extern void _ZN3ccc8CC15x1y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y3E[];
Class_Descriptor cd__ZN3ccc8CC15x1y3E = {  "_ZN3ccc8CC15x1y3E", // class name
  bases__ZN3ccc8CC15x1y3E, 2,
  &(vtc__ZN3ccc8CC15x1y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y4  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC15x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x1y43efgEv
  ~CC15x1y4(); // tgen
  CC15x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y4E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y43pqrEv");}
void  ccc::CC15x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y43abcEv");}
void  ccc::CC15x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y43efgEv");}
ccc::CC15x1y4 ::~CC15x1y4(){ note_dtor("_ZN3ccc8CC15x1y4E", this);} // tgen
ccc::CC15x1y4 ::CC15x1y4(){ note_ctor("_ZN3ccc8CC15x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y4E, buf);
    ::ccc::CC15x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y4E);
    dp->::ccc::CC15x1y4::~CC15x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y4E(Test__ZN3ccc8CC15x1y4E, "_ZN3ccc8CC15x1y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y4C1Ev();
extern void _ZN3ccc8CC15x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y4E[] = {
  NSPAIR(_ZN3ccc8CC15x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y4E[];
extern void _ZN3ccc8CC15x1y43abcEv();
extern void _ZN3ccc8CC15x1y43pqrEv();
extern void _ZN3ccc8CC15x1y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y4E[];
Class_Descriptor cd__ZN3ccc8CC15x1y4E = {  "_ZN3ccc8CC15x1y4E", // class name
  bases__ZN3ccc8CC15x1y4E, 2,
  &(vtc__ZN3ccc8CC15x1y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y5  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC15x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x1y53abcEv
  ~CC15x1y5(); // tgen
  CC15x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y5E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y53pqrEv");}
void  ccc::CC15x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y53efgEv");}
void  ccc::CC15x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y53abcEv");}
ccc::CC15x1y5 ::~CC15x1y5(){ note_dtor("_ZN3ccc8CC15x1y5E", this);} // tgen
ccc::CC15x1y5 ::CC15x1y5(){ note_ctor("_ZN3ccc8CC15x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y5E, buf);
    ::ccc::CC15x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y5E);
    dp->::ccc::CC15x1y5::~CC15x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y5E(Test__ZN3ccc8CC15x1y5E, "_ZN3ccc8CC15x1y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y5C1Ev();
extern void _ZN3ccc8CC15x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y5E[] = {
  NSPAIR(_ZN3ccc8CC15x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y5E[];
extern void _ZN3ccc8CC15x1y53abcEv();
extern void _ZN3ccc8CC15x1y53pqrEv();
extern void _ZN3ccc8CC15x1y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y5E[];
Class_Descriptor cd__ZN3ccc8CC15x1y5E = {  "_ZN3ccc8CC15x1y5E", // class name
  bases__ZN3ccc8CC15x1y5E, 2,
  &(vtc__ZN3ccc8CC15x1y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y6  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC15x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x1y63efgEv
  ~CC15x1y6(); // tgen
  CC15x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y6E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y63abcEv");}
void  ccc::CC15x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y63efgEv");}
ccc::CC15x1y6 ::~CC15x1y6(){ note_dtor("_ZN3ccc8CC15x1y6E", this);} // tgen
ccc::CC15x1y6 ::CC15x1y6(){ note_ctor("_ZN3ccc8CC15x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y6E, buf);
    ::ccc::CC15x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y6E);
    dp->::ccc::CC15x1y6::~CC15x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y6E(Test__ZN3ccc8CC15x1y6E, "_ZN3ccc8CC15x1y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y6C1Ev();
extern void _ZN3ccc8CC15x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y6E[] = {
  NSPAIR(_ZN3ccc8CC15x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y6E[];
extern void _ZN3ccc8CC15x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC15x1y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y6E[];
Class_Descriptor cd__ZN3ccc8CC15x1y6E = {  "_ZN3ccc8CC15x1y6E", // class name
  bases__ZN3ccc8CC15x1y6E, 2,
  &(vtc__ZN3ccc8CC15x1y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y7  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC15x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y73pqrEv
  ~CC15x1y7(); // tgen
  CC15x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y7E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y73abcEv");}
void  ccc::CC15x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y73pqrEv");}
ccc::CC15x1y7 ::~CC15x1y7(){ note_dtor("_ZN3ccc8CC15x1y7E", this);} // tgen
ccc::CC15x1y7 ::CC15x1y7(){ note_ctor("_ZN3ccc8CC15x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y7E, buf);
    ::ccc::CC15x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y7E);
    dp->::ccc::CC15x1y7::~CC15x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y7E(Test__ZN3ccc8CC15x1y7E, "_ZN3ccc8CC15x1y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y7C1Ev();
extern void _ZN3ccc8CC15x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y7E[] = {
  NSPAIR(_ZN3ccc8CC15x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y7E[];
extern void _ZN3ccc8CC15x1y73abcEv();
extern void _ZN3ccc8CC15x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y7E[];
Class_Descriptor cd__ZN3ccc8CC15x1y7E = {  "_ZN3ccc8CC15x1y7E", // class name
  bases__ZN3ccc8CC15x1y7E, 2,
  &(vtc__ZN3ccc8CC15x1y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y8  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC15x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x1y83abcEv
  ~CC15x1y8(); // tgen
  CC15x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y8E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y83efgEv");}
void  ccc::CC15x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x1y83abcEv");}
ccc::CC15x1y8 ::~CC15x1y8(){ note_dtor("_ZN3ccc8CC15x1y8E", this);} // tgen
ccc::CC15x1y8 ::CC15x1y8(){ note_ctor("_ZN3ccc8CC15x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y8E, buf);
    ::ccc::CC15x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y8E);
    dp->::ccc::CC15x1y8::~CC15x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y8E(Test__ZN3ccc8CC15x1y8E, "_ZN3ccc8CC15x1y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y8C1Ev();
extern void _ZN3ccc8CC15x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y8E[] = {
  NSPAIR(_ZN3ccc8CC15x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y8E[];
extern void _ZN3ccc8CC15x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC15x1y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y8E[];
Class_Descriptor cd__ZN3ccc8CC15x1y8E = {  "_ZN3ccc8CC15x1y8E", // class name
  bases__ZN3ccc8CC15x1y8E, 2,
  &(vtc__ZN3ccc8CC15x1y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y9  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC15x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x1y93pqrEv
  ~CC15x1y9(); // tgen
  CC15x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x1y9E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x1y93efgEv");}
void  ccc::CC15x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x1y93pqrEv");}
ccc::CC15x1y9 ::~CC15x1y9(){ note_dtor("_ZN3ccc8CC15x1y9E", this);} // tgen
ccc::CC15x1y9 ::CC15x1y9(){ note_ctor("_ZN3ccc8CC15x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x1y9E, buf);
    ::ccc::CC15x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x1y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC15x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x1y9E);
    dp->::ccc::CC15x1y9::~CC15x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x1y9E(Test__ZN3ccc8CC15x1y9E, "_ZN3ccc8CC15x1y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x1y9C1Ev();
extern void _ZN3ccc8CC15x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x1y9E[] = {
  NSPAIR(_ZN3ccc8CC15x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC15x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC15x1y93pqrEv();
extern void _ZN3ccc8CC15x1y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x1y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x1y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x1y9E[];
Class_Descriptor cd__ZN3ccc8CC15x1y9E = {  "_ZN3ccc8CC15x1y9E", // class name
  bases__ZN3ccc8CC15x1y9E, 2,
  &(vtc__ZN3ccc8CC15x1y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x1y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y10  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC15x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x1y103abcEv
  ~CC15x1y10(); // tgen
  CC15x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y10E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x1y103pqrEv");}
void  ccc::CC15x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x1y103abcEv");}
ccc::CC15x1y10 ::~CC15x1y10(){ note_dtor("_ZN3ccc9CC15x1y10E", this);} // tgen
ccc::CC15x1y10 ::CC15x1y10(){ note_ctor("_ZN3ccc9CC15x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y10E, buf);
    ::ccc::CC15x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y10E);
    dp->::ccc::CC15x1y10::~CC15x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y10E(Test__ZN3ccc9CC15x1y10E, "_ZN3ccc9CC15x1y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y10C1Ev();
extern void _ZN3ccc9CC15x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y10E[] = {
  NSPAIR(_ZN3ccc9CC15x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y10E[];
extern void _ZN3ccc9CC15x1y103abcEv();
extern void _ZN3ccc9CC15x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y10E[];
Class_Descriptor cd__ZN3ccc9CC15x1y10E = {  "_ZN3ccc9CC15x1y10E", // class name
  bases__ZN3ccc9CC15x1y10E, 2,
  &(vtc__ZN3ccc9CC15x1y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y11  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC15x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x1y113efgEv
  ~CC15x1y11(); // tgen
  CC15x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y11E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x1y113pqrEv");}
void  ccc::CC15x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x1y113efgEv");}
ccc::CC15x1y11 ::~CC15x1y11(){ note_dtor("_ZN3ccc9CC15x1y11E", this);} // tgen
ccc::CC15x1y11 ::CC15x1y11(){ note_ctor("_ZN3ccc9CC15x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y11E, buf);
    ::ccc::CC15x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y11E);
    dp->::ccc::CC15x1y11::~CC15x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y11E(Test__ZN3ccc9CC15x1y11E, "_ZN3ccc9CC15x1y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y11C1Ev();
extern void _ZN3ccc9CC15x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y11E[] = {
  NSPAIR(_ZN3ccc9CC15x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc9CC15x1y113pqrEv();
extern void _ZN3ccc9CC15x1y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y11E[];
Class_Descriptor cd__ZN3ccc9CC15x1y11E = {  "_ZN3ccc9CC15x1y11E", // class name
  bases__ZN3ccc9CC15x1y11E, 2,
  &(vtc__ZN3ccc9CC15x1y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y12  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC15x1y123abcEv
  ~CC15x1y12(); // tgen
  CC15x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y12E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x1y123abcEv");}
ccc::CC15x1y12 ::~CC15x1y12(){ note_dtor("_ZN3ccc9CC15x1y12E", this);} // tgen
ccc::CC15x1y12 ::CC15x1y12(){ note_ctor("_ZN3ccc9CC15x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y12E, buf);
    ::ccc::CC15x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y12E);
    dp->::ccc::CC15x1y12::~CC15x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y12E(Test__ZN3ccc9CC15x1y12E, "_ZN3ccc9CC15x1y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y12C1Ev();
extern void _ZN3ccc9CC15x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y12E[] = {
  NSPAIR(_ZN3ccc9CC15x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y12E[];
extern void _ZN3ccc9CC15x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y12E[];
Class_Descriptor cd__ZN3ccc9CC15x1y12E = {  "_ZN3ccc9CC15x1y12E", // class name
  bases__ZN3ccc9CC15x1y12E, 2,
  &(vtc__ZN3ccc9CC15x1y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y13  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC15x1y133efgEv
  ~CC15x1y13(); // tgen
  CC15x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y13E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x1y133efgEv");}
ccc::CC15x1y13 ::~CC15x1y13(){ note_dtor("_ZN3ccc9CC15x1y13E", this);} // tgen
ccc::CC15x1y13 ::CC15x1y13(){ note_ctor("_ZN3ccc9CC15x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y13E, buf);
    ::ccc::CC15x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y13E);
    dp->::ccc::CC15x1y13::~CC15x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y13E(Test__ZN3ccc9CC15x1y13E, "_ZN3ccc9CC15x1y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y13C1Ev();
extern void _ZN3ccc9CC15x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y13E[] = {
  NSPAIR(_ZN3ccc9CC15x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc9CC15x1y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y13E[];
Class_Descriptor cd__ZN3ccc9CC15x1y13E = {  "_ZN3ccc9CC15x1y13E", // class name
  bases__ZN3ccc9CC15x1y13E, 2,
  &(vtc__ZN3ccc9CC15x1y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y14  : ::ccc::AA15 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC15x1y143pqrEv
  ~CC15x1y14(); // tgen
  CC15x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y14E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x1y143pqrEv");}
ccc::CC15x1y14 ::~CC15x1y14(){ note_dtor("_ZN3ccc9CC15x1y14E", this);} // tgen
ccc::CC15x1y14 ::CC15x1y14(){ note_ctor("_ZN3ccc9CC15x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y14E, buf);
    ::ccc::CC15x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y14E);
    dp->::ccc::CC15x1y14::~CC15x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y14E(Test__ZN3ccc9CC15x1y14E, "_ZN3ccc9CC15x1y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y14C1Ev();
extern void _ZN3ccc9CC15x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y14E[] = {
  NSPAIR(_ZN3ccc9CC15x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc9CC15x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y14E[];
Class_Descriptor cd__ZN3ccc9CC15x1y14E = {  "_ZN3ccc9CC15x1y14E", // class name
  bases__ZN3ccc9CC15x1y14E, 2,
  &(vtc__ZN3ccc9CC15x1y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x1y15  : ::ccc::AA15 , ::ccc::BB1 {
  ~CC15x1y15(); // tgen
  CC15x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x1y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x1y15 ::~CC15x1y15(){ note_dtor("_ZN3ccc9CC15x1y15E", this);} // tgen
ccc::CC15x1y15 ::CC15x1y15(){ note_ctor("_ZN3ccc9CC15x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x1y15E, buf);
    ::ccc::CC15x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x1y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC15x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x1y15E);
    dp->::ccc::CC15x1y15::~CC15x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x1y15E(Test__ZN3ccc9CC15x1y15E, "_ZN3ccc9CC15x1y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x1y15C1Ev();
extern void _ZN3ccc9CC15x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x1y15E[] = {
  NSPAIR(_ZN3ccc9CC15x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC15x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB1E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x1y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x1y15E[];
Class_Descriptor cd__ZN3ccc9CC15x1y15E = {  "_ZN3ccc9CC15x1y15E", // class name
  bases__ZN3ccc9CC15x1y15E, 2,
  &(vtc__ZN3ccc9CC15x1y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x1y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y0  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC15x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y03pqrEv
  ~CC15x2y0(); // tgen
  CC15x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y0E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y03abcEv");}
void  ccc::CC15x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y03efgEv");}
void  ccc::CC15x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y03pqrEv");}
ccc::CC15x2y0 ::~CC15x2y0(){ note_dtor("_ZN3ccc8CC15x2y0E", this);} // tgen
ccc::CC15x2y0 ::CC15x2y0(){ note_ctor("_ZN3ccc8CC15x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y0E, buf);
    ::ccc::CC15x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y0E);
    dp->::ccc::CC15x2y0::~CC15x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y0E(Test__ZN3ccc8CC15x2y0E, "_ZN3ccc8CC15x2y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y0C1Ev();
extern void _ZN3ccc8CC15x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y0E[] = {
  NSPAIR(_ZN3ccc8CC15x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y0E[];
extern void _ZN3ccc8CC15x2y03efgEv();
extern void _ZN3ccc8CC15x2y03abcEv();
extern void _ZN3ccc8CC15x2y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y0E[];
Class_Descriptor cd__ZN3ccc8CC15x2y0E = {  "_ZN3ccc8CC15x2y0E", // class name
  bases__ZN3ccc8CC15x2y0E, 2,
  &(vtc__ZN3ccc8CC15x2y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y1  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC15x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x2y13efgEv
  ~CC15x2y1(); // tgen
  CC15x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y1E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y13abcEv");}
void  ccc::CC15x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y13pqrEv");}
void  ccc::CC15x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y13efgEv");}
ccc::CC15x2y1 ::~CC15x2y1(){ note_dtor("_ZN3ccc8CC15x2y1E", this);} // tgen
ccc::CC15x2y1 ::CC15x2y1(){ note_ctor("_ZN3ccc8CC15x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y1E, buf);
    ::ccc::CC15x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y1E);
    dp->::ccc::CC15x2y1::~CC15x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y1E(Test__ZN3ccc8CC15x2y1E, "_ZN3ccc8CC15x2y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y1C1Ev();
extern void _ZN3ccc8CC15x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y1E[] = {
  NSPAIR(_ZN3ccc8CC15x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y1E[];
extern void _ZN3ccc8CC15x2y13efgEv();
extern void _ZN3ccc8CC15x2y13abcEv();
extern void _ZN3ccc8CC15x2y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y1E[];
Class_Descriptor cd__ZN3ccc8CC15x2y1E = {  "_ZN3ccc8CC15x2y1E", // class name
  bases__ZN3ccc8CC15x2y1E, 2,
  &(vtc__ZN3ccc8CC15x2y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y2  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC15x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y23pqrEv
  ~CC15x2y2(); // tgen
  CC15x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y2E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y23efgEv");}
void  ccc::CC15x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y23abcEv");}
void  ccc::CC15x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y23pqrEv");}
ccc::CC15x2y2 ::~CC15x2y2(){ note_dtor("_ZN3ccc8CC15x2y2E", this);} // tgen
ccc::CC15x2y2 ::CC15x2y2(){ note_ctor("_ZN3ccc8CC15x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y2E, buf);
    ::ccc::CC15x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y2E);
    dp->::ccc::CC15x2y2::~CC15x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y2E(Test__ZN3ccc8CC15x2y2E, "_ZN3ccc8CC15x2y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y2C1Ev();
extern void _ZN3ccc8CC15x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y2E[] = {
  NSPAIR(_ZN3ccc8CC15x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y2E[];
extern void _ZN3ccc8CC15x2y23efgEv();
extern void _ZN3ccc8CC15x2y23abcEv();
extern void _ZN3ccc8CC15x2y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y2E[];
Class_Descriptor cd__ZN3ccc8CC15x2y2E = {  "_ZN3ccc8CC15x2y2E", // class name
  bases__ZN3ccc8CC15x2y2E, 2,
  &(vtc__ZN3ccc8CC15x2y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y3  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC15x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x2y33abcEv
  ~CC15x2y3(); // tgen
  CC15x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y3E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y33efgEv");}
void  ccc::CC15x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y33pqrEv");}
void  ccc::CC15x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y33abcEv");}
ccc::CC15x2y3 ::~CC15x2y3(){ note_dtor("_ZN3ccc8CC15x2y3E", this);} // tgen
ccc::CC15x2y3 ::CC15x2y3(){ note_ctor("_ZN3ccc8CC15x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y3E, buf);
    ::ccc::CC15x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y3E);
    dp->::ccc::CC15x2y3::~CC15x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y3E(Test__ZN3ccc8CC15x2y3E, "_ZN3ccc8CC15x2y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y3C1Ev();
extern void _ZN3ccc8CC15x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y3E[] = {
  NSPAIR(_ZN3ccc8CC15x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y3E[];
extern void _ZN3ccc8CC15x2y33efgEv();
extern void _ZN3ccc8CC15x2y33abcEv();
extern void _ZN3ccc8CC15x2y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y3E[];
Class_Descriptor cd__ZN3ccc8CC15x2y3E = {  "_ZN3ccc8CC15x2y3E", // class name
  bases__ZN3ccc8CC15x2y3E, 2,
  &(vtc__ZN3ccc8CC15x2y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y4  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC15x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x2y43efgEv
  ~CC15x2y4(); // tgen
  CC15x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y4E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y43pqrEv");}
void  ccc::CC15x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y43abcEv");}
void  ccc::CC15x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y43efgEv");}
ccc::CC15x2y4 ::~CC15x2y4(){ note_dtor("_ZN3ccc8CC15x2y4E", this);} // tgen
ccc::CC15x2y4 ::CC15x2y4(){ note_ctor("_ZN3ccc8CC15x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y4E, buf);
    ::ccc::CC15x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y4E);
    dp->::ccc::CC15x2y4::~CC15x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y4E(Test__ZN3ccc8CC15x2y4E, "_ZN3ccc8CC15x2y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y4C1Ev();
extern void _ZN3ccc8CC15x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y4E[] = {
  NSPAIR(_ZN3ccc8CC15x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y4E[];
extern void _ZN3ccc8CC15x2y43efgEv();
extern void _ZN3ccc8CC15x2y43abcEv();
extern void _ZN3ccc8CC15x2y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y4E[];
Class_Descriptor cd__ZN3ccc8CC15x2y4E = {  "_ZN3ccc8CC15x2y4E", // class name
  bases__ZN3ccc8CC15x2y4E, 2,
  &(vtc__ZN3ccc8CC15x2y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y5  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC15x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x2y53abcEv
  ~CC15x2y5(); // tgen
  CC15x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y5E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y53pqrEv");}
void  ccc::CC15x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y53efgEv");}
void  ccc::CC15x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y53abcEv");}
ccc::CC15x2y5 ::~CC15x2y5(){ note_dtor("_ZN3ccc8CC15x2y5E", this);} // tgen
ccc::CC15x2y5 ::CC15x2y5(){ note_ctor("_ZN3ccc8CC15x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y5E, buf);
    ::ccc::CC15x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y5E);
    dp->::ccc::CC15x2y5::~CC15x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y5E(Test__ZN3ccc8CC15x2y5E, "_ZN3ccc8CC15x2y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y5C1Ev();
extern void _ZN3ccc8CC15x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y5E[] = {
  NSPAIR(_ZN3ccc8CC15x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y5E[];
extern void _ZN3ccc8CC15x2y53efgEv();
extern void _ZN3ccc8CC15x2y53abcEv();
extern void _ZN3ccc8CC15x2y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y5E[];
Class_Descriptor cd__ZN3ccc8CC15x2y5E = {  "_ZN3ccc8CC15x2y5E", // class name
  bases__ZN3ccc8CC15x2y5E, 2,
  &(vtc__ZN3ccc8CC15x2y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y6  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC15x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x2y63efgEv
  ~CC15x2y6(); // tgen
  CC15x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y6E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y63abcEv");}
void  ccc::CC15x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y63efgEv");}
ccc::CC15x2y6 ::~CC15x2y6(){ note_dtor("_ZN3ccc8CC15x2y6E", this);} // tgen
ccc::CC15x2y6 ::CC15x2y6(){ note_ctor("_ZN3ccc8CC15x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y6E, buf);
    ::ccc::CC15x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y6E);
    dp->::ccc::CC15x2y6::~CC15x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y6E(Test__ZN3ccc8CC15x2y6E, "_ZN3ccc8CC15x2y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y6C1Ev();
extern void _ZN3ccc8CC15x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y6E[] = {
  NSPAIR(_ZN3ccc8CC15x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y6E[];
extern void _ZN3ccc8CC15x2y63efgEv();
extern void _ZN3ccc8CC15x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y6E[];
Class_Descriptor cd__ZN3ccc8CC15x2y6E = {  "_ZN3ccc8CC15x2y6E", // class name
  bases__ZN3ccc8CC15x2y6E, 2,
  &(vtc__ZN3ccc8CC15x2y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y7  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC15x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y73pqrEv
  ~CC15x2y7(); // tgen
  CC15x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y7E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y73abcEv");}
void  ccc::CC15x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y73pqrEv");}
ccc::CC15x2y7 ::~CC15x2y7(){ note_dtor("_ZN3ccc8CC15x2y7E", this);} // tgen
ccc::CC15x2y7 ::CC15x2y7(){ note_ctor("_ZN3ccc8CC15x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y7E, buf);
    ::ccc::CC15x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y7E);
    dp->::ccc::CC15x2y7::~CC15x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y7E(Test__ZN3ccc8CC15x2y7E, "_ZN3ccc8CC15x2y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y7C1Ev();
extern void _ZN3ccc8CC15x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y7E[] = {
  NSPAIR(_ZN3ccc8CC15x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC15x2y73abcEv();
extern void _ZN3ccc8CC15x2y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y7E[];
Class_Descriptor cd__ZN3ccc8CC15x2y7E = {  "_ZN3ccc8CC15x2y7E", // class name
  bases__ZN3ccc8CC15x2y7E, 2,
  &(vtc__ZN3ccc8CC15x2y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y8  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC15x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x2y83abcEv
  ~CC15x2y8(); // tgen
  CC15x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y8E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y83efgEv");}
void  ccc::CC15x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x2y83abcEv");}
ccc::CC15x2y8 ::~CC15x2y8(){ note_dtor("_ZN3ccc8CC15x2y8E", this);} // tgen
ccc::CC15x2y8 ::CC15x2y8(){ note_ctor("_ZN3ccc8CC15x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y8E, buf);
    ::ccc::CC15x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y8E);
    dp->::ccc::CC15x2y8::~CC15x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y8E(Test__ZN3ccc8CC15x2y8E, "_ZN3ccc8CC15x2y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y8C1Ev();
extern void _ZN3ccc8CC15x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y8E[] = {
  NSPAIR(_ZN3ccc8CC15x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y8E[];
extern void _ZN3ccc8CC15x2y83efgEv();
extern void _ZN3ccc8CC15x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y8E[];
Class_Descriptor cd__ZN3ccc8CC15x2y8E = {  "_ZN3ccc8CC15x2y8E", // class name
  bases__ZN3ccc8CC15x2y8E, 2,
  &(vtc__ZN3ccc8CC15x2y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y9  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC15x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x2y93pqrEv
  ~CC15x2y9(); // tgen
  CC15x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x2y9E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x2y93efgEv");}
void  ccc::CC15x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x2y93pqrEv");}
ccc::CC15x2y9 ::~CC15x2y9(){ note_dtor("_ZN3ccc8CC15x2y9E", this);} // tgen
ccc::CC15x2y9 ::CC15x2y9(){ note_ctor("_ZN3ccc8CC15x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x2y9E, buf);
    ::ccc::CC15x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x2y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC15x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x2y9E);
    dp->::ccc::CC15x2y9::~CC15x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x2y9E(Test__ZN3ccc8CC15x2y9E, "_ZN3ccc8CC15x2y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x2y9C1Ev();
extern void _ZN3ccc8CC15x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x2y9E[] = {
  NSPAIR(_ZN3ccc8CC15x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC15x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y9E[];
extern void _ZN3ccc8CC15x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC15x2y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x2y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x2y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x2y9E[];
Class_Descriptor cd__ZN3ccc8CC15x2y9E = {  "_ZN3ccc8CC15x2y9E", // class name
  bases__ZN3ccc8CC15x2y9E, 2,
  &(vtc__ZN3ccc8CC15x2y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x2y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y10  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC15x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x2y103abcEv
  ~CC15x2y10(); // tgen
  CC15x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y10E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x2y103pqrEv");}
void  ccc::CC15x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x2y103abcEv");}
ccc::CC15x2y10 ::~CC15x2y10(){ note_dtor("_ZN3ccc9CC15x2y10E", this);} // tgen
ccc::CC15x2y10 ::CC15x2y10(){ note_ctor("_ZN3ccc9CC15x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y10E, buf);
    ::ccc::CC15x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y10E);
    dp->::ccc::CC15x2y10::~CC15x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y10E(Test__ZN3ccc9CC15x2y10E, "_ZN3ccc9CC15x2y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y10C1Ev();
extern void _ZN3ccc9CC15x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y10E[] = {
  NSPAIR(_ZN3ccc9CC15x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc9CC15x2y103abcEv();
extern void _ZN3ccc9CC15x2y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y10E[];
Class_Descriptor cd__ZN3ccc9CC15x2y10E = {  "_ZN3ccc9CC15x2y10E", // class name
  bases__ZN3ccc9CC15x2y10E, 2,
  &(vtc__ZN3ccc9CC15x2y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y11  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC15x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x2y113efgEv
  ~CC15x2y11(); // tgen
  CC15x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y11E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x2y113pqrEv");}
void  ccc::CC15x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x2y113efgEv");}
ccc::CC15x2y11 ::~CC15x2y11(){ note_dtor("_ZN3ccc9CC15x2y11E", this);} // tgen
ccc::CC15x2y11 ::CC15x2y11(){ note_ctor("_ZN3ccc9CC15x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y11E, buf);
    ::ccc::CC15x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y11E);
    dp->::ccc::CC15x2y11::~CC15x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y11E(Test__ZN3ccc9CC15x2y11E, "_ZN3ccc9CC15x2y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y11C1Ev();
extern void _ZN3ccc9CC15x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y11E[] = {
  NSPAIR(_ZN3ccc9CC15x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y11E[];
extern void _ZN3ccc9CC15x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc9CC15x2y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y11E[];
Class_Descriptor cd__ZN3ccc9CC15x2y11E = {  "_ZN3ccc9CC15x2y11E", // class name
  bases__ZN3ccc9CC15x2y11E, 2,
  &(vtc__ZN3ccc9CC15x2y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y12  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC15x2y123abcEv
  ~CC15x2y12(); // tgen
  CC15x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y12E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x2y123abcEv");}
ccc::CC15x2y12 ::~CC15x2y12(){ note_dtor("_ZN3ccc9CC15x2y12E", this);} // tgen
ccc::CC15x2y12 ::CC15x2y12(){ note_ctor("_ZN3ccc9CC15x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y12E, buf);
    ::ccc::CC15x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y12E);
    dp->::ccc::CC15x2y12::~CC15x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y12E(Test__ZN3ccc9CC15x2y12E, "_ZN3ccc9CC15x2y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y12C1Ev();
extern void _ZN3ccc9CC15x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y12E[] = {
  NSPAIR(_ZN3ccc9CC15x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc9CC15x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y12E[];
Class_Descriptor cd__ZN3ccc9CC15x2y12E = {  "_ZN3ccc9CC15x2y12E", // class name
  bases__ZN3ccc9CC15x2y12E, 2,
  &(vtc__ZN3ccc9CC15x2y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y13  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC15x2y133efgEv
  ~CC15x2y13(); // tgen
  CC15x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y13E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x2y133efgEv");}
ccc::CC15x2y13 ::~CC15x2y13(){ note_dtor("_ZN3ccc9CC15x2y13E", this);} // tgen
ccc::CC15x2y13 ::CC15x2y13(){ note_ctor("_ZN3ccc9CC15x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y13E, buf);
    ::ccc::CC15x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y13E);
    dp->::ccc::CC15x2y13::~CC15x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y13E(Test__ZN3ccc9CC15x2y13E, "_ZN3ccc9CC15x2y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y13C1Ev();
extern void _ZN3ccc9CC15x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y13E[] = {
  NSPAIR(_ZN3ccc9CC15x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y13E[];
extern void _ZN3ccc9CC15x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y13E[];
Class_Descriptor cd__ZN3ccc9CC15x2y13E = {  "_ZN3ccc9CC15x2y13E", // class name
  bases__ZN3ccc9CC15x2y13E, 2,
  &(vtc__ZN3ccc9CC15x2y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y14  : ::ccc::AA15 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC15x2y143pqrEv
  ~CC15x2y14(); // tgen
  CC15x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y14E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x2y143pqrEv");}
ccc::CC15x2y14 ::~CC15x2y14(){ note_dtor("_ZN3ccc9CC15x2y14E", this);} // tgen
ccc::CC15x2y14 ::CC15x2y14(){ note_ctor("_ZN3ccc9CC15x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y14E, buf);
    ::ccc::CC15x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y14E);
    dp->::ccc::CC15x2y14::~CC15x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y14E(Test__ZN3ccc9CC15x2y14E, "_ZN3ccc9CC15x2y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y14C1Ev();
extern void _ZN3ccc9CC15x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y14E[] = {
  NSPAIR(_ZN3ccc9CC15x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc9CC15x2y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x2y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y14E[];
Class_Descriptor cd__ZN3ccc9CC15x2y14E = {  "_ZN3ccc9CC15x2y14E", // class name
  bases__ZN3ccc9CC15x2y14E, 2,
  &(vtc__ZN3ccc9CC15x2y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x2y15  : ::ccc::AA15 , ::ccc::BB2 {
  ~CC15x2y15(); // tgen
  CC15x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x2y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x2y15 ::~CC15x2y15(){ note_dtor("_ZN3ccc9CC15x2y15E", this);} // tgen
ccc::CC15x2y15 ::CC15x2y15(){ note_ctor("_ZN3ccc9CC15x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x2y15E, buf);
    ::ccc::CC15x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x2y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC15x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x2y15E);
    dp->::ccc::CC15x2y15::~CC15x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x2y15E(Test__ZN3ccc9CC15x2y15E, "_ZN3ccc9CC15x2y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x2y15C1Ev();
extern void _ZN3ccc9CC15x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x2y15E[] = {
  NSPAIR(_ZN3ccc9CC15x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC15x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB2E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x2y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x2y15E[];
Class_Descriptor cd__ZN3ccc9CC15x2y15E = {  "_ZN3ccc9CC15x2y15E", // class name
  bases__ZN3ccc9CC15x2y15E, 2,
  &(vtc__ZN3ccc9CC15x2y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x2y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y0  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC15x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y03pqrEv
  ~CC15x3y0(); // tgen
  CC15x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y0E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y03abcEv");}
void  ccc::CC15x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y03efgEv");}
void  ccc::CC15x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y03pqrEv");}
ccc::CC15x3y0 ::~CC15x3y0(){ note_dtor("_ZN3ccc8CC15x3y0E", this);} // tgen
ccc::CC15x3y0 ::CC15x3y0(){ note_ctor("_ZN3ccc8CC15x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y0E, buf);
    ::ccc::CC15x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y0E);
    dp->::ccc::CC15x3y0::~CC15x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y0E(Test__ZN3ccc8CC15x3y0E, "_ZN3ccc8CC15x3y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y0C1Ev();
extern void _ZN3ccc8CC15x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y0E[] = {
  NSPAIR(_ZN3ccc8CC15x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y0E[];
extern void _ZN3ccc8CC15x3y03efgEv();
extern void _ZN3ccc8CC15x3y03pqrEv();
extern void _ZN3ccc8CC15x3y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y0E[];
Class_Descriptor cd__ZN3ccc8CC15x3y0E = {  "_ZN3ccc8CC15x3y0E", // class name
  bases__ZN3ccc8CC15x3y0E, 2,
  &(vtc__ZN3ccc8CC15x3y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y1  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC15x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x3y13efgEv
  ~CC15x3y1(); // tgen
  CC15x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y1E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y13abcEv");}
void  ccc::CC15x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y13pqrEv");}
void  ccc::CC15x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y13efgEv");}
ccc::CC15x3y1 ::~CC15x3y1(){ note_dtor("_ZN3ccc8CC15x3y1E", this);} // tgen
ccc::CC15x3y1 ::CC15x3y1(){ note_ctor("_ZN3ccc8CC15x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y1E, buf);
    ::ccc::CC15x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y1E);
    dp->::ccc::CC15x3y1::~CC15x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y1E(Test__ZN3ccc8CC15x3y1E, "_ZN3ccc8CC15x3y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y1C1Ev();
extern void _ZN3ccc8CC15x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y1E[] = {
  NSPAIR(_ZN3ccc8CC15x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y1E[];
extern void _ZN3ccc8CC15x3y13efgEv();
extern void _ZN3ccc8CC15x3y13pqrEv();
extern void _ZN3ccc8CC15x3y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y1E[];
Class_Descriptor cd__ZN3ccc8CC15x3y1E = {  "_ZN3ccc8CC15x3y1E", // class name
  bases__ZN3ccc8CC15x3y1E, 2,
  &(vtc__ZN3ccc8CC15x3y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y2  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC15x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y23pqrEv
  ~CC15x3y2(); // tgen
  CC15x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y2E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y23efgEv");}
void  ccc::CC15x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y23abcEv");}
void  ccc::CC15x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y23pqrEv");}
ccc::CC15x3y2 ::~CC15x3y2(){ note_dtor("_ZN3ccc8CC15x3y2E", this);} // tgen
ccc::CC15x3y2 ::CC15x3y2(){ note_ctor("_ZN3ccc8CC15x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y2E, buf);
    ::ccc::CC15x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y2E);
    dp->::ccc::CC15x3y2::~CC15x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y2E(Test__ZN3ccc8CC15x3y2E, "_ZN3ccc8CC15x3y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y2C1Ev();
extern void _ZN3ccc8CC15x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y2E[] = {
  NSPAIR(_ZN3ccc8CC15x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y2E[];
extern void _ZN3ccc8CC15x3y23efgEv();
extern void _ZN3ccc8CC15x3y23pqrEv();
extern void _ZN3ccc8CC15x3y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y2E[];
Class_Descriptor cd__ZN3ccc8CC15x3y2E = {  "_ZN3ccc8CC15x3y2E", // class name
  bases__ZN3ccc8CC15x3y2E, 2,
  &(vtc__ZN3ccc8CC15x3y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y3  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC15x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x3y33abcEv
  ~CC15x3y3(); // tgen
  CC15x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y3E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y33efgEv");}
void  ccc::CC15x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y33pqrEv");}
void  ccc::CC15x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y33abcEv");}
ccc::CC15x3y3 ::~CC15x3y3(){ note_dtor("_ZN3ccc8CC15x3y3E", this);} // tgen
ccc::CC15x3y3 ::CC15x3y3(){ note_ctor("_ZN3ccc8CC15x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y3E, buf);
    ::ccc::CC15x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y3E);
    dp->::ccc::CC15x3y3::~CC15x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y3E(Test__ZN3ccc8CC15x3y3E, "_ZN3ccc8CC15x3y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y3C1Ev();
extern void _ZN3ccc8CC15x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y3E[] = {
  NSPAIR(_ZN3ccc8CC15x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y3E[];
extern void _ZN3ccc8CC15x3y33efgEv();
extern void _ZN3ccc8CC15x3y33pqrEv();
extern void _ZN3ccc8CC15x3y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y3E[];
Class_Descriptor cd__ZN3ccc8CC15x3y3E = {  "_ZN3ccc8CC15x3y3E", // class name
  bases__ZN3ccc8CC15x3y3E, 2,
  &(vtc__ZN3ccc8CC15x3y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y4  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC15x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x3y43efgEv
  ~CC15x3y4(); // tgen
  CC15x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y4E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y43pqrEv");}
void  ccc::CC15x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y43abcEv");}
void  ccc::CC15x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y43efgEv");}
ccc::CC15x3y4 ::~CC15x3y4(){ note_dtor("_ZN3ccc8CC15x3y4E", this);} // tgen
ccc::CC15x3y4 ::CC15x3y4(){ note_ctor("_ZN3ccc8CC15x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y4E, buf);
    ::ccc::CC15x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y4E);
    dp->::ccc::CC15x3y4::~CC15x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y4E(Test__ZN3ccc8CC15x3y4E, "_ZN3ccc8CC15x3y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y4C1Ev();
extern void _ZN3ccc8CC15x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y4E[] = {
  NSPAIR(_ZN3ccc8CC15x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y4E[];
extern void _ZN3ccc8CC15x3y43efgEv();
extern void _ZN3ccc8CC15x3y43pqrEv();
extern void _ZN3ccc8CC15x3y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y4E[];
Class_Descriptor cd__ZN3ccc8CC15x3y4E = {  "_ZN3ccc8CC15x3y4E", // class name
  bases__ZN3ccc8CC15x3y4E, 2,
  &(vtc__ZN3ccc8CC15x3y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y5  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC15x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x3y53abcEv
  ~CC15x3y5(); // tgen
  CC15x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y5E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y53pqrEv");}
void  ccc::CC15x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y53efgEv");}
void  ccc::CC15x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y53abcEv");}
ccc::CC15x3y5 ::~CC15x3y5(){ note_dtor("_ZN3ccc8CC15x3y5E", this);} // tgen
ccc::CC15x3y5 ::CC15x3y5(){ note_ctor("_ZN3ccc8CC15x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y5E, buf);
    ::ccc::CC15x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y5E);
    dp->::ccc::CC15x3y5::~CC15x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y5E(Test__ZN3ccc8CC15x3y5E, "_ZN3ccc8CC15x3y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y5C1Ev();
extern void _ZN3ccc8CC15x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y5E[] = {
  NSPAIR(_ZN3ccc8CC15x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y5E[];
extern void _ZN3ccc8CC15x3y53efgEv();
extern void _ZN3ccc8CC15x3y53pqrEv();
extern void _ZN3ccc8CC15x3y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y5E[];
Class_Descriptor cd__ZN3ccc8CC15x3y5E = {  "_ZN3ccc8CC15x3y5E", // class name
  bases__ZN3ccc8CC15x3y5E, 2,
  &(vtc__ZN3ccc8CC15x3y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y6  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC15x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x3y63efgEv
  ~CC15x3y6(); // tgen
  CC15x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y6E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y63abcEv");}
void  ccc::CC15x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y63efgEv");}
ccc::CC15x3y6 ::~CC15x3y6(){ note_dtor("_ZN3ccc8CC15x3y6E", this);} // tgen
ccc::CC15x3y6 ::CC15x3y6(){ note_ctor("_ZN3ccc8CC15x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y6E, buf);
    ::ccc::CC15x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y6E);
    dp->::ccc::CC15x3y6::~CC15x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y6E(Test__ZN3ccc8CC15x3y6E, "_ZN3ccc8CC15x3y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y6C1Ev();
extern void _ZN3ccc8CC15x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y6E[] = {
  NSPAIR(_ZN3ccc8CC15x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y6E[];
extern void _ZN3ccc8CC15x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC15x3y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y6E[];
Class_Descriptor cd__ZN3ccc8CC15x3y6E = {  "_ZN3ccc8CC15x3y6E", // class name
  bases__ZN3ccc8CC15x3y6E, 2,
  &(vtc__ZN3ccc8CC15x3y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y7  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC15x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y73pqrEv
  ~CC15x3y7(); // tgen
  CC15x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y7E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y73abcEv");}
void  ccc::CC15x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y73pqrEv");}
ccc::CC15x3y7 ::~CC15x3y7(){ note_dtor("_ZN3ccc8CC15x3y7E", this);} // tgen
ccc::CC15x3y7 ::CC15x3y7(){ note_ctor("_ZN3ccc8CC15x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y7E, buf);
    ::ccc::CC15x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y7E);
    dp->::ccc::CC15x3y7::~CC15x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y7E(Test__ZN3ccc8CC15x3y7E, "_ZN3ccc8CC15x3y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y7C1Ev();
extern void _ZN3ccc8CC15x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y7E[] = {
  NSPAIR(_ZN3ccc8CC15x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC15x3y73pqrEv();
extern void _ZN3ccc8CC15x3y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y7E[];
Class_Descriptor cd__ZN3ccc8CC15x3y7E = {  "_ZN3ccc8CC15x3y7E", // class name
  bases__ZN3ccc8CC15x3y7E, 2,
  &(vtc__ZN3ccc8CC15x3y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y8  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC15x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x3y83abcEv
  ~CC15x3y8(); // tgen
  CC15x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y8E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y83efgEv");}
void  ccc::CC15x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x3y83abcEv");}
ccc::CC15x3y8 ::~CC15x3y8(){ note_dtor("_ZN3ccc8CC15x3y8E", this);} // tgen
ccc::CC15x3y8 ::CC15x3y8(){ note_ctor("_ZN3ccc8CC15x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y8E, buf);
    ::ccc::CC15x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y8E);
    dp->::ccc::CC15x3y8::~CC15x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y8E(Test__ZN3ccc8CC15x3y8E, "_ZN3ccc8CC15x3y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y8C1Ev();
extern void _ZN3ccc8CC15x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y8E[] = {
  NSPAIR(_ZN3ccc8CC15x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y8E[];
extern void _ZN3ccc8CC15x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC15x3y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y8E[];
Class_Descriptor cd__ZN3ccc8CC15x3y8E = {  "_ZN3ccc8CC15x3y8E", // class name
  bases__ZN3ccc8CC15x3y8E, 2,
  &(vtc__ZN3ccc8CC15x3y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y9  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC15x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x3y93pqrEv
  ~CC15x3y9(); // tgen
  CC15x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x3y9E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x3y93efgEv");}
void  ccc::CC15x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x3y93pqrEv");}
ccc::CC15x3y9 ::~CC15x3y9(){ note_dtor("_ZN3ccc8CC15x3y9E", this);} // tgen
ccc::CC15x3y9 ::CC15x3y9(){ note_ctor("_ZN3ccc8CC15x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x3y9E, buf);
    ::ccc::CC15x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x3y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC15x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x3y9E);
    dp->::ccc::CC15x3y9::~CC15x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x3y9E(Test__ZN3ccc8CC15x3y9E, "_ZN3ccc8CC15x3y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x3y9C1Ev();
extern void _ZN3ccc8CC15x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x3y9E[] = {
  NSPAIR(_ZN3ccc8CC15x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC15x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y9E[];
extern void _ZN3ccc8CC15x3y93efgEv();
extern void _ZN3ccc8CC15x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x3y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x3y9E[];
Class_Descriptor cd__ZN3ccc8CC15x3y9E = {  "_ZN3ccc8CC15x3y9E", // class name
  bases__ZN3ccc8CC15x3y9E, 2,
  &(vtc__ZN3ccc8CC15x3y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x3y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y10  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC15x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x3y103abcEv
  ~CC15x3y10(); // tgen
  CC15x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y10E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x3y103pqrEv");}
void  ccc::CC15x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x3y103abcEv");}
ccc::CC15x3y10 ::~CC15x3y10(){ note_dtor("_ZN3ccc9CC15x3y10E", this);} // tgen
ccc::CC15x3y10 ::CC15x3y10(){ note_ctor("_ZN3ccc9CC15x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y10E, buf);
    ::ccc::CC15x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y10E);
    dp->::ccc::CC15x3y10::~CC15x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y10E(Test__ZN3ccc9CC15x3y10E, "_ZN3ccc9CC15x3y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y10C1Ev();
extern void _ZN3ccc9CC15x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y10E[] = {
  NSPAIR(_ZN3ccc9CC15x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc9CC15x3y103pqrEv();
extern void _ZN3ccc9CC15x3y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y10E[];
Class_Descriptor cd__ZN3ccc9CC15x3y10E = {  "_ZN3ccc9CC15x3y10E", // class name
  bases__ZN3ccc9CC15x3y10E, 2,
  &(vtc__ZN3ccc9CC15x3y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y11  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC15x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x3y113efgEv
  ~CC15x3y11(); // tgen
  CC15x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y11E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x3y113pqrEv");}
void  ccc::CC15x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x3y113efgEv");}
ccc::CC15x3y11 ::~CC15x3y11(){ note_dtor("_ZN3ccc9CC15x3y11E", this);} // tgen
ccc::CC15x3y11 ::CC15x3y11(){ note_ctor("_ZN3ccc9CC15x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y11E, buf);
    ::ccc::CC15x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y11E);
    dp->::ccc::CC15x3y11::~CC15x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y11E(Test__ZN3ccc9CC15x3y11E, "_ZN3ccc9CC15x3y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y11C1Ev();
extern void _ZN3ccc9CC15x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y11E[] = {
  NSPAIR(_ZN3ccc9CC15x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y11E[];
extern void _ZN3ccc9CC15x3y113efgEv();
extern void _ZN3ccc9CC15x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y11E[];
Class_Descriptor cd__ZN3ccc9CC15x3y11E = {  "_ZN3ccc9CC15x3y11E", // class name
  bases__ZN3ccc9CC15x3y11E, 2,
  &(vtc__ZN3ccc9CC15x3y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y12  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC15x3y123abcEv
  ~CC15x3y12(); // tgen
  CC15x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y12E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x3y123abcEv");}
ccc::CC15x3y12 ::~CC15x3y12(){ note_dtor("_ZN3ccc9CC15x3y12E", this);} // tgen
ccc::CC15x3y12 ::CC15x3y12(){ note_ctor("_ZN3ccc9CC15x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y12E, buf);
    ::ccc::CC15x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y12E);
    dp->::ccc::CC15x3y12::~CC15x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y12E(Test__ZN3ccc9CC15x3y12E, "_ZN3ccc9CC15x3y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y12C1Ev();
extern void _ZN3ccc9CC15x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y12E[] = {
  NSPAIR(_ZN3ccc9CC15x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc9CC15x3y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y12E[];
Class_Descriptor cd__ZN3ccc9CC15x3y12E = {  "_ZN3ccc9CC15x3y12E", // class name
  bases__ZN3ccc9CC15x3y12E, 2,
  &(vtc__ZN3ccc9CC15x3y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y13  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC15x3y133efgEv
  ~CC15x3y13(); // tgen
  CC15x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y13E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x3y133efgEv");}
ccc::CC15x3y13 ::~CC15x3y13(){ note_dtor("_ZN3ccc9CC15x3y13E", this);} // tgen
ccc::CC15x3y13 ::CC15x3y13(){ note_ctor("_ZN3ccc9CC15x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y13E, buf);
    ::ccc::CC15x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y13E);
    dp->::ccc::CC15x3y13::~CC15x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y13E(Test__ZN3ccc9CC15x3y13E, "_ZN3ccc9CC15x3y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y13C1Ev();
extern void _ZN3ccc9CC15x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y13E[] = {
  NSPAIR(_ZN3ccc9CC15x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y13E[];
extern void _ZN3ccc9CC15x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y13E[];
Class_Descriptor cd__ZN3ccc9CC15x3y13E = {  "_ZN3ccc9CC15x3y13E", // class name
  bases__ZN3ccc9CC15x3y13E, 2,
  &(vtc__ZN3ccc9CC15x3y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y14  : ::ccc::AA15 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC15x3y143pqrEv
  ~CC15x3y14(); // tgen
  CC15x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y14E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x3y143pqrEv");}
ccc::CC15x3y14 ::~CC15x3y14(){ note_dtor("_ZN3ccc9CC15x3y14E", this);} // tgen
ccc::CC15x3y14 ::CC15x3y14(){ note_ctor("_ZN3ccc9CC15x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y14E, buf);
    ::ccc::CC15x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y14E);
    dp->::ccc::CC15x3y14::~CC15x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y14E(Test__ZN3ccc9CC15x3y14E, "_ZN3ccc9CC15x3y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y14C1Ev();
extern void _ZN3ccc9CC15x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y14E[] = {
  NSPAIR(_ZN3ccc9CC15x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc9CC15x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y14E[];
Class_Descriptor cd__ZN3ccc9CC15x3y14E = {  "_ZN3ccc9CC15x3y14E", // class name
  bases__ZN3ccc9CC15x3y14E, 2,
  &(vtc__ZN3ccc9CC15x3y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x3y15  : ::ccc::AA15 , ::ccc::BB3 {
  ~CC15x3y15(); // tgen
  CC15x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x3y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x3y15 ::~CC15x3y15(){ note_dtor("_ZN3ccc9CC15x3y15E", this);} // tgen
ccc::CC15x3y15 ::CC15x3y15(){ note_ctor("_ZN3ccc9CC15x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x3y15E, buf);
    ::ccc::CC15x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x3y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC15x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x3y15E);
    dp->::ccc::CC15x3y15::~CC15x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x3y15E(Test__ZN3ccc9CC15x3y15E, "_ZN3ccc9CC15x3y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x3y15C1Ev();
extern void _ZN3ccc9CC15x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x3y15E[] = {
  NSPAIR(_ZN3ccc9CC15x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC15x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB3E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x3y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x3y15E[];
Class_Descriptor cd__ZN3ccc9CC15x3y15E = {  "_ZN3ccc9CC15x3y15E", // class name
  bases__ZN3ccc9CC15x3y15E, 2,
  &(vtc__ZN3ccc9CC15x3y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x3y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y0  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC15x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y03pqrEv
  ~CC15x4y0(); // tgen
  CC15x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y0E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y03abcEv");}
void  ccc::CC15x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y03efgEv");}
void  ccc::CC15x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y03pqrEv");}
ccc::CC15x4y0 ::~CC15x4y0(){ note_dtor("_ZN3ccc8CC15x4y0E", this);} // tgen
ccc::CC15x4y0 ::CC15x4y0(){ note_ctor("_ZN3ccc8CC15x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y0E, buf);
    ::ccc::CC15x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y0E);
    dp->::ccc::CC15x4y0::~CC15x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y0E(Test__ZN3ccc8CC15x4y0E, "_ZN3ccc8CC15x4y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y0C1Ev();
extern void _ZN3ccc8CC15x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y0E[] = {
  NSPAIR(_ZN3ccc8CC15x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y0E[];
extern void _ZN3ccc8CC15x4y03pqrEv();
extern void _ZN3ccc8CC15x4y03abcEv();
extern void _ZN3ccc8CC15x4y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y0E[];
Class_Descriptor cd__ZN3ccc8CC15x4y0E = {  "_ZN3ccc8CC15x4y0E", // class name
  bases__ZN3ccc8CC15x4y0E, 2,
  &(vtc__ZN3ccc8CC15x4y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y1  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC15x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x4y13efgEv
  ~CC15x4y1(); // tgen
  CC15x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y1E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y13abcEv");}
void  ccc::CC15x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y13pqrEv");}
void  ccc::CC15x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y13efgEv");}
ccc::CC15x4y1 ::~CC15x4y1(){ note_dtor("_ZN3ccc8CC15x4y1E", this);} // tgen
ccc::CC15x4y1 ::CC15x4y1(){ note_ctor("_ZN3ccc8CC15x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y1E, buf);
    ::ccc::CC15x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y1E);
    dp->::ccc::CC15x4y1::~CC15x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y1E(Test__ZN3ccc8CC15x4y1E, "_ZN3ccc8CC15x4y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y1C1Ev();
extern void _ZN3ccc8CC15x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y1E[] = {
  NSPAIR(_ZN3ccc8CC15x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y1E[];
extern void _ZN3ccc8CC15x4y13pqrEv();
extern void _ZN3ccc8CC15x4y13abcEv();
extern void _ZN3ccc8CC15x4y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y1E[];
Class_Descriptor cd__ZN3ccc8CC15x4y1E = {  "_ZN3ccc8CC15x4y1E", // class name
  bases__ZN3ccc8CC15x4y1E, 2,
  &(vtc__ZN3ccc8CC15x4y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y2  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC15x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y23pqrEv
  ~CC15x4y2(); // tgen
  CC15x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y2E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y23efgEv");}
void  ccc::CC15x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y23abcEv");}
void  ccc::CC15x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y23pqrEv");}
ccc::CC15x4y2 ::~CC15x4y2(){ note_dtor("_ZN3ccc8CC15x4y2E", this);} // tgen
ccc::CC15x4y2 ::CC15x4y2(){ note_ctor("_ZN3ccc8CC15x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y2E, buf);
    ::ccc::CC15x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y2E);
    dp->::ccc::CC15x4y2::~CC15x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y2E(Test__ZN3ccc8CC15x4y2E, "_ZN3ccc8CC15x4y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y2C1Ev();
extern void _ZN3ccc8CC15x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y2E[] = {
  NSPAIR(_ZN3ccc8CC15x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y2E[];
extern void _ZN3ccc8CC15x4y23pqrEv();
extern void _ZN3ccc8CC15x4y23abcEv();
extern void _ZN3ccc8CC15x4y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y2E[];
Class_Descriptor cd__ZN3ccc8CC15x4y2E = {  "_ZN3ccc8CC15x4y2E", // class name
  bases__ZN3ccc8CC15x4y2E, 2,
  &(vtc__ZN3ccc8CC15x4y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y3  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC15x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x4y33abcEv
  ~CC15x4y3(); // tgen
  CC15x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y3E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y33efgEv");}
void  ccc::CC15x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y33pqrEv");}
void  ccc::CC15x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y33abcEv");}
ccc::CC15x4y3 ::~CC15x4y3(){ note_dtor("_ZN3ccc8CC15x4y3E", this);} // tgen
ccc::CC15x4y3 ::CC15x4y3(){ note_ctor("_ZN3ccc8CC15x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y3E, buf);
    ::ccc::CC15x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y3E);
    dp->::ccc::CC15x4y3::~CC15x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y3E(Test__ZN3ccc8CC15x4y3E, "_ZN3ccc8CC15x4y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y3C1Ev();
extern void _ZN3ccc8CC15x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y3E[] = {
  NSPAIR(_ZN3ccc8CC15x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y3E[];
extern void _ZN3ccc8CC15x4y33pqrEv();
extern void _ZN3ccc8CC15x4y33abcEv();
extern void _ZN3ccc8CC15x4y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y3E[];
Class_Descriptor cd__ZN3ccc8CC15x4y3E = {  "_ZN3ccc8CC15x4y3E", // class name
  bases__ZN3ccc8CC15x4y3E, 2,
  &(vtc__ZN3ccc8CC15x4y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y4  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC15x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x4y43efgEv
  ~CC15x4y4(); // tgen
  CC15x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y4E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y43pqrEv");}
void  ccc::CC15x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y43abcEv");}
void  ccc::CC15x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y43efgEv");}
ccc::CC15x4y4 ::~CC15x4y4(){ note_dtor("_ZN3ccc8CC15x4y4E", this);} // tgen
ccc::CC15x4y4 ::CC15x4y4(){ note_ctor("_ZN3ccc8CC15x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y4E, buf);
    ::ccc::CC15x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y4E);
    dp->::ccc::CC15x4y4::~CC15x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y4E(Test__ZN3ccc8CC15x4y4E, "_ZN3ccc8CC15x4y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y4C1Ev();
extern void _ZN3ccc8CC15x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y4E[] = {
  NSPAIR(_ZN3ccc8CC15x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y4E[];
extern void _ZN3ccc8CC15x4y43pqrEv();
extern void _ZN3ccc8CC15x4y43abcEv();
extern void _ZN3ccc8CC15x4y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y4E[];
Class_Descriptor cd__ZN3ccc8CC15x4y4E = {  "_ZN3ccc8CC15x4y4E", // class name
  bases__ZN3ccc8CC15x4y4E, 2,
  &(vtc__ZN3ccc8CC15x4y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y5  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC15x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x4y53abcEv
  ~CC15x4y5(); // tgen
  CC15x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y5E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y53pqrEv");}
void  ccc::CC15x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y53efgEv");}
void  ccc::CC15x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y53abcEv");}
ccc::CC15x4y5 ::~CC15x4y5(){ note_dtor("_ZN3ccc8CC15x4y5E", this);} // tgen
ccc::CC15x4y5 ::CC15x4y5(){ note_ctor("_ZN3ccc8CC15x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y5E, buf);
    ::ccc::CC15x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y5E);
    dp->::ccc::CC15x4y5::~CC15x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y5E(Test__ZN3ccc8CC15x4y5E, "_ZN3ccc8CC15x4y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y5C1Ev();
extern void _ZN3ccc8CC15x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y5E[] = {
  NSPAIR(_ZN3ccc8CC15x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y5E[];
extern void _ZN3ccc8CC15x4y53pqrEv();
extern void _ZN3ccc8CC15x4y53abcEv();
extern void _ZN3ccc8CC15x4y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y5E[];
Class_Descriptor cd__ZN3ccc8CC15x4y5E = {  "_ZN3ccc8CC15x4y5E", // class name
  bases__ZN3ccc8CC15x4y5E, 2,
  &(vtc__ZN3ccc8CC15x4y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y6  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC15x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x4y63efgEv
  ~CC15x4y6(); // tgen
  CC15x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y6E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y63abcEv");}
void  ccc::CC15x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y63efgEv");}
ccc::CC15x4y6 ::~CC15x4y6(){ note_dtor("_ZN3ccc8CC15x4y6E", this);} // tgen
ccc::CC15x4y6 ::CC15x4y6(){ note_ctor("_ZN3ccc8CC15x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y6E, buf);
    ::ccc::CC15x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y6E);
    dp->::ccc::CC15x4y6::~CC15x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y6E(Test__ZN3ccc8CC15x4y6E, "_ZN3ccc8CC15x4y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y6C1Ev();
extern void _ZN3ccc8CC15x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y6E[] = {
  NSPAIR(_ZN3ccc8CC15x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC15x4y63abcEv();
extern void _ZN3ccc8CC15x4y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y6E[];
Class_Descriptor cd__ZN3ccc8CC15x4y6E = {  "_ZN3ccc8CC15x4y6E", // class name
  bases__ZN3ccc8CC15x4y6E, 2,
  &(vtc__ZN3ccc8CC15x4y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y7  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC15x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y73pqrEv
  ~CC15x4y7(); // tgen
  CC15x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y7E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y73abcEv");}
void  ccc::CC15x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y73pqrEv");}
ccc::CC15x4y7 ::~CC15x4y7(){ note_dtor("_ZN3ccc8CC15x4y7E", this);} // tgen
ccc::CC15x4y7 ::CC15x4y7(){ note_ctor("_ZN3ccc8CC15x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y7E, buf);
    ::ccc::CC15x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y7E);
    dp->::ccc::CC15x4y7::~CC15x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y7E(Test__ZN3ccc8CC15x4y7E, "_ZN3ccc8CC15x4y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y7C1Ev();
extern void _ZN3ccc8CC15x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y7E[] = {
  NSPAIR(_ZN3ccc8CC15x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y7E[];
extern void _ZN3ccc8CC15x4y73pqrEv();
extern void _ZN3ccc8CC15x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y7E[];
Class_Descriptor cd__ZN3ccc8CC15x4y7E = {  "_ZN3ccc8CC15x4y7E", // class name
  bases__ZN3ccc8CC15x4y7E, 2,
  &(vtc__ZN3ccc8CC15x4y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y8  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC15x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x4y83abcEv
  ~CC15x4y8(); // tgen
  CC15x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y8E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y83efgEv");}
void  ccc::CC15x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x4y83abcEv");}
ccc::CC15x4y8 ::~CC15x4y8(){ note_dtor("_ZN3ccc8CC15x4y8E", this);} // tgen
ccc::CC15x4y8 ::CC15x4y8(){ note_ctor("_ZN3ccc8CC15x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y8E, buf);
    ::ccc::CC15x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y8E);
    dp->::ccc::CC15x4y8::~CC15x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y8E(Test__ZN3ccc8CC15x4y8E, "_ZN3ccc8CC15x4y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y8C1Ev();
extern void _ZN3ccc8CC15x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y8E[] = {
  NSPAIR(_ZN3ccc8CC15x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC15x4y83abcEv();
extern void _ZN3ccc8CC15x4y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y8E[];
Class_Descriptor cd__ZN3ccc8CC15x4y8E = {  "_ZN3ccc8CC15x4y8E", // class name
  bases__ZN3ccc8CC15x4y8E, 2,
  &(vtc__ZN3ccc8CC15x4y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y9  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC15x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x4y93pqrEv
  ~CC15x4y9(); // tgen
  CC15x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x4y9E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x4y93efgEv");}
void  ccc::CC15x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x4y93pqrEv");}
ccc::CC15x4y9 ::~CC15x4y9(){ note_dtor("_ZN3ccc8CC15x4y9E", this);} // tgen
ccc::CC15x4y9 ::CC15x4y9(){ note_ctor("_ZN3ccc8CC15x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x4y9E, buf);
    ::ccc::CC15x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x4y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC15x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x4y9E);
    dp->::ccc::CC15x4y9::~CC15x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x4y9E(Test__ZN3ccc8CC15x4y9E, "_ZN3ccc8CC15x4y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x4y9C1Ev();
extern void _ZN3ccc8CC15x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x4y9E[] = {
  NSPAIR(_ZN3ccc8CC15x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC15x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y9E[];
extern void _ZN3ccc8CC15x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC15x4y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x4y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x4y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x4y9E[];
Class_Descriptor cd__ZN3ccc8CC15x4y9E = {  "_ZN3ccc8CC15x4y9E", // class name
  bases__ZN3ccc8CC15x4y9E, 2,
  &(vtc__ZN3ccc8CC15x4y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x4y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y10  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC15x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x4y103abcEv
  ~CC15x4y10(); // tgen
  CC15x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y10E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x4y103pqrEv");}
void  ccc::CC15x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x4y103abcEv");}
ccc::CC15x4y10 ::~CC15x4y10(){ note_dtor("_ZN3ccc9CC15x4y10E", this);} // tgen
ccc::CC15x4y10 ::CC15x4y10(){ note_ctor("_ZN3ccc9CC15x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y10E, buf);
    ::ccc::CC15x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y10E);
    dp->::ccc::CC15x4y10::~CC15x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y10E(Test__ZN3ccc9CC15x4y10E, "_ZN3ccc9CC15x4y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y10C1Ev();
extern void _ZN3ccc9CC15x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y10E[] = {
  NSPAIR(_ZN3ccc9CC15x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y10E[];
extern void _ZN3ccc9CC15x4y103pqrEv();
extern void _ZN3ccc9CC15x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y10E[];
Class_Descriptor cd__ZN3ccc9CC15x4y10E = {  "_ZN3ccc9CC15x4y10E", // class name
  bases__ZN3ccc9CC15x4y10E, 2,
  &(vtc__ZN3ccc9CC15x4y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y11  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC15x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x4y113efgEv
  ~CC15x4y11(); // tgen
  CC15x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y11E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x4y113pqrEv");}
void  ccc::CC15x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x4y113efgEv");}
ccc::CC15x4y11 ::~CC15x4y11(){ note_dtor("_ZN3ccc9CC15x4y11E", this);} // tgen
ccc::CC15x4y11 ::CC15x4y11(){ note_ctor("_ZN3ccc9CC15x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y11E, buf);
    ::ccc::CC15x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y11E);
    dp->::ccc::CC15x4y11::~CC15x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y11E(Test__ZN3ccc9CC15x4y11E, "_ZN3ccc9CC15x4y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y11C1Ev();
extern void _ZN3ccc9CC15x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y11E[] = {
  NSPAIR(_ZN3ccc9CC15x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y11E[];
extern void _ZN3ccc9CC15x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc9CC15x4y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y11E[];
Class_Descriptor cd__ZN3ccc9CC15x4y11E = {  "_ZN3ccc9CC15x4y11E", // class name
  bases__ZN3ccc9CC15x4y11E, 2,
  &(vtc__ZN3ccc9CC15x4y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y12  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC15x4y123abcEv
  ~CC15x4y12(); // tgen
  CC15x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y12E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x4y123abcEv");}
ccc::CC15x4y12 ::~CC15x4y12(){ note_dtor("_ZN3ccc9CC15x4y12E", this);} // tgen
ccc::CC15x4y12 ::CC15x4y12(){ note_ctor("_ZN3ccc9CC15x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y12E, buf);
    ::ccc::CC15x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y12E);
    dp->::ccc::CC15x4y12::~CC15x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y12E(Test__ZN3ccc9CC15x4y12E, "_ZN3ccc9CC15x4y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y12C1Ev();
extern void _ZN3ccc9CC15x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y12E[] = {
  NSPAIR(_ZN3ccc9CC15x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc9CC15x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y12E[];
Class_Descriptor cd__ZN3ccc9CC15x4y12E = {  "_ZN3ccc9CC15x4y12E", // class name
  bases__ZN3ccc9CC15x4y12E, 2,
  &(vtc__ZN3ccc9CC15x4y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y13  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC15x4y133efgEv
  ~CC15x4y13(); // tgen
  CC15x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y13E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x4y133efgEv");}
ccc::CC15x4y13 ::~CC15x4y13(){ note_dtor("_ZN3ccc9CC15x4y13E", this);} // tgen
ccc::CC15x4y13 ::CC15x4y13(){ note_ctor("_ZN3ccc9CC15x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y13E, buf);
    ::ccc::CC15x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y13E);
    dp->::ccc::CC15x4y13::~CC15x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y13E(Test__ZN3ccc9CC15x4y13E, "_ZN3ccc9CC15x4y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y13C1Ev();
extern void _ZN3ccc9CC15x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y13E[] = {
  NSPAIR(_ZN3ccc9CC15x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc9CC15x4y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y13E[];
Class_Descriptor cd__ZN3ccc9CC15x4y13E = {  "_ZN3ccc9CC15x4y13E", // class name
  bases__ZN3ccc9CC15x4y13E, 2,
  &(vtc__ZN3ccc9CC15x4y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y14  : ::ccc::AA15 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC15x4y143pqrEv
  ~CC15x4y14(); // tgen
  CC15x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y14E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x4y143pqrEv");}
ccc::CC15x4y14 ::~CC15x4y14(){ note_dtor("_ZN3ccc9CC15x4y14E", this);} // tgen
ccc::CC15x4y14 ::CC15x4y14(){ note_ctor("_ZN3ccc9CC15x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y14E, buf);
    ::ccc::CC15x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y14E);
    dp->::ccc::CC15x4y14::~CC15x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y14E(Test__ZN3ccc9CC15x4y14E, "_ZN3ccc9CC15x4y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y14C1Ev();
extern void _ZN3ccc9CC15x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y14E[] = {
  NSPAIR(_ZN3ccc9CC15x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y14E[];
extern void _ZN3ccc9CC15x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y14E[];
Class_Descriptor cd__ZN3ccc9CC15x4y14E = {  "_ZN3ccc9CC15x4y14E", // class name
  bases__ZN3ccc9CC15x4y14E, 2,
  &(vtc__ZN3ccc9CC15x4y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x4y15  : ::ccc::AA15 , ::ccc::BB4 {
  ~CC15x4y15(); // tgen
  CC15x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x4y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x4y15 ::~CC15x4y15(){ note_dtor("_ZN3ccc9CC15x4y15E", this);} // tgen
ccc::CC15x4y15 ::CC15x4y15(){ note_ctor("_ZN3ccc9CC15x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x4y15E, buf);
    ::ccc::CC15x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x4y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC15x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x4y15E);
    dp->::ccc::CC15x4y15::~CC15x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x4y15E(Test__ZN3ccc9CC15x4y15E, "_ZN3ccc9CC15x4y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x4y15C1Ev();
extern void _ZN3ccc9CC15x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x4y15E[] = {
  NSPAIR(_ZN3ccc9CC15x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC15x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB4E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x4y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x4y15E[];
Class_Descriptor cd__ZN3ccc9CC15x4y15E = {  "_ZN3ccc9CC15x4y15E", // class name
  bases__ZN3ccc9CC15x4y15E, 2,
  &(vtc__ZN3ccc9CC15x4y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x4y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y0  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC15x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y03pqrEv
  ~CC15x5y0(); // tgen
  CC15x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y0E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y03abcEv");}
void  ccc::CC15x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y03efgEv");}
void  ccc::CC15x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y03pqrEv");}
ccc::CC15x5y0 ::~CC15x5y0(){ note_dtor("_ZN3ccc8CC15x5y0E", this);} // tgen
ccc::CC15x5y0 ::CC15x5y0(){ note_ctor("_ZN3ccc8CC15x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y0E, buf);
    ::ccc::CC15x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y0E);
    dp->::ccc::CC15x5y0::~CC15x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y0E(Test__ZN3ccc8CC15x5y0E, "_ZN3ccc8CC15x5y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y0C1Ev();
extern void _ZN3ccc8CC15x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y0E[] = {
  NSPAIR(_ZN3ccc8CC15x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y0E[];
extern void _ZN3ccc8CC15x5y03pqrEv();
extern void _ZN3ccc8CC15x5y03efgEv();
extern void _ZN3ccc8CC15x5y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y0E[];
Class_Descriptor cd__ZN3ccc8CC15x5y0E = {  "_ZN3ccc8CC15x5y0E", // class name
  bases__ZN3ccc8CC15x5y0E, 2,
  &(vtc__ZN3ccc8CC15x5y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y1  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC15x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x5y13efgEv
  ~CC15x5y1(); // tgen
  CC15x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y1E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y13abcEv");}
void  ccc::CC15x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y13pqrEv");}
void  ccc::CC15x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y13efgEv");}
ccc::CC15x5y1 ::~CC15x5y1(){ note_dtor("_ZN3ccc8CC15x5y1E", this);} // tgen
ccc::CC15x5y1 ::CC15x5y1(){ note_ctor("_ZN3ccc8CC15x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y1E, buf);
    ::ccc::CC15x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y1E);
    dp->::ccc::CC15x5y1::~CC15x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y1E(Test__ZN3ccc8CC15x5y1E, "_ZN3ccc8CC15x5y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y1C1Ev();
extern void _ZN3ccc8CC15x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y1E[] = {
  NSPAIR(_ZN3ccc8CC15x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y1E[];
extern void _ZN3ccc8CC15x5y13pqrEv();
extern void _ZN3ccc8CC15x5y13efgEv();
extern void _ZN3ccc8CC15x5y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y1E[];
Class_Descriptor cd__ZN3ccc8CC15x5y1E = {  "_ZN3ccc8CC15x5y1E", // class name
  bases__ZN3ccc8CC15x5y1E, 2,
  &(vtc__ZN3ccc8CC15x5y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y2  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC15x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y23pqrEv
  ~CC15x5y2(); // tgen
  CC15x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y2E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y23efgEv");}
void  ccc::CC15x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y23abcEv");}
void  ccc::CC15x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y23pqrEv");}
ccc::CC15x5y2 ::~CC15x5y2(){ note_dtor("_ZN3ccc8CC15x5y2E", this);} // tgen
ccc::CC15x5y2 ::CC15x5y2(){ note_ctor("_ZN3ccc8CC15x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y2E, buf);
    ::ccc::CC15x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y2E);
    dp->::ccc::CC15x5y2::~CC15x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y2E(Test__ZN3ccc8CC15x5y2E, "_ZN3ccc8CC15x5y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y2C1Ev();
extern void _ZN3ccc8CC15x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y2E[] = {
  NSPAIR(_ZN3ccc8CC15x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y2E[];
extern void _ZN3ccc8CC15x5y23pqrEv();
extern void _ZN3ccc8CC15x5y23efgEv();
extern void _ZN3ccc8CC15x5y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y2E[];
Class_Descriptor cd__ZN3ccc8CC15x5y2E = {  "_ZN3ccc8CC15x5y2E", // class name
  bases__ZN3ccc8CC15x5y2E, 2,
  &(vtc__ZN3ccc8CC15x5y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y3  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC15x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x5y33abcEv
  ~CC15x5y3(); // tgen
  CC15x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y3E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y33efgEv");}
void  ccc::CC15x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y33pqrEv");}
void  ccc::CC15x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y33abcEv");}
ccc::CC15x5y3 ::~CC15x5y3(){ note_dtor("_ZN3ccc8CC15x5y3E", this);} // tgen
ccc::CC15x5y3 ::CC15x5y3(){ note_ctor("_ZN3ccc8CC15x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y3E, buf);
    ::ccc::CC15x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y3E);
    dp->::ccc::CC15x5y3::~CC15x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y3E(Test__ZN3ccc8CC15x5y3E, "_ZN3ccc8CC15x5y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y3C1Ev();
extern void _ZN3ccc8CC15x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y3E[] = {
  NSPAIR(_ZN3ccc8CC15x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y3E[];
extern void _ZN3ccc8CC15x5y33pqrEv();
extern void _ZN3ccc8CC15x5y33efgEv();
extern void _ZN3ccc8CC15x5y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y3E[];
Class_Descriptor cd__ZN3ccc8CC15x5y3E = {  "_ZN3ccc8CC15x5y3E", // class name
  bases__ZN3ccc8CC15x5y3E, 2,
  &(vtc__ZN3ccc8CC15x5y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y4  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC15x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x5y43efgEv
  ~CC15x5y4(); // tgen
  CC15x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y4E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y43pqrEv");}
void  ccc::CC15x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y43abcEv");}
void  ccc::CC15x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y43efgEv");}
ccc::CC15x5y4 ::~CC15x5y4(){ note_dtor("_ZN3ccc8CC15x5y4E", this);} // tgen
ccc::CC15x5y4 ::CC15x5y4(){ note_ctor("_ZN3ccc8CC15x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y4E, buf);
    ::ccc::CC15x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y4E);
    dp->::ccc::CC15x5y4::~CC15x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y4E(Test__ZN3ccc8CC15x5y4E, "_ZN3ccc8CC15x5y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y4C1Ev();
extern void _ZN3ccc8CC15x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y4E[] = {
  NSPAIR(_ZN3ccc8CC15x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y4E[];
extern void _ZN3ccc8CC15x5y43pqrEv();
extern void _ZN3ccc8CC15x5y43efgEv();
extern void _ZN3ccc8CC15x5y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y4E[];
Class_Descriptor cd__ZN3ccc8CC15x5y4E = {  "_ZN3ccc8CC15x5y4E", // class name
  bases__ZN3ccc8CC15x5y4E, 2,
  &(vtc__ZN3ccc8CC15x5y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y5  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC15x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x5y53abcEv
  ~CC15x5y5(); // tgen
  CC15x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y5E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y53pqrEv");}
void  ccc::CC15x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y53efgEv");}
void  ccc::CC15x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y53abcEv");}
ccc::CC15x5y5 ::~CC15x5y5(){ note_dtor("_ZN3ccc8CC15x5y5E", this);} // tgen
ccc::CC15x5y5 ::CC15x5y5(){ note_ctor("_ZN3ccc8CC15x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y5E, buf);
    ::ccc::CC15x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y5E);
    dp->::ccc::CC15x5y5::~CC15x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y5E(Test__ZN3ccc8CC15x5y5E, "_ZN3ccc8CC15x5y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y5C1Ev();
extern void _ZN3ccc8CC15x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y5E[] = {
  NSPAIR(_ZN3ccc8CC15x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y5E[];
extern void _ZN3ccc8CC15x5y53pqrEv();
extern void _ZN3ccc8CC15x5y53efgEv();
extern void _ZN3ccc8CC15x5y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y5E[];
Class_Descriptor cd__ZN3ccc8CC15x5y5E = {  "_ZN3ccc8CC15x5y5E", // class name
  bases__ZN3ccc8CC15x5y5E, 2,
  &(vtc__ZN3ccc8CC15x5y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y6  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC15x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x5y63efgEv
  ~CC15x5y6(); // tgen
  CC15x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y6E) C1{ BC2{} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y63abcEv");}
void  ccc::CC15x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y63efgEv");}
ccc::CC15x5y6 ::~CC15x5y6(){ note_dtor("_ZN3ccc8CC15x5y6E", this);} // tgen
ccc::CC15x5y6 ::CC15x5y6(){ note_ctor("_ZN3ccc8CC15x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y6E, buf);
    ::ccc::CC15x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y6E);
    dp->::ccc::CC15x5y6::~CC15x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y6E(Test__ZN3ccc8CC15x5y6E, "_ZN3ccc8CC15x5y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y6C1Ev();
extern void _ZN3ccc8CC15x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y6E[] = {
  NSPAIR(_ZN3ccc8CC15x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC15x5y63efgEv();
extern void _ZN3ccc8CC15x5y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y6E[];
Class_Descriptor cd__ZN3ccc8CC15x5y6E = {  "_ZN3ccc8CC15x5y6E", // class name
  bases__ZN3ccc8CC15x5y6E, 2,
  &(vtc__ZN3ccc8CC15x5y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y7  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC15x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y73pqrEv
  ~CC15x5y7(); // tgen
  CC15x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y7E) C1{ BC2{} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y73abcEv");}
void  ccc::CC15x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y73pqrEv");}
ccc::CC15x5y7 ::~CC15x5y7(){ note_dtor("_ZN3ccc8CC15x5y7E", this);} // tgen
ccc::CC15x5y7 ::CC15x5y7(){ note_ctor("_ZN3ccc8CC15x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y7E, buf);
    ::ccc::CC15x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y7E);
    dp->::ccc::CC15x5y7::~CC15x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y7E(Test__ZN3ccc8CC15x5y7E, "_ZN3ccc8CC15x5y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y7C1Ev();
extern void _ZN3ccc8CC15x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y7E[] = {
  NSPAIR(_ZN3ccc8CC15x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y7E[];
extern void _ZN3ccc8CC15x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC15x5y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y7E[];
Class_Descriptor cd__ZN3ccc8CC15x5y7E = {  "_ZN3ccc8CC15x5y7E", // class name
  bases__ZN3ccc8CC15x5y7E, 2,
  &(vtc__ZN3ccc8CC15x5y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y8  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC15x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x5y83abcEv
  ~CC15x5y8(); // tgen
  CC15x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y8E) C1{ BC2{} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y83efgEv");}
void  ccc::CC15x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x5y83abcEv");}
ccc::CC15x5y8 ::~CC15x5y8(){ note_dtor("_ZN3ccc8CC15x5y8E", this);} // tgen
ccc::CC15x5y8 ::CC15x5y8(){ note_ctor("_ZN3ccc8CC15x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y8E, buf);
    ::ccc::CC15x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y8E);
    dp->::ccc::CC15x5y8::~CC15x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y8E(Test__ZN3ccc8CC15x5y8E, "_ZN3ccc8CC15x5y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y8C1Ev();
extern void _ZN3ccc8CC15x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y8E[] = {
  NSPAIR(_ZN3ccc8CC15x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC15x5y83efgEv();
extern void _ZN3ccc8CC15x5y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y8E[];
Class_Descriptor cd__ZN3ccc8CC15x5y8E = {  "_ZN3ccc8CC15x5y8E", // class name
  bases__ZN3ccc8CC15x5y8E, 2,
  &(vtc__ZN3ccc8CC15x5y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y9  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC15x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x5y93pqrEv
  ~CC15x5y9(); // tgen
  CC15x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x5y9E) C1{ BC2{} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x5y93efgEv");}
void  ccc::CC15x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x5y93pqrEv");}
ccc::CC15x5y9 ::~CC15x5y9(){ note_dtor("_ZN3ccc8CC15x5y9E", this);} // tgen
ccc::CC15x5y9 ::CC15x5y9(){ note_ctor("_ZN3ccc8CC15x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x5y9E, buf);
    ::ccc::CC15x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x5y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC15x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x5y9E);
    dp->::ccc::CC15x5y9::~CC15x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x5y9E(Test__ZN3ccc8CC15x5y9E, "_ZN3ccc8CC15x5y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x5y9C1Ev();
extern void _ZN3ccc8CC15x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x5y9E[] = {
  NSPAIR(_ZN3ccc8CC15x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC15x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y9E[];
extern void _ZN3ccc8CC15x5y93pqrEv();
extern void _ZN3ccc8CC15x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x5y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x5y9E[];
Class_Descriptor cd__ZN3ccc8CC15x5y9E = {  "_ZN3ccc8CC15x5y9E", // class name
  bases__ZN3ccc8CC15x5y9E, 2,
  &(vtc__ZN3ccc8CC15x5y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x5y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y10  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC15x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x5y103abcEv
  ~CC15x5y10(); // tgen
  CC15x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y10E) C1{ BC2{} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x5y103pqrEv");}
void  ccc::CC15x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x5y103abcEv");}
ccc::CC15x5y10 ::~CC15x5y10(){ note_dtor("_ZN3ccc9CC15x5y10E", this);} // tgen
ccc::CC15x5y10 ::CC15x5y10(){ note_ctor("_ZN3ccc9CC15x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y10E, buf);
    ::ccc::CC15x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y10E);
    dp->::ccc::CC15x5y10::~CC15x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y10E(Test__ZN3ccc9CC15x5y10E, "_ZN3ccc9CC15x5y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y10C1Ev();
extern void _ZN3ccc9CC15x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y10E[] = {
  NSPAIR(_ZN3ccc9CC15x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y10E[];
extern void _ZN3ccc9CC15x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc9CC15x5y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y10E[];
Class_Descriptor cd__ZN3ccc9CC15x5y10E = {  "_ZN3ccc9CC15x5y10E", // class name
  bases__ZN3ccc9CC15x5y10E, 2,
  &(vtc__ZN3ccc9CC15x5y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y11  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC15x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x5y113efgEv
  ~CC15x5y11(); // tgen
  CC15x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y11E) C1{ BC2{} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x5y113pqrEv");}
void  ccc::CC15x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x5y113efgEv");}
ccc::CC15x5y11 ::~CC15x5y11(){ note_dtor("_ZN3ccc9CC15x5y11E", this);} // tgen
ccc::CC15x5y11 ::CC15x5y11(){ note_ctor("_ZN3ccc9CC15x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y11E, buf);
    ::ccc::CC15x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y11E);
    dp->::ccc::CC15x5y11::~CC15x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y11E(Test__ZN3ccc9CC15x5y11E, "_ZN3ccc9CC15x5y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y11C1Ev();
extern void _ZN3ccc9CC15x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y11E[] = {
  NSPAIR(_ZN3ccc9CC15x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y11E[];
extern void _ZN3ccc9CC15x5y113pqrEv();
extern void _ZN3ccc9CC15x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y11E[];
Class_Descriptor cd__ZN3ccc9CC15x5y11E = {  "_ZN3ccc9CC15x5y11E", // class name
  bases__ZN3ccc9CC15x5y11E, 2,
  &(vtc__ZN3ccc9CC15x5y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y12  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC15x5y123abcEv
  ~CC15x5y12(); // tgen
  CC15x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y12E) C1{ BC2{} BC3{ v2 v3 v1} v1}
}
namespace ccc { 
void  ccc::CC15x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x5y123abcEv");}
ccc::CC15x5y12 ::~CC15x5y12(){ note_dtor("_ZN3ccc9CC15x5y12E", this);} // tgen
ccc::CC15x5y12 ::CC15x5y12(){ note_ctor("_ZN3ccc9CC15x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y12E, buf);
    ::ccc::CC15x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y12E);
    dp->::ccc::CC15x5y12::~CC15x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y12E(Test__ZN3ccc9CC15x5y12E, "_ZN3ccc9CC15x5y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y12C1Ev();
extern void _ZN3ccc9CC15x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y12E[] = {
  NSPAIR(_ZN3ccc9CC15x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc9CC15x5y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y12E[];
Class_Descriptor cd__ZN3ccc9CC15x5y12E = {  "_ZN3ccc9CC15x5y12E", // class name
  bases__ZN3ccc9CC15x5y12E, 2,
  &(vtc__ZN3ccc9CC15x5y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y13  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC15x5y133efgEv
  ~CC15x5y13(); // tgen
  CC15x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y13E) C1{ BC2{} BC3{ v2 v1 v3} v1}
}
namespace ccc { 
void  ccc::CC15x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x5y133efgEv");}
ccc::CC15x5y13 ::~CC15x5y13(){ note_dtor("_ZN3ccc9CC15x5y13E", this);} // tgen
ccc::CC15x5y13 ::CC15x5y13(){ note_ctor("_ZN3ccc9CC15x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y13E, buf);
    ::ccc::CC15x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y13E);
    dp->::ccc::CC15x5y13::~CC15x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y13E(Test__ZN3ccc9CC15x5y13E, "_ZN3ccc9CC15x5y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y13C1Ev();
extern void _ZN3ccc9CC15x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y13E[] = {
  NSPAIR(_ZN3ccc9CC15x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc9CC15x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y13E[];
Class_Descriptor cd__ZN3ccc9CC15x5y13E = {  "_ZN3ccc9CC15x5y13E", // class name
  bases__ZN3ccc9CC15x5y13E, 2,
  &(vtc__ZN3ccc9CC15x5y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y14  : ::ccc::AA15 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC15x5y143pqrEv
  ~CC15x5y14(); // tgen
  CC15x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y14E) C1{ BC2{} BC3{ v1 v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x5y143pqrEv");}
ccc::CC15x5y14 ::~CC15x5y14(){ note_dtor("_ZN3ccc9CC15x5y14E", this);} // tgen
ccc::CC15x5y14 ::CC15x5y14(){ note_ctor("_ZN3ccc9CC15x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y14E, buf);
    ::ccc::CC15x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y14E);
    dp->::ccc::CC15x5y14::~CC15x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y14E(Test__ZN3ccc9CC15x5y14E, "_ZN3ccc9CC15x5y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y14C1Ev();
extern void _ZN3ccc9CC15x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y14E[] = {
  NSPAIR(_ZN3ccc9CC15x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y14E[];
extern void _ZN3ccc9CC15x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y14E[];
Class_Descriptor cd__ZN3ccc9CC15x5y14E = {  "_ZN3ccc9CC15x5y14E", // class name
  bases__ZN3ccc9CC15x5y14E, 2,
  &(vtc__ZN3ccc9CC15x5y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x5y15  : ::ccc::AA15 , ::ccc::BB5 {
  ~CC15x5y15(); // tgen
  CC15x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x5y15E) C1{ BC2{} BC3{ v1 v2 v3}}
}
namespace ccc { 
ccc::CC15x5y15 ::~CC15x5y15(){ note_dtor("_ZN3ccc9CC15x5y15E", this);} // tgen
ccc::CC15x5y15 ::CC15x5y15(){ note_ctor("_ZN3ccc9CC15x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x5y15E, buf);
    ::ccc::CC15x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x5y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC15x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x5y15E);
    dp->::ccc::CC15x5y15::~CC15x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x5y15E(Test__ZN3ccc9CC15x5y15E, "_ZN3ccc9CC15x5y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x5y15C1Ev();
extern void _ZN3ccc9CC15x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x5y15E[] = {
  NSPAIR(_ZN3ccc9CC15x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC15x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB5E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x5y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x5y15E[];
Class_Descriptor cd__ZN3ccc9CC15x5y15E = {  "_ZN3ccc9CC15x5y15E", // class name
  bases__ZN3ccc9CC15x5y15E, 2,
  &(vtc__ZN3ccc9CC15x5y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x5y15E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y0  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC15x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y03pqrEv
  ~CC15x6y0(); // tgen
  CC15x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y0E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y03abcEv");}
void  ccc::CC15x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y03efgEv");}
void  ccc::CC15x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y03pqrEv");}
ccc::CC15x6y0 ::~CC15x6y0(){ note_dtor("_ZN3ccc8CC15x6y0E", this);} // tgen
ccc::CC15x6y0 ::CC15x6y0(){ note_ctor("_ZN3ccc8CC15x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y0E, buf);
    ::ccc::CC15x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y0E);
    dp->::ccc::CC15x6y0::~CC15x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y0E(Test__ZN3ccc8CC15x6y0E, "_ZN3ccc8CC15x6y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y0C1Ev();
extern void _ZN3ccc8CC15x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y0E[] = {
  NSPAIR(_ZN3ccc8CC15x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y0E[];
extern void _ZN3ccc8CC15x6y03abcEv();
extern void _ZN3ccc8CC15x6y03efgEv();
extern void _ZN3ccc8CC15x6y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y0E[];
Class_Descriptor cd__ZN3ccc8CC15x6y0E = {  "_ZN3ccc8CC15x6y0E", // class name
  bases__ZN3ccc8CC15x6y0E, 2,
  &(vtc__ZN3ccc8CC15x6y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y1  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC15x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x6y13efgEv
  ~CC15x6y1(); // tgen
  CC15x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y1E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y13abcEv");}
void  ccc::CC15x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y13pqrEv");}
void  ccc::CC15x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y13efgEv");}
ccc::CC15x6y1 ::~CC15x6y1(){ note_dtor("_ZN3ccc8CC15x6y1E", this);} // tgen
ccc::CC15x6y1 ::CC15x6y1(){ note_ctor("_ZN3ccc8CC15x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y1E, buf);
    ::ccc::CC15x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y1E);
    dp->::ccc::CC15x6y1::~CC15x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y1E(Test__ZN3ccc8CC15x6y1E, "_ZN3ccc8CC15x6y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y1C1Ev();
extern void _ZN3ccc8CC15x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y1E[] = {
  NSPAIR(_ZN3ccc8CC15x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y1E[];
extern void _ZN3ccc8CC15x6y13abcEv();
extern void _ZN3ccc8CC15x6y13efgEv();
extern void _ZN3ccc8CC15x6y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y1E[];
Class_Descriptor cd__ZN3ccc8CC15x6y1E = {  "_ZN3ccc8CC15x6y1E", // class name
  bases__ZN3ccc8CC15x6y1E, 2,
  &(vtc__ZN3ccc8CC15x6y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y2  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC15x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y23pqrEv
  ~CC15x6y2(); // tgen
  CC15x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y2E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y23efgEv");}
void  ccc::CC15x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y23abcEv");}
void  ccc::CC15x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y23pqrEv");}
ccc::CC15x6y2 ::~CC15x6y2(){ note_dtor("_ZN3ccc8CC15x6y2E", this);} // tgen
ccc::CC15x6y2 ::CC15x6y2(){ note_ctor("_ZN3ccc8CC15x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y2E, buf);
    ::ccc::CC15x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y2E);
    dp->::ccc::CC15x6y2::~CC15x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y2E(Test__ZN3ccc8CC15x6y2E, "_ZN3ccc8CC15x6y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y2C1Ev();
extern void _ZN3ccc8CC15x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y2E[] = {
  NSPAIR(_ZN3ccc8CC15x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y2E[];
extern void _ZN3ccc8CC15x6y23abcEv();
extern void _ZN3ccc8CC15x6y23efgEv();
extern void _ZN3ccc8CC15x6y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y2E[];
Class_Descriptor cd__ZN3ccc8CC15x6y2E = {  "_ZN3ccc8CC15x6y2E", // class name
  bases__ZN3ccc8CC15x6y2E, 2,
  &(vtc__ZN3ccc8CC15x6y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y3  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC15x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x6y33abcEv
  ~CC15x6y3(); // tgen
  CC15x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y3E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y33efgEv");}
void  ccc::CC15x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y33pqrEv");}
void  ccc::CC15x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y33abcEv");}
ccc::CC15x6y3 ::~CC15x6y3(){ note_dtor("_ZN3ccc8CC15x6y3E", this);} // tgen
ccc::CC15x6y3 ::CC15x6y3(){ note_ctor("_ZN3ccc8CC15x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y3E, buf);
    ::ccc::CC15x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y3E);
    dp->::ccc::CC15x6y3::~CC15x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y3E(Test__ZN3ccc8CC15x6y3E, "_ZN3ccc8CC15x6y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y3C1Ev();
extern void _ZN3ccc8CC15x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y3E[] = {
  NSPAIR(_ZN3ccc8CC15x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y3E[];
extern void _ZN3ccc8CC15x6y33abcEv();
extern void _ZN3ccc8CC15x6y33efgEv();
extern void _ZN3ccc8CC15x6y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y3E[];
Class_Descriptor cd__ZN3ccc8CC15x6y3E = {  "_ZN3ccc8CC15x6y3E", // class name
  bases__ZN3ccc8CC15x6y3E, 2,
  &(vtc__ZN3ccc8CC15x6y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y4  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC15x6y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x6y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x6y43efgEv
  ~CC15x6y4(); // tgen
  CC15x6y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y4E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y43pqrEv");}
void  ccc::CC15x6y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y43abcEv");}
void  ccc::CC15x6y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y43efgEv");}
ccc::CC15x6y4 ::~CC15x6y4(){ note_dtor("_ZN3ccc8CC15x6y4E", this);} // tgen
ccc::CC15x6y4 ::CC15x6y4(){ note_ctor("_ZN3ccc8CC15x6y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y4E, buf);
    ::ccc::CC15x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y4E);
    dp->::ccc::CC15x6y4::~CC15x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y4E(Test__ZN3ccc8CC15x6y4E, "_ZN3ccc8CC15x6y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y4C1Ev();
extern void _ZN3ccc8CC15x6y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y4E[] = {
  NSPAIR(_ZN3ccc8CC15x6y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y4E[];
extern void _ZN3ccc8CC15x6y43abcEv();
extern void _ZN3ccc8CC15x6y43efgEv();
extern void _ZN3ccc8CC15x6y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y4E[];
Class_Descriptor cd__ZN3ccc8CC15x6y4E = {  "_ZN3ccc8CC15x6y4E", // class name
  bases__ZN3ccc8CC15x6y4E, 2,
  &(vtc__ZN3ccc8CC15x6y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y5  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC15x6y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x6y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x6y53abcEv
  ~CC15x6y5(); // tgen
  CC15x6y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y5E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y53pqrEv");}
void  ccc::CC15x6y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y53efgEv");}
void  ccc::CC15x6y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y53abcEv");}
ccc::CC15x6y5 ::~CC15x6y5(){ note_dtor("_ZN3ccc8CC15x6y5E", this);} // tgen
ccc::CC15x6y5 ::CC15x6y5(){ note_ctor("_ZN3ccc8CC15x6y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y5E, buf);
    ::ccc::CC15x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y5E);
    dp->::ccc::CC15x6y5::~CC15x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y5E(Test__ZN3ccc8CC15x6y5E, "_ZN3ccc8CC15x6y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y5C1Ev();
extern void _ZN3ccc8CC15x6y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y5E[] = {
  NSPAIR(_ZN3ccc8CC15x6y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y5E[];
extern void _ZN3ccc8CC15x6y53abcEv();
extern void _ZN3ccc8CC15x6y53efgEv();
extern void _ZN3ccc8CC15x6y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y5E[];
Class_Descriptor cd__ZN3ccc8CC15x6y5E = {  "_ZN3ccc8CC15x6y5E", // class name
  bases__ZN3ccc8CC15x6y5E, 2,
  &(vtc__ZN3ccc8CC15x6y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y6  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC15x6y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x6y63efgEv
  ~CC15x6y6(); // tgen
  CC15x6y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y6E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y63abcEv");}
void  ccc::CC15x6y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y63efgEv");}
ccc::CC15x6y6 ::~CC15x6y6(){ note_dtor("_ZN3ccc8CC15x6y6E", this);} // tgen
ccc::CC15x6y6 ::CC15x6y6(){ note_ctor("_ZN3ccc8CC15x6y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y6E, buf);
    ::ccc::CC15x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y6E);
    dp->::ccc::CC15x6y6::~CC15x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y6E(Test__ZN3ccc8CC15x6y6E, "_ZN3ccc8CC15x6y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y6C1Ev();
extern void _ZN3ccc8CC15x6y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y6E[] = {
  NSPAIR(_ZN3ccc8CC15x6y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y6E[];
extern void _ZN3ccc8CC15x6y63abcEv();
extern void _ZN3ccc8CC15x6y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y6E[];
Class_Descriptor cd__ZN3ccc8CC15x6y6E = {  "_ZN3ccc8CC15x6y6E", // class name
  bases__ZN3ccc8CC15x6y6E, 2,
  &(vtc__ZN3ccc8CC15x6y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y7  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC15x6y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y73pqrEv
  ~CC15x6y7(); // tgen
  CC15x6y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y7E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y73abcEv");}
void  ccc::CC15x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y73pqrEv");}
ccc::CC15x6y7 ::~CC15x6y7(){ note_dtor("_ZN3ccc8CC15x6y7E", this);} // tgen
ccc::CC15x6y7 ::CC15x6y7(){ note_ctor("_ZN3ccc8CC15x6y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y7E, buf);
    ::ccc::CC15x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y7E);
    dp->::ccc::CC15x6y7::~CC15x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y7E(Test__ZN3ccc8CC15x6y7E, "_ZN3ccc8CC15x6y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y7C1Ev();
extern void _ZN3ccc8CC15x6y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y7E[] = {
  NSPAIR(_ZN3ccc8CC15x6y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y7E[];
extern void _ZN3ccc8CC15x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC15x6y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y7E[];
Class_Descriptor cd__ZN3ccc8CC15x6y7E = {  "_ZN3ccc8CC15x6y7E", // class name
  bases__ZN3ccc8CC15x6y7E, 2,
  &(vtc__ZN3ccc8CC15x6y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y8  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC15x6y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x6y83abcEv
  ~CC15x6y8(); // tgen
  CC15x6y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y8E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y83efgEv");}
void  ccc::CC15x6y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x6y83abcEv");}
ccc::CC15x6y8 ::~CC15x6y8(){ note_dtor("_ZN3ccc8CC15x6y8E", this);} // tgen
ccc::CC15x6y8 ::CC15x6y8(){ note_ctor("_ZN3ccc8CC15x6y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y8E, buf);
    ::ccc::CC15x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y8E);
    dp->::ccc::CC15x6y8::~CC15x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y8E(Test__ZN3ccc8CC15x6y8E, "_ZN3ccc8CC15x6y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y8C1Ev();
extern void _ZN3ccc8CC15x6y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y8E[] = {
  NSPAIR(_ZN3ccc8CC15x6y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y8E[];
extern void _ZN3ccc8CC15x6y83abcEv();
extern void _ZN3ccc8CC15x6y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y8E[];
Class_Descriptor cd__ZN3ccc8CC15x6y8E = {  "_ZN3ccc8CC15x6y8E", // class name
  bases__ZN3ccc8CC15x6y8E, 2,
  &(vtc__ZN3ccc8CC15x6y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y9  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC15x6y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x6y93pqrEv
  ~CC15x6y9(); // tgen
  CC15x6y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x6y9E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x6y93efgEv");}
void  ccc::CC15x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x6y93pqrEv");}
ccc::CC15x6y9 ::~CC15x6y9(){ note_dtor("_ZN3ccc8CC15x6y9E", this);} // tgen
ccc::CC15x6y9 ::CC15x6y9(){ note_ctor("_ZN3ccc8CC15x6y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x6y9E, buf);
    ::ccc::CC15x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x6y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC15x6y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x6y9E);
    dp->::ccc::CC15x6y9::~CC15x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x6y9E(Test__ZN3ccc8CC15x6y9E, "_ZN3ccc8CC15x6y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x6y9C1Ev();
extern void _ZN3ccc8CC15x6y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x6y9E[] = {
  NSPAIR(_ZN3ccc8CC15x6y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC15x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC15x6y93efgEv();
extern void _ZN3ccc8CC15x6y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x6y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x6y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x6y9E[];
Class_Descriptor cd__ZN3ccc8CC15x6y9E = {  "_ZN3ccc8CC15x6y9E", // class name
  bases__ZN3ccc8CC15x6y9E, 2,
  &(vtc__ZN3ccc8CC15x6y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x6y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y10  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC15x6y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x6y103abcEv
  ~CC15x6y10(); // tgen
  CC15x6y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y10E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x6y103pqrEv");}
void  ccc::CC15x6y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x6y103abcEv");}
ccc::CC15x6y10 ::~CC15x6y10(){ note_dtor("_ZN3ccc9CC15x6y10E", this);} // tgen
ccc::CC15x6y10 ::CC15x6y10(){ note_ctor("_ZN3ccc9CC15x6y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y10E, buf);
    ::ccc::CC15x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y10E);
    dp->::ccc::CC15x6y10::~CC15x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y10E(Test__ZN3ccc9CC15x6y10E, "_ZN3ccc9CC15x6y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y10C1Ev();
extern void _ZN3ccc9CC15x6y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y10E[] = {
  NSPAIR(_ZN3ccc9CC15x6y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y10E[];
extern void _ZN3ccc9CC15x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc9CC15x6y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y10E[];
Class_Descriptor cd__ZN3ccc9CC15x6y10E = {  "_ZN3ccc9CC15x6y10E", // class name
  bases__ZN3ccc9CC15x6y10E, 2,
  &(vtc__ZN3ccc9CC15x6y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y11  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC15x6y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x6y113efgEv
  ~CC15x6y11(); // tgen
  CC15x6y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y11E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x6y113pqrEv");}
void  ccc::CC15x6y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x6y113efgEv");}
ccc::CC15x6y11 ::~CC15x6y11(){ note_dtor("_ZN3ccc9CC15x6y11E", this);} // tgen
ccc::CC15x6y11 ::CC15x6y11(){ note_ctor("_ZN3ccc9CC15x6y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y11E, buf);
    ::ccc::CC15x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y11E);
    dp->::ccc::CC15x6y11::~CC15x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y11E(Test__ZN3ccc9CC15x6y11E, "_ZN3ccc9CC15x6y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y11C1Ev();
extern void _ZN3ccc9CC15x6y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y11E[] = {
  NSPAIR(_ZN3ccc9CC15x6y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc9CC15x6y113efgEv();
extern void _ZN3ccc9CC15x6y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y11E[];
Class_Descriptor cd__ZN3ccc9CC15x6y11E = {  "_ZN3ccc9CC15x6y11E", // class name
  bases__ZN3ccc9CC15x6y11E, 2,
  &(vtc__ZN3ccc9CC15x6y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y12  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc9CC15x6y123abcEv
  ~CC15x6y12(); // tgen
  CC15x6y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y12E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x6y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x6y123abcEv");}
ccc::CC15x6y12 ::~CC15x6y12(){ note_dtor("_ZN3ccc9CC15x6y12E", this);} // tgen
ccc::CC15x6y12 ::CC15x6y12(){ note_ctor("_ZN3ccc9CC15x6y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y12E, buf);
    ::ccc::CC15x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y12E);
    dp->::ccc::CC15x6y12::~CC15x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y12E(Test__ZN3ccc9CC15x6y12E, "_ZN3ccc9CC15x6y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y12C1Ev();
extern void _ZN3ccc9CC15x6y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y12E[] = {
  NSPAIR(_ZN3ccc9CC15x6y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y12E[];
extern void _ZN3ccc9CC15x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y12E[];
Class_Descriptor cd__ZN3ccc9CC15x6y12E = {  "_ZN3ccc9CC15x6y12E", // class name
  bases__ZN3ccc9CC15x6y12E, 2,
  &(vtc__ZN3ccc9CC15x6y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y13  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc9CC15x6y133efgEv
  ~CC15x6y13(); // tgen
  CC15x6y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y13E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x6y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x6y133efgEv");}
ccc::CC15x6y13 ::~CC15x6y13(){ note_dtor("_ZN3ccc9CC15x6y13E", this);} // tgen
ccc::CC15x6y13 ::CC15x6y13(){ note_ctor("_ZN3ccc9CC15x6y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y13E, buf);
    ::ccc::CC15x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y13E);
    dp->::ccc::CC15x6y13::~CC15x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y13E(Test__ZN3ccc9CC15x6y13E, "_ZN3ccc9CC15x6y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y13C1Ev();
extern void _ZN3ccc9CC15x6y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y13E[] = {
  NSPAIR(_ZN3ccc9CC15x6y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc9CC15x6y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y13E[];
Class_Descriptor cd__ZN3ccc9CC15x6y13E = {  "_ZN3ccc9CC15x6y13E", // class name
  bases__ZN3ccc9CC15x6y13E, 2,
  &(vtc__ZN3ccc9CC15x6y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y14  : ::ccc::AA15 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc9CC15x6y143pqrEv
  ~CC15x6y14(); // tgen
  CC15x6y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y14E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x6y143pqrEv");}
ccc::CC15x6y14 ::~CC15x6y14(){ note_dtor("_ZN3ccc9CC15x6y14E", this);} // tgen
ccc::CC15x6y14 ::CC15x6y14(){ note_ctor("_ZN3ccc9CC15x6y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y14E, buf);
    ::ccc::CC15x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y14E);
    dp->::ccc::CC15x6y14::~CC15x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y14E(Test__ZN3ccc9CC15x6y14E, "_ZN3ccc9CC15x6y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y14C1Ev();
extern void _ZN3ccc9CC15x6y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y14E[] = {
  NSPAIR(_ZN3ccc9CC15x6y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc9CC15x6y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x6y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y14E[];
Class_Descriptor cd__ZN3ccc9CC15x6y14E = {  "_ZN3ccc9CC15x6y14E", // class name
  bases__ZN3ccc9CC15x6y14E, 2,
  &(vtc__ZN3ccc9CC15x6y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x6y15  : ::ccc::AA15 , ::ccc::BB6 {
  ~CC15x6y15(); // tgen
  CC15x6y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x6y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x6y15 ::~CC15x6y15(){ note_dtor("_ZN3ccc9CC15x6y15E", this);} // tgen
ccc::CC15x6y15 ::CC15x6y15(){ note_ctor("_ZN3ccc9CC15x6y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x6y15E, buf);
    ::ccc::CC15x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x6y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc9CC15x6y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x6y15E);
    dp->::ccc::CC15x6y15::~CC15x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x6y15E(Test__ZN3ccc9CC15x6y15E, "_ZN3ccc9CC15x6y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x6y15C1Ev();
extern void _ZN3ccc9CC15x6y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x6y15E[] = {
  NSPAIR(_ZN3ccc9CC15x6y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc9CC15x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB6E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x6y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x6y15E[];
Class_Descriptor cd__ZN3ccc9CC15x6y15E = {  "_ZN3ccc9CC15x6y15E", // class name
  bases__ZN3ccc9CC15x6y15E, 2,
  &(vtc__ZN3ccc9CC15x6y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x6y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y0  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC15x7y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x7y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y03pqrEv
  ~CC15x7y0(); // tgen
  CC15x7y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y0E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y03abcEv");}
void  ccc::CC15x7y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y03efgEv");}
void  ccc::CC15x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y03pqrEv");}
ccc::CC15x7y0 ::~CC15x7y0(){ note_dtor("_ZN3ccc8CC15x7y0E", this);} // tgen
ccc::CC15x7y0 ::CC15x7y0(){ note_ctor("_ZN3ccc8CC15x7y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y0E, buf);
    ::ccc::CC15x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y0E);
    dp->::ccc::CC15x7y0::~CC15x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y0E(Test__ZN3ccc8CC15x7y0E, "_ZN3ccc8CC15x7y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y0C1Ev();
extern void _ZN3ccc8CC15x7y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y0E[] = {
  NSPAIR(_ZN3ccc8CC15x7y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y0E[];
extern void _ZN3ccc8CC15x7y03abcEv();
extern void _ZN3ccc8CC15x7y03pqrEv();
extern void _ZN3ccc8CC15x7y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y0E[];
Class_Descriptor cd__ZN3ccc8CC15x7y0E = {  "_ZN3ccc8CC15x7y0E", // class name
  bases__ZN3ccc8CC15x7y0E, 2,
  &(vtc__ZN3ccc8CC15x7y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y1  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC15x7y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x7y13efgEv
  ~CC15x7y1(); // tgen
  CC15x7y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y1E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y13abcEv");}
void  ccc::CC15x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y13pqrEv");}
void  ccc::CC15x7y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y13efgEv");}
ccc::CC15x7y1 ::~CC15x7y1(){ note_dtor("_ZN3ccc8CC15x7y1E", this);} // tgen
ccc::CC15x7y1 ::CC15x7y1(){ note_ctor("_ZN3ccc8CC15x7y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y1E, buf);
    ::ccc::CC15x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y1E);
    dp->::ccc::CC15x7y1::~CC15x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y1E(Test__ZN3ccc8CC15x7y1E, "_ZN3ccc8CC15x7y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y1C1Ev();
extern void _ZN3ccc8CC15x7y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y1E[] = {
  NSPAIR(_ZN3ccc8CC15x7y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y1E[];
extern void _ZN3ccc8CC15x7y13abcEv();
extern void _ZN3ccc8CC15x7y13pqrEv();
extern void _ZN3ccc8CC15x7y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y1E[];
Class_Descriptor cd__ZN3ccc8CC15x7y1E = {  "_ZN3ccc8CC15x7y1E", // class name
  bases__ZN3ccc8CC15x7y1E, 2,
  &(vtc__ZN3ccc8CC15x7y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y2  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC15x7y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x7y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y23pqrEv
  ~CC15x7y2(); // tgen
  CC15x7y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y2E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y23efgEv");}
void  ccc::CC15x7y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y23abcEv");}
void  ccc::CC15x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y23pqrEv");}
ccc::CC15x7y2 ::~CC15x7y2(){ note_dtor("_ZN3ccc8CC15x7y2E", this);} // tgen
ccc::CC15x7y2 ::CC15x7y2(){ note_ctor("_ZN3ccc8CC15x7y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y2E, buf);
    ::ccc::CC15x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y2E);
    dp->::ccc::CC15x7y2::~CC15x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y2E(Test__ZN3ccc8CC15x7y2E, "_ZN3ccc8CC15x7y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y2C1Ev();
extern void _ZN3ccc8CC15x7y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y2E[] = {
  NSPAIR(_ZN3ccc8CC15x7y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y2E[];
extern void _ZN3ccc8CC15x7y23abcEv();
extern void _ZN3ccc8CC15x7y23pqrEv();
extern void _ZN3ccc8CC15x7y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y2E[];
Class_Descriptor cd__ZN3ccc8CC15x7y2E = {  "_ZN3ccc8CC15x7y2E", // class name
  bases__ZN3ccc8CC15x7y2E, 2,
  &(vtc__ZN3ccc8CC15x7y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y3  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC15x7y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x7y33abcEv
  ~CC15x7y3(); // tgen
  CC15x7y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y3E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y33efgEv");}
void  ccc::CC15x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y33pqrEv");}
void  ccc::CC15x7y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y33abcEv");}
ccc::CC15x7y3 ::~CC15x7y3(){ note_dtor("_ZN3ccc8CC15x7y3E", this);} // tgen
ccc::CC15x7y3 ::CC15x7y3(){ note_ctor("_ZN3ccc8CC15x7y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y3E, buf);
    ::ccc::CC15x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y3E);
    dp->::ccc::CC15x7y3::~CC15x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y3E(Test__ZN3ccc8CC15x7y3E, "_ZN3ccc8CC15x7y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y3C1Ev();
extern void _ZN3ccc8CC15x7y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y3E[] = {
  NSPAIR(_ZN3ccc8CC15x7y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y3E[];
extern void _ZN3ccc8CC15x7y33abcEv();
extern void _ZN3ccc8CC15x7y33pqrEv();
extern void _ZN3ccc8CC15x7y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y3E[];
Class_Descriptor cd__ZN3ccc8CC15x7y3E = {  "_ZN3ccc8CC15x7y3E", // class name
  bases__ZN3ccc8CC15x7y3E, 2,
  &(vtc__ZN3ccc8CC15x7y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y4  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC15x7y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x7y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x7y43efgEv
  ~CC15x7y4(); // tgen
  CC15x7y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y4E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y43pqrEv");}
void  ccc::CC15x7y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y43abcEv");}
void  ccc::CC15x7y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y43efgEv");}
ccc::CC15x7y4 ::~CC15x7y4(){ note_dtor("_ZN3ccc8CC15x7y4E", this);} // tgen
ccc::CC15x7y4 ::CC15x7y4(){ note_ctor("_ZN3ccc8CC15x7y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y4E, buf);
    ::ccc::CC15x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y4E);
    dp->::ccc::CC15x7y4::~CC15x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y4E(Test__ZN3ccc8CC15x7y4E, "_ZN3ccc8CC15x7y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y4C1Ev();
extern void _ZN3ccc8CC15x7y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y4E[] = {
  NSPAIR(_ZN3ccc8CC15x7y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y4E[];
extern void _ZN3ccc8CC15x7y43abcEv();
extern void _ZN3ccc8CC15x7y43pqrEv();
extern void _ZN3ccc8CC15x7y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y4E[];
Class_Descriptor cd__ZN3ccc8CC15x7y4E = {  "_ZN3ccc8CC15x7y4E", // class name
  bases__ZN3ccc8CC15x7y4E, 2,
  &(vtc__ZN3ccc8CC15x7y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y5  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC15x7y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x7y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x7y53abcEv
  ~CC15x7y5(); // tgen
  CC15x7y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y5E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y53pqrEv");}
void  ccc::CC15x7y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y53efgEv");}
void  ccc::CC15x7y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y53abcEv");}
ccc::CC15x7y5 ::~CC15x7y5(){ note_dtor("_ZN3ccc8CC15x7y5E", this);} // tgen
ccc::CC15x7y5 ::CC15x7y5(){ note_ctor("_ZN3ccc8CC15x7y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y5E, buf);
    ::ccc::CC15x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y5E);
    dp->::ccc::CC15x7y5::~CC15x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y5E(Test__ZN3ccc8CC15x7y5E, "_ZN3ccc8CC15x7y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y5C1Ev();
extern void _ZN3ccc8CC15x7y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y5E[] = {
  NSPAIR(_ZN3ccc8CC15x7y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y5E[];
extern void _ZN3ccc8CC15x7y53abcEv();
extern void _ZN3ccc8CC15x7y53pqrEv();
extern void _ZN3ccc8CC15x7y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y5E[];
Class_Descriptor cd__ZN3ccc8CC15x7y5E = {  "_ZN3ccc8CC15x7y5E", // class name
  bases__ZN3ccc8CC15x7y5E, 2,
  &(vtc__ZN3ccc8CC15x7y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y6  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC15x7y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x7y63efgEv
  ~CC15x7y6(); // tgen
  CC15x7y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y6E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y63abcEv");}
void  ccc::CC15x7y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y63efgEv");}
ccc::CC15x7y6 ::~CC15x7y6(){ note_dtor("_ZN3ccc8CC15x7y6E", this);} // tgen
ccc::CC15x7y6 ::CC15x7y6(){ note_ctor("_ZN3ccc8CC15x7y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y6E, buf);
    ::ccc::CC15x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y6E);
    dp->::ccc::CC15x7y6::~CC15x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y6E(Test__ZN3ccc8CC15x7y6E, "_ZN3ccc8CC15x7y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y6C1Ev();
extern void _ZN3ccc8CC15x7y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y6E[] = {
  NSPAIR(_ZN3ccc8CC15x7y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y6E[];
extern void _ZN3ccc8CC15x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC15x7y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y6E[];
Class_Descriptor cd__ZN3ccc8CC15x7y6E = {  "_ZN3ccc8CC15x7y6E", // class name
  bases__ZN3ccc8CC15x7y6E, 2,
  &(vtc__ZN3ccc8CC15x7y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y7  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC15x7y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y73pqrEv
  ~CC15x7y7(); // tgen
  CC15x7y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y7E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y73abcEv");}
void  ccc::CC15x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y73pqrEv");}
ccc::CC15x7y7 ::~CC15x7y7(){ note_dtor("_ZN3ccc8CC15x7y7E", this);} // tgen
ccc::CC15x7y7 ::CC15x7y7(){ note_ctor("_ZN3ccc8CC15x7y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y7E, buf);
    ::ccc::CC15x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y7E);
    dp->::ccc::CC15x7y7::~CC15x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y7E(Test__ZN3ccc8CC15x7y7E, "_ZN3ccc8CC15x7y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y7C1Ev();
extern void _ZN3ccc8CC15x7y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y7E[] = {
  NSPAIR(_ZN3ccc8CC15x7y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y7E[];
extern void _ZN3ccc8CC15x7y73abcEv();
extern void _ZN3ccc8CC15x7y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y7E[];
Class_Descriptor cd__ZN3ccc8CC15x7y7E = {  "_ZN3ccc8CC15x7y7E", // class name
  bases__ZN3ccc8CC15x7y7E, 2,
  &(vtc__ZN3ccc8CC15x7y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y8  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC15x7y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x7y83abcEv
  ~CC15x7y8(); // tgen
  CC15x7y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y8E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y83efgEv");}
void  ccc::CC15x7y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x7y83abcEv");}
ccc::CC15x7y8 ::~CC15x7y8(){ note_dtor("_ZN3ccc8CC15x7y8E", this);} // tgen
ccc::CC15x7y8 ::CC15x7y8(){ note_ctor("_ZN3ccc8CC15x7y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y8E, buf);
    ::ccc::CC15x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y8E);
    dp->::ccc::CC15x7y8::~CC15x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y8E(Test__ZN3ccc8CC15x7y8E, "_ZN3ccc8CC15x7y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y8C1Ev();
extern void _ZN3ccc8CC15x7y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y8E[] = {
  NSPAIR(_ZN3ccc8CC15x7y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y8E[];
extern void _ZN3ccc8CC15x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC15x7y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y8E[];
Class_Descriptor cd__ZN3ccc8CC15x7y8E = {  "_ZN3ccc8CC15x7y8E", // class name
  bases__ZN3ccc8CC15x7y8E, 2,
  &(vtc__ZN3ccc8CC15x7y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y9  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC15x7y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x7y93pqrEv
  ~CC15x7y9(); // tgen
  CC15x7y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x7y9E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x7y93efgEv");}
void  ccc::CC15x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x7y93pqrEv");}
ccc::CC15x7y9 ::~CC15x7y9(){ note_dtor("_ZN3ccc8CC15x7y9E", this);} // tgen
ccc::CC15x7y9 ::CC15x7y9(){ note_ctor("_ZN3ccc8CC15x7y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x7y9E, buf);
    ::ccc::CC15x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x7y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC15x7y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x7y9E);
    dp->::ccc::CC15x7y9::~CC15x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x7y9E(Test__ZN3ccc8CC15x7y9E, "_ZN3ccc8CC15x7y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x7y9C1Ev();
extern void _ZN3ccc8CC15x7y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x7y9E[] = {
  NSPAIR(_ZN3ccc8CC15x7y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC15x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC15x7y93pqrEv();
extern void _ZN3ccc8CC15x7y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x7y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x7y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x7y9E[];
Class_Descriptor cd__ZN3ccc8CC15x7y9E = {  "_ZN3ccc8CC15x7y9E", // class name
  bases__ZN3ccc8CC15x7y9E, 2,
  &(vtc__ZN3ccc8CC15x7y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x7y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y10  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC15x7y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x7y103abcEv
  ~CC15x7y10(); // tgen
  CC15x7y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y10E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x7y103pqrEv");}
void  ccc::CC15x7y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x7y103abcEv");}
ccc::CC15x7y10 ::~CC15x7y10(){ note_dtor("_ZN3ccc9CC15x7y10E", this);} // tgen
ccc::CC15x7y10 ::CC15x7y10(){ note_ctor("_ZN3ccc9CC15x7y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y10E, buf);
    ::ccc::CC15x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y10E);
    dp->::ccc::CC15x7y10::~CC15x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y10E(Test__ZN3ccc9CC15x7y10E, "_ZN3ccc9CC15x7y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y10C1Ev();
extern void _ZN3ccc9CC15x7y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y10E[] = {
  NSPAIR(_ZN3ccc9CC15x7y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y10E[];
extern void _ZN3ccc9CC15x7y103abcEv();
extern void _ZN3ccc9CC15x7y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y10E[];
Class_Descriptor cd__ZN3ccc9CC15x7y10E = {  "_ZN3ccc9CC15x7y10E", // class name
  bases__ZN3ccc9CC15x7y10E, 2,
  &(vtc__ZN3ccc9CC15x7y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y11  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC15x7y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x7y113efgEv
  ~CC15x7y11(); // tgen
  CC15x7y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y11E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x7y113pqrEv");}
void  ccc::CC15x7y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x7y113efgEv");}
ccc::CC15x7y11 ::~CC15x7y11(){ note_dtor("_ZN3ccc9CC15x7y11E", this);} // tgen
ccc::CC15x7y11 ::CC15x7y11(){ note_ctor("_ZN3ccc9CC15x7y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y11E, buf);
    ::ccc::CC15x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y11E);
    dp->::ccc::CC15x7y11::~CC15x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y11E(Test__ZN3ccc9CC15x7y11E, "_ZN3ccc9CC15x7y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y11C1Ev();
extern void _ZN3ccc9CC15x7y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y11E[] = {
  NSPAIR(_ZN3ccc9CC15x7y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc9CC15x7y113pqrEv();
extern void _ZN3ccc9CC15x7y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y11E[];
Class_Descriptor cd__ZN3ccc9CC15x7y11E = {  "_ZN3ccc9CC15x7y11E", // class name
  bases__ZN3ccc9CC15x7y11E, 2,
  &(vtc__ZN3ccc9CC15x7y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y12  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc9CC15x7y123abcEv
  ~CC15x7y12(); // tgen
  CC15x7y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y12E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x7y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x7y123abcEv");}
ccc::CC15x7y12 ::~CC15x7y12(){ note_dtor("_ZN3ccc9CC15x7y12E", this);} // tgen
ccc::CC15x7y12 ::CC15x7y12(){ note_ctor("_ZN3ccc9CC15x7y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y12E, buf);
    ::ccc::CC15x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y12E);
    dp->::ccc::CC15x7y12::~CC15x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y12E(Test__ZN3ccc9CC15x7y12E, "_ZN3ccc9CC15x7y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y12C1Ev();
extern void _ZN3ccc9CC15x7y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y12E[] = {
  NSPAIR(_ZN3ccc9CC15x7y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y12E[];
extern void _ZN3ccc9CC15x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y12E[];
Class_Descriptor cd__ZN3ccc9CC15x7y12E = {  "_ZN3ccc9CC15x7y12E", // class name
  bases__ZN3ccc9CC15x7y12E, 2,
  &(vtc__ZN3ccc9CC15x7y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y13  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc9CC15x7y133efgEv
  ~CC15x7y13(); // tgen
  CC15x7y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y13E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x7y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x7y133efgEv");}
ccc::CC15x7y13 ::~CC15x7y13(){ note_dtor("_ZN3ccc9CC15x7y13E", this);} // tgen
ccc::CC15x7y13 ::CC15x7y13(){ note_ctor("_ZN3ccc9CC15x7y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y13E, buf);
    ::ccc::CC15x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y13E);
    dp->::ccc::CC15x7y13::~CC15x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y13E(Test__ZN3ccc9CC15x7y13E, "_ZN3ccc9CC15x7y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y13C1Ev();
extern void _ZN3ccc9CC15x7y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y13E[] = {
  NSPAIR(_ZN3ccc9CC15x7y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc9CC15x7y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y13E[];
Class_Descriptor cd__ZN3ccc9CC15x7y13E = {  "_ZN3ccc9CC15x7y13E", // class name
  bases__ZN3ccc9CC15x7y13E, 2,
  &(vtc__ZN3ccc9CC15x7y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y14  : ::ccc::AA15 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc9CC15x7y143pqrEv
  ~CC15x7y14(); // tgen
  CC15x7y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y14E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x7y143pqrEv");}
ccc::CC15x7y14 ::~CC15x7y14(){ note_dtor("_ZN3ccc9CC15x7y14E", this);} // tgen
ccc::CC15x7y14 ::CC15x7y14(){ note_ctor("_ZN3ccc9CC15x7y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y14E, buf);
    ::ccc::CC15x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y14E);
    dp->::ccc::CC15x7y14::~CC15x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y14E(Test__ZN3ccc9CC15x7y14E, "_ZN3ccc9CC15x7y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y14C1Ev();
extern void _ZN3ccc9CC15x7y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y14E[] = {
  NSPAIR(_ZN3ccc9CC15x7y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc9CC15x7y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x7y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y14E[];
Class_Descriptor cd__ZN3ccc9CC15x7y14E = {  "_ZN3ccc9CC15x7y14E", // class name
  bases__ZN3ccc9CC15x7y14E, 2,
  &(vtc__ZN3ccc9CC15x7y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x7y15  : ::ccc::AA15 , ::ccc::BB7 {
  ~CC15x7y15(); // tgen
  CC15x7y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x7y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x7y15 ::~CC15x7y15(){ note_dtor("_ZN3ccc9CC15x7y15E", this);} // tgen
ccc::CC15x7y15 ::CC15x7y15(){ note_ctor("_ZN3ccc9CC15x7y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x7y15E, buf);
    ::ccc::CC15x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x7y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc9CC15x7y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x7y15E);
    dp->::ccc::CC15x7y15::~CC15x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x7y15E(Test__ZN3ccc9CC15x7y15E, "_ZN3ccc9CC15x7y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x7y15C1Ev();
extern void _ZN3ccc9CC15x7y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x7y15E[] = {
  NSPAIR(_ZN3ccc9CC15x7y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc9CC15x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB7E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x7y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x7y15E[];
Class_Descriptor cd__ZN3ccc9CC15x7y15E = {  "_ZN3ccc9CC15x7y15E", // class name
  bases__ZN3ccc9CC15x7y15E, 2,
  &(vtc__ZN3ccc9CC15x7y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x7y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y0  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC15x8y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x8y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y03pqrEv
  ~CC15x8y0(); // tgen
  CC15x8y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y0E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y03abcEv");}
void  ccc::CC15x8y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y03efgEv");}
void  ccc::CC15x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y03pqrEv");}
ccc::CC15x8y0 ::~CC15x8y0(){ note_dtor("_ZN3ccc8CC15x8y0E", this);} // tgen
ccc::CC15x8y0 ::CC15x8y0(){ note_ctor("_ZN3ccc8CC15x8y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y0E, buf);
    ::ccc::CC15x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y0E);
    dp->::ccc::CC15x8y0::~CC15x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y0E(Test__ZN3ccc8CC15x8y0E, "_ZN3ccc8CC15x8y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y0C1Ev();
extern void _ZN3ccc8CC15x8y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y0E[] = {
  NSPAIR(_ZN3ccc8CC15x8y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y0E[];
extern void _ZN3ccc8CC15x8y03efgEv();
extern void _ZN3ccc8CC15x8y03abcEv();
extern void _ZN3ccc8CC15x8y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y0E[];
Class_Descriptor cd__ZN3ccc8CC15x8y0E = {  "_ZN3ccc8CC15x8y0E", // class name
  bases__ZN3ccc8CC15x8y0E, 2,
  &(vtc__ZN3ccc8CC15x8y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y1  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC15x8y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x8y13efgEv
  ~CC15x8y1(); // tgen
  CC15x8y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y1E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y13abcEv");}
void  ccc::CC15x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y13pqrEv");}
void  ccc::CC15x8y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y13efgEv");}
ccc::CC15x8y1 ::~CC15x8y1(){ note_dtor("_ZN3ccc8CC15x8y1E", this);} // tgen
ccc::CC15x8y1 ::CC15x8y1(){ note_ctor("_ZN3ccc8CC15x8y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y1E, buf);
    ::ccc::CC15x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y1E);
    dp->::ccc::CC15x8y1::~CC15x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y1E(Test__ZN3ccc8CC15x8y1E, "_ZN3ccc8CC15x8y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y1C1Ev();
extern void _ZN3ccc8CC15x8y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y1E[] = {
  NSPAIR(_ZN3ccc8CC15x8y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y1E[];
extern void _ZN3ccc8CC15x8y13efgEv();
extern void _ZN3ccc8CC15x8y13abcEv();
extern void _ZN3ccc8CC15x8y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y1E[];
Class_Descriptor cd__ZN3ccc8CC15x8y1E = {  "_ZN3ccc8CC15x8y1E", // class name
  bases__ZN3ccc8CC15x8y1E, 2,
  &(vtc__ZN3ccc8CC15x8y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y2  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC15x8y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x8y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y23pqrEv
  ~CC15x8y2(); // tgen
  CC15x8y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y2E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y23efgEv");}
void  ccc::CC15x8y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y23abcEv");}
void  ccc::CC15x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y23pqrEv");}
ccc::CC15x8y2 ::~CC15x8y2(){ note_dtor("_ZN3ccc8CC15x8y2E", this);} // tgen
ccc::CC15x8y2 ::CC15x8y2(){ note_ctor("_ZN3ccc8CC15x8y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y2E, buf);
    ::ccc::CC15x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y2E);
    dp->::ccc::CC15x8y2::~CC15x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y2E(Test__ZN3ccc8CC15x8y2E, "_ZN3ccc8CC15x8y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y2C1Ev();
extern void _ZN3ccc8CC15x8y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y2E[] = {
  NSPAIR(_ZN3ccc8CC15x8y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y2E[];
extern void _ZN3ccc8CC15x8y23efgEv();
extern void _ZN3ccc8CC15x8y23abcEv();
extern void _ZN3ccc8CC15x8y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y2E[];
Class_Descriptor cd__ZN3ccc8CC15x8y2E = {  "_ZN3ccc8CC15x8y2E", // class name
  bases__ZN3ccc8CC15x8y2E, 2,
  &(vtc__ZN3ccc8CC15x8y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y3  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC15x8y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x8y33abcEv
  ~CC15x8y3(); // tgen
  CC15x8y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y3E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y33efgEv");}
void  ccc::CC15x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y33pqrEv");}
void  ccc::CC15x8y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y33abcEv");}
ccc::CC15x8y3 ::~CC15x8y3(){ note_dtor("_ZN3ccc8CC15x8y3E", this);} // tgen
ccc::CC15x8y3 ::CC15x8y3(){ note_ctor("_ZN3ccc8CC15x8y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y3E, buf);
    ::ccc::CC15x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y3E);
    dp->::ccc::CC15x8y3::~CC15x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y3E(Test__ZN3ccc8CC15x8y3E, "_ZN3ccc8CC15x8y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y3C1Ev();
extern void _ZN3ccc8CC15x8y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y3E[] = {
  NSPAIR(_ZN3ccc8CC15x8y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y3E[];
extern void _ZN3ccc8CC15x8y33efgEv();
extern void _ZN3ccc8CC15x8y33abcEv();
extern void _ZN3ccc8CC15x8y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y3E[];
Class_Descriptor cd__ZN3ccc8CC15x8y3E = {  "_ZN3ccc8CC15x8y3E", // class name
  bases__ZN3ccc8CC15x8y3E, 2,
  &(vtc__ZN3ccc8CC15x8y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y4  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC15x8y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x8y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x8y43efgEv
  ~CC15x8y4(); // tgen
  CC15x8y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y4E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y43pqrEv");}
void  ccc::CC15x8y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y43abcEv");}
void  ccc::CC15x8y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y43efgEv");}
ccc::CC15x8y4 ::~CC15x8y4(){ note_dtor("_ZN3ccc8CC15x8y4E", this);} // tgen
ccc::CC15x8y4 ::CC15x8y4(){ note_ctor("_ZN3ccc8CC15x8y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y4E, buf);
    ::ccc::CC15x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y4E);
    dp->::ccc::CC15x8y4::~CC15x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y4E(Test__ZN3ccc8CC15x8y4E, "_ZN3ccc8CC15x8y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y4C1Ev();
extern void _ZN3ccc8CC15x8y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y4E[] = {
  NSPAIR(_ZN3ccc8CC15x8y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y4E[];
extern void _ZN3ccc8CC15x8y43efgEv();
extern void _ZN3ccc8CC15x8y43abcEv();
extern void _ZN3ccc8CC15x8y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y43pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y4E[];
Class_Descriptor cd__ZN3ccc8CC15x8y4E = {  "_ZN3ccc8CC15x8y4E", // class name
  bases__ZN3ccc8CC15x8y4E, 2,
  &(vtc__ZN3ccc8CC15x8y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y5  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC15x8y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x8y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x8y53abcEv
  ~CC15x8y5(); // tgen
  CC15x8y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y5E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y53pqrEv");}
void  ccc::CC15x8y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y53efgEv");}
void  ccc::CC15x8y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y53abcEv");}
ccc::CC15x8y5 ::~CC15x8y5(){ note_dtor("_ZN3ccc8CC15x8y5E", this);} // tgen
ccc::CC15x8y5 ::CC15x8y5(){ note_ctor("_ZN3ccc8CC15x8y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y5E, buf);
    ::ccc::CC15x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y5E);
    dp->::ccc::CC15x8y5::~CC15x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y5E(Test__ZN3ccc8CC15x8y5E, "_ZN3ccc8CC15x8y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y5C1Ev();
extern void _ZN3ccc8CC15x8y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y5E[] = {
  NSPAIR(_ZN3ccc8CC15x8y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y5E[];
extern void _ZN3ccc8CC15x8y53efgEv();
extern void _ZN3ccc8CC15x8y53abcEv();
extern void _ZN3ccc8CC15x8y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y53pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y5E[];
Class_Descriptor cd__ZN3ccc8CC15x8y5E = {  "_ZN3ccc8CC15x8y5E", // class name
  bases__ZN3ccc8CC15x8y5E, 2,
  &(vtc__ZN3ccc8CC15x8y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y6  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC15x8y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x8y63efgEv
  ~CC15x8y6(); // tgen
  CC15x8y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y6E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y63abcEv");}
void  ccc::CC15x8y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y63efgEv");}
ccc::CC15x8y6 ::~CC15x8y6(){ note_dtor("_ZN3ccc8CC15x8y6E", this);} // tgen
ccc::CC15x8y6 ::CC15x8y6(){ note_ctor("_ZN3ccc8CC15x8y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y6E, buf);
    ::ccc::CC15x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y6E);
    dp->::ccc::CC15x8y6::~CC15x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y6E(Test__ZN3ccc8CC15x8y6E, "_ZN3ccc8CC15x8y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y6C1Ev();
extern void _ZN3ccc8CC15x8y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y6E[] = {
  NSPAIR(_ZN3ccc8CC15x8y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y6E[];
extern void _ZN3ccc8CC15x8y63efgEv();
extern void _ZN3ccc8CC15x8y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y6E[];
Class_Descriptor cd__ZN3ccc8CC15x8y6E = {  "_ZN3ccc8CC15x8y6E", // class name
  bases__ZN3ccc8CC15x8y6E, 2,
  &(vtc__ZN3ccc8CC15x8y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y7  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC15x8y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y73pqrEv
  ~CC15x8y7(); // tgen
  CC15x8y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y7E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y73abcEv");}
void  ccc::CC15x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y73pqrEv");}
ccc::CC15x8y7 ::~CC15x8y7(){ note_dtor("_ZN3ccc8CC15x8y7E", this);} // tgen
ccc::CC15x8y7 ::CC15x8y7(){ note_ctor("_ZN3ccc8CC15x8y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y7E, buf);
    ::ccc::CC15x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y7E);
    dp->::ccc::CC15x8y7::~CC15x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y7E(Test__ZN3ccc8CC15x8y7E, "_ZN3ccc8CC15x8y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y7C1Ev();
extern void _ZN3ccc8CC15x8y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y7E[] = {
  NSPAIR(_ZN3ccc8CC15x8y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC15x8y73abcEv();
extern void _ZN3ccc8CC15x8y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y7E[];
Class_Descriptor cd__ZN3ccc8CC15x8y7E = {  "_ZN3ccc8CC15x8y7E", // class name
  bases__ZN3ccc8CC15x8y7E, 2,
  &(vtc__ZN3ccc8CC15x8y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y8  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC15x8y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x8y83abcEv
  ~CC15x8y8(); // tgen
  CC15x8y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y8E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y83efgEv");}
void  ccc::CC15x8y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x8y83abcEv");}
ccc::CC15x8y8 ::~CC15x8y8(){ note_dtor("_ZN3ccc8CC15x8y8E", this);} // tgen
ccc::CC15x8y8 ::CC15x8y8(){ note_ctor("_ZN3ccc8CC15x8y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y8E, buf);
    ::ccc::CC15x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y8E);
    dp->::ccc::CC15x8y8::~CC15x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y8E(Test__ZN3ccc8CC15x8y8E, "_ZN3ccc8CC15x8y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y8C1Ev();
extern void _ZN3ccc8CC15x8y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y8E[] = {
  NSPAIR(_ZN3ccc8CC15x8y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y8E[];
extern void _ZN3ccc8CC15x8y83efgEv();
extern void _ZN3ccc8CC15x8y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y8E[];
Class_Descriptor cd__ZN3ccc8CC15x8y8E = {  "_ZN3ccc8CC15x8y8E", // class name
  bases__ZN3ccc8CC15x8y8E, 2,
  &(vtc__ZN3ccc8CC15x8y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y9  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC15x8y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x8y93pqrEv
  ~CC15x8y9(); // tgen
  CC15x8y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x8y9E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x8y93efgEv");}
void  ccc::CC15x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x8y93pqrEv");}
ccc::CC15x8y9 ::~CC15x8y9(){ note_dtor("_ZN3ccc8CC15x8y9E", this);} // tgen
ccc::CC15x8y9 ::CC15x8y9(){ note_ctor("_ZN3ccc8CC15x8y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x8y9E, buf);
    ::ccc::CC15x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x8y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC15x8y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x8y9E);
    dp->::ccc::CC15x8y9::~CC15x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x8y9E(Test__ZN3ccc8CC15x8y9E, "_ZN3ccc8CC15x8y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x8y9C1Ev();
extern void _ZN3ccc8CC15x8y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x8y9E[] = {
  NSPAIR(_ZN3ccc8CC15x8y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC15x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y9E[];
extern void _ZN3ccc8CC15x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC15x8y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x8y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x8y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x8y9E[];
Class_Descriptor cd__ZN3ccc8CC15x8y9E = {  "_ZN3ccc8CC15x8y9E", // class name
  bases__ZN3ccc8CC15x8y9E, 2,
  &(vtc__ZN3ccc8CC15x8y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x8y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y10  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC15x8y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x8y103abcEv
  ~CC15x8y10(); // tgen
  CC15x8y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y10E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x8y103pqrEv");}
void  ccc::CC15x8y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x8y103abcEv");}
ccc::CC15x8y10 ::~CC15x8y10(){ note_dtor("_ZN3ccc9CC15x8y10E", this);} // tgen
ccc::CC15x8y10 ::CC15x8y10(){ note_ctor("_ZN3ccc9CC15x8y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y10E, buf);
    ::ccc::CC15x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y10E);
    dp->::ccc::CC15x8y10::~CC15x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y10E(Test__ZN3ccc9CC15x8y10E, "_ZN3ccc9CC15x8y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y10C1Ev();
extern void _ZN3ccc9CC15x8y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y10E[] = {
  NSPAIR(_ZN3ccc9CC15x8y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc9CC15x8y103abcEv();
extern void _ZN3ccc9CC15x8y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y10E[];
Class_Descriptor cd__ZN3ccc9CC15x8y10E = {  "_ZN3ccc9CC15x8y10E", // class name
  bases__ZN3ccc9CC15x8y10E, 2,
  &(vtc__ZN3ccc9CC15x8y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y11  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC15x8y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x8y113efgEv
  ~CC15x8y11(); // tgen
  CC15x8y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y11E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x8y113pqrEv");}
void  ccc::CC15x8y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x8y113efgEv");}
ccc::CC15x8y11 ::~CC15x8y11(){ note_dtor("_ZN3ccc9CC15x8y11E", this);} // tgen
ccc::CC15x8y11 ::CC15x8y11(){ note_ctor("_ZN3ccc9CC15x8y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y11E, buf);
    ::ccc::CC15x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y11E);
    dp->::ccc::CC15x8y11::~CC15x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y11E(Test__ZN3ccc9CC15x8y11E, "_ZN3ccc9CC15x8y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y11C1Ev();
extern void _ZN3ccc9CC15x8y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y11E[] = {
  NSPAIR(_ZN3ccc9CC15x8y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y11E[];
extern void _ZN3ccc9CC15x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc9CC15x8y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y11E[];
Class_Descriptor cd__ZN3ccc9CC15x8y11E = {  "_ZN3ccc9CC15x8y11E", // class name
  bases__ZN3ccc9CC15x8y11E, 2,
  &(vtc__ZN3ccc9CC15x8y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y12  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc9CC15x8y123abcEv
  ~CC15x8y12(); // tgen
  CC15x8y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y12E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x8y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x8y123abcEv");}
ccc::CC15x8y12 ::~CC15x8y12(){ note_dtor("_ZN3ccc9CC15x8y12E", this);} // tgen
ccc::CC15x8y12 ::CC15x8y12(){ note_ctor("_ZN3ccc9CC15x8y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y12E, buf);
    ::ccc::CC15x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y12E);
    dp->::ccc::CC15x8y12::~CC15x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y12E(Test__ZN3ccc9CC15x8y12E, "_ZN3ccc9CC15x8y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y12C1Ev();
extern void _ZN3ccc9CC15x8y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y12E[] = {
  NSPAIR(_ZN3ccc9CC15x8y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc9CC15x8y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y12E[];
Class_Descriptor cd__ZN3ccc9CC15x8y12E = {  "_ZN3ccc9CC15x8y12E", // class name
  bases__ZN3ccc9CC15x8y12E, 2,
  &(vtc__ZN3ccc9CC15x8y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y13  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc9CC15x8y133efgEv
  ~CC15x8y13(); // tgen
  CC15x8y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y13E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x8y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x8y133efgEv");}
ccc::CC15x8y13 ::~CC15x8y13(){ note_dtor("_ZN3ccc9CC15x8y13E", this);} // tgen
ccc::CC15x8y13 ::CC15x8y13(){ note_ctor("_ZN3ccc9CC15x8y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y13E, buf);
    ::ccc::CC15x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y13E);
    dp->::ccc::CC15x8y13::~CC15x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y13E(Test__ZN3ccc9CC15x8y13E, "_ZN3ccc9CC15x8y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y13C1Ev();
extern void _ZN3ccc9CC15x8y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y13E[] = {
  NSPAIR(_ZN3ccc9CC15x8y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y13E[];
extern void _ZN3ccc9CC15x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y13E[];
Class_Descriptor cd__ZN3ccc9CC15x8y13E = {  "_ZN3ccc9CC15x8y13E", // class name
  bases__ZN3ccc9CC15x8y13E, 2,
  &(vtc__ZN3ccc9CC15x8y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y14  : ::ccc::AA15 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc9CC15x8y143pqrEv
  ~CC15x8y14(); // tgen
  CC15x8y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y14E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x8y143pqrEv");}
ccc::CC15x8y14 ::~CC15x8y14(){ note_dtor("_ZN3ccc9CC15x8y14E", this);} // tgen
ccc::CC15x8y14 ::CC15x8y14(){ note_ctor("_ZN3ccc9CC15x8y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y14E, buf);
    ::ccc::CC15x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y14E);
    dp->::ccc::CC15x8y14::~CC15x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y14E(Test__ZN3ccc9CC15x8y14E, "_ZN3ccc9CC15x8y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y14C1Ev();
extern void _ZN3ccc9CC15x8y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y14E[] = {
  NSPAIR(_ZN3ccc9CC15x8y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc9CC15x8y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x8y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y14E[];
Class_Descriptor cd__ZN3ccc9CC15x8y14E = {  "_ZN3ccc9CC15x8y14E", // class name
  bases__ZN3ccc9CC15x8y14E, 2,
  &(vtc__ZN3ccc9CC15x8y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y14E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x8y15  : ::ccc::AA15 , ::ccc::BB8 {
  ~CC15x8y15(); // tgen
  CC15x8y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x8y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x8y15 ::~CC15x8y15(){ note_dtor("_ZN3ccc9CC15x8y15E", this);} // tgen
ccc::CC15x8y15 ::CC15x8y15(){ note_ctor("_ZN3ccc9CC15x8y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x8y15E, buf);
    ::ccc::CC15x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x8y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc9CC15x8y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x8y15E);
    dp->::ccc::CC15x8y15::~CC15x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x8y15E(Test__ZN3ccc9CC15x8y15E, "_ZN3ccc9CC15x8y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x8y15C1Ev();
extern void _ZN3ccc9CC15x8y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x8y15E[] = {
  NSPAIR(_ZN3ccc9CC15x8y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc9CC15x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB8E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x8y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x8y15E[];
Class_Descriptor cd__ZN3ccc9CC15x8y15E = {  "_ZN3ccc9CC15x8y15E", // class name
  bases__ZN3ccc9CC15x8y15E, 2,
  &(vtc__ZN3ccc9CC15x8y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x8y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y0  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC15x9y03abcEv
  virtual void  efg(); // _ZN3ccc8CC15x9y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y03pqrEv
  ~CC15x9y0(); // tgen
  CC15x9y0(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y0E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y03abcEv");}
void  ccc::CC15x9y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y03efgEv");}
void  ccc::CC15x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y03pqrEv");}
ccc::CC15x9y0 ::~CC15x9y0(){ note_dtor("_ZN3ccc8CC15x9y0E", this);} // tgen
ccc::CC15x9y0 ::CC15x9y0(){ note_ctor("_ZN3ccc8CC15x9y0E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y0E, buf);
    ::ccc::CC15x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y0E);
    dp->::ccc::CC15x9y0::~CC15x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y0E(Test__ZN3ccc8CC15x9y0E, "_ZN3ccc8CC15x9y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y0C1Ev();
extern void _ZN3ccc8CC15x9y0D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y0E[] = {
  NSPAIR(_ZN3ccc8CC15x9y0C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y0E[];
extern void _ZN3ccc8CC15x9y03efgEv();
extern void _ZN3ccc8CC15x9y03pqrEv();
extern void _ZN3ccc8CC15x9y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y0E[];
Class_Descriptor cd__ZN3ccc8CC15x9y0E = {  "_ZN3ccc8CC15x9y0E", // class name
  bases__ZN3ccc8CC15x9y0E, 2,
  &(vtc__ZN3ccc8CC15x9y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y1  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC15x9y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x9y13efgEv
  ~CC15x9y1(); // tgen
  CC15x9y1(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y1E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y13abcEv");}
void  ccc::CC15x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y13pqrEv");}
void  ccc::CC15x9y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y13efgEv");}
ccc::CC15x9y1 ::~CC15x9y1(){ note_dtor("_ZN3ccc8CC15x9y1E", this);} // tgen
ccc::CC15x9y1 ::CC15x9y1(){ note_ctor("_ZN3ccc8CC15x9y1E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y1E, buf);
    ::ccc::CC15x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y1E);
    dp->::ccc::CC15x9y1::~CC15x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y1E(Test__ZN3ccc8CC15x9y1E, "_ZN3ccc8CC15x9y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y1C1Ev();
extern void _ZN3ccc8CC15x9y1D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y1E[] = {
  NSPAIR(_ZN3ccc8CC15x9y1C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y1E[];
extern void _ZN3ccc8CC15x9y13efgEv();
extern void _ZN3ccc8CC15x9y13pqrEv();
extern void _ZN3ccc8CC15x9y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y1E[];
Class_Descriptor cd__ZN3ccc8CC15x9y1E = {  "_ZN3ccc8CC15x9y1E", // class name
  bases__ZN3ccc8CC15x9y1E, 2,
  &(vtc__ZN3ccc8CC15x9y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y2  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC15x9y23efgEv
  virtual void  abc(); // _ZN3ccc8CC15x9y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y23pqrEv
  ~CC15x9y2(); // tgen
  CC15x9y2(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y2E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y23efgEv");}
void  ccc::CC15x9y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y23abcEv");}
void  ccc::CC15x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y23pqrEv");}
ccc::CC15x9y2 ::~CC15x9y2(){ note_dtor("_ZN3ccc8CC15x9y2E", this);} // tgen
ccc::CC15x9y2 ::CC15x9y2(){ note_ctor("_ZN3ccc8CC15x9y2E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y2E, buf);
    ::ccc::CC15x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y2E);
    dp->::ccc::CC15x9y2::~CC15x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y2E(Test__ZN3ccc8CC15x9y2E, "_ZN3ccc8CC15x9y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y2C1Ev();
extern void _ZN3ccc8CC15x9y2D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y2E[] = {
  NSPAIR(_ZN3ccc8CC15x9y2C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y2E[];
extern void _ZN3ccc8CC15x9y23efgEv();
extern void _ZN3ccc8CC15x9y23pqrEv();
extern void _ZN3ccc8CC15x9y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y2E[];
Class_Descriptor cd__ZN3ccc8CC15x9y2E = {  "_ZN3ccc8CC15x9y2E", // class name
  bases__ZN3ccc8CC15x9y2E, 2,
  &(vtc__ZN3ccc8CC15x9y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y3  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC15x9y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x9y33abcEv
  ~CC15x9y3(); // tgen
  CC15x9y3(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y3E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y33efgEv");}
void  ccc::CC15x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y33pqrEv");}
void  ccc::CC15x9y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y33abcEv");}
ccc::CC15x9y3 ::~CC15x9y3(){ note_dtor("_ZN3ccc8CC15x9y3E", this);} // tgen
ccc::CC15x9y3 ::CC15x9y3(){ note_ctor("_ZN3ccc8CC15x9y3E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y3E, buf);
    ::ccc::CC15x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y3E);
    dp->::ccc::CC15x9y3::~CC15x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y3E(Test__ZN3ccc8CC15x9y3E, "_ZN3ccc8CC15x9y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y3C1Ev();
extern void _ZN3ccc8CC15x9y3D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y3E[] = {
  NSPAIR(_ZN3ccc8CC15x9y3C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y3E[];
extern void _ZN3ccc8CC15x9y33efgEv();
extern void _ZN3ccc8CC15x9y33pqrEv();
extern void _ZN3ccc8CC15x9y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y3E[];
Class_Descriptor cd__ZN3ccc8CC15x9y3E = {  "_ZN3ccc8CC15x9y3E", // class name
  bases__ZN3ccc8CC15x9y3E, 2,
  &(vtc__ZN3ccc8CC15x9y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y4  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC15x9y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC15x9y43abcEv
  virtual void  efg(); // _ZN3ccc8CC15x9y43efgEv
  ~CC15x9y4(); // tgen
  CC15x9y4(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y4E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y43pqrEv");}
void  ccc::CC15x9y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y43abcEv");}
void  ccc::CC15x9y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y43efgEv");}
ccc::CC15x9y4 ::~CC15x9y4(){ note_dtor("_ZN3ccc8CC15x9y4E", this);} // tgen
ccc::CC15x9y4 ::CC15x9y4(){ note_ctor("_ZN3ccc8CC15x9y4E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y4E, buf);
    ::ccc::CC15x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y4E);
    dp->::ccc::CC15x9y4::~CC15x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y4E(Test__ZN3ccc8CC15x9y4E, "_ZN3ccc8CC15x9y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y4C1Ev();
extern void _ZN3ccc8CC15x9y4D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y4E[] = {
  NSPAIR(_ZN3ccc8CC15x9y4C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y4E[];
extern void _ZN3ccc8CC15x9y43efgEv();
extern void _ZN3ccc8CC15x9y43pqrEv();
extern void _ZN3ccc8CC15x9y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y4E[];
Class_Descriptor cd__ZN3ccc8CC15x9y4E = {  "_ZN3ccc8CC15x9y4E", // class name
  bases__ZN3ccc8CC15x9y4E, 2,
  &(vtc__ZN3ccc8CC15x9y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y5  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC15x9y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC15x9y53efgEv
  virtual void  abc(); // _ZN3ccc8CC15x9y53abcEv
  ~CC15x9y5(); // tgen
  CC15x9y5(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y5E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y53pqrEv");}
void  ccc::CC15x9y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y53efgEv");}
void  ccc::CC15x9y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y53abcEv");}
ccc::CC15x9y5 ::~CC15x9y5(){ note_dtor("_ZN3ccc8CC15x9y5E", this);} // tgen
ccc::CC15x9y5 ::CC15x9y5(){ note_ctor("_ZN3ccc8CC15x9y5E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y5E, buf);
    ::ccc::CC15x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y5E);
    dp->::ccc::CC15x9y5::~CC15x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y5E(Test__ZN3ccc8CC15x9y5E, "_ZN3ccc8CC15x9y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y5C1Ev();
extern void _ZN3ccc8CC15x9y5D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y5E[] = {
  NSPAIR(_ZN3ccc8CC15x9y5C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y5E[];
extern void _ZN3ccc8CC15x9y53efgEv();
extern void _ZN3ccc8CC15x9y53pqrEv();
extern void _ZN3ccc8CC15x9y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y5E[];
Class_Descriptor cd__ZN3ccc8CC15x9y5E = {  "_ZN3ccc8CC15x9y5E", // class name
  bases__ZN3ccc8CC15x9y5E, 2,
  &(vtc__ZN3ccc8CC15x9y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y6  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC15x9y63abcEv
  virtual void  efg(); // _ZN3ccc8CC15x9y63efgEv
  ~CC15x9y6(); // tgen
  CC15x9y6(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y6E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y63abcEv");}
void  ccc::CC15x9y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y63efgEv");}
ccc::CC15x9y6 ::~CC15x9y6(){ note_dtor("_ZN3ccc8CC15x9y6E", this);} // tgen
ccc::CC15x9y6 ::CC15x9y6(){ note_ctor("_ZN3ccc8CC15x9y6E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y6E, buf);
    ::ccc::CC15x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y6E);
    dp->::ccc::CC15x9y6::~CC15x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y6E(Test__ZN3ccc8CC15x9y6E, "_ZN3ccc8CC15x9y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y6C1Ev();
extern void _ZN3ccc8CC15x9y6D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y6E[] = {
  NSPAIR(_ZN3ccc8CC15x9y6C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y6E[];
extern void _ZN3ccc8CC15x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC15x9y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y6E[];
Class_Descriptor cd__ZN3ccc8CC15x9y6E = {  "_ZN3ccc8CC15x9y6E", // class name
  bases__ZN3ccc8CC15x9y6E, 2,
  &(vtc__ZN3ccc8CC15x9y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y7  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC15x9y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y73pqrEv
  ~CC15x9y7(); // tgen
  CC15x9y7(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y7E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y73abcEv");}
void  ccc::CC15x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y73pqrEv");}
ccc::CC15x9y7 ::~CC15x9y7(){ note_dtor("_ZN3ccc8CC15x9y7E", this);} // tgen
ccc::CC15x9y7 ::CC15x9y7(){ note_ctor("_ZN3ccc8CC15x9y7E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y7E, buf);
    ::ccc::CC15x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y7E);
    dp->::ccc::CC15x9y7::~CC15x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y7E(Test__ZN3ccc8CC15x9y7E, "_ZN3ccc8CC15x9y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y7C1Ev();
extern void _ZN3ccc8CC15x9y7D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y7E[] = {
  NSPAIR(_ZN3ccc8CC15x9y7C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC15x9y73pqrEv();
extern void _ZN3ccc8CC15x9y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y7E[];
Class_Descriptor cd__ZN3ccc8CC15x9y7E = {  "_ZN3ccc8CC15x9y7E", // class name
  bases__ZN3ccc8CC15x9y7E, 2,
  &(vtc__ZN3ccc8CC15x9y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y8  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC15x9y83efgEv
  virtual void  abc(); // _ZN3ccc8CC15x9y83abcEv
  ~CC15x9y8(); // tgen
  CC15x9y8(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y8E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y83efgEv");}
void  ccc::CC15x9y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC15x9y83abcEv");}
ccc::CC15x9y8 ::~CC15x9y8(){ note_dtor("_ZN3ccc8CC15x9y8E", this);} // tgen
ccc::CC15x9y8 ::CC15x9y8(){ note_ctor("_ZN3ccc8CC15x9y8E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y8E, buf);
    ::ccc::CC15x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y8E);
    dp->::ccc::CC15x9y8::~CC15x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y8E(Test__ZN3ccc8CC15x9y8E, "_ZN3ccc8CC15x9y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y8C1Ev();
extern void _ZN3ccc8CC15x9y8D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y8E[] = {
  NSPAIR(_ZN3ccc8CC15x9y8C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y8E[];
extern void _ZN3ccc8CC15x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC15x9y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y8E[];
Class_Descriptor cd__ZN3ccc8CC15x9y8E = {  "_ZN3ccc8CC15x9y8E", // class name
  bases__ZN3ccc8CC15x9y8E, 2,
  &(vtc__ZN3ccc8CC15x9y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y9  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC15x9y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC15x9y93pqrEv
  ~CC15x9y9(); // tgen
  CC15x9y9(); // tgen
};
//SIG(1 _ZN3ccc8CC15x9y9E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC15x9y93efgEv");}
void  ccc::CC15x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC15x9y93pqrEv");}
ccc::CC15x9y9 ::~CC15x9y9(){ note_dtor("_ZN3ccc8CC15x9y9E", this);} // tgen
ccc::CC15x9y9 ::CC15x9y9(){ note_ctor("_ZN3ccc8CC15x9y9E", this);} // tgen
}
static void Test__ZN3ccc8CC15x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC15x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC15x9y9E, buf);
    ::ccc::CC15x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC15x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC15x9y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc8CC15x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC15x9y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC15x9y9E);
    dp->::ccc::CC15x9y9::~CC15x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC15x9y9E(Test__ZN3ccc8CC15x9y9E, "_ZN3ccc8CC15x9y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC15x9y9C1Ev();
extern void _ZN3ccc8CC15x9y9D1Ev();
Name_Map name_map__ZN3ccc8CC15x9y9E[] = {
  NSPAIR(_ZN3ccc8CC15x9y9C1Ev),
  NSPAIR(_ZN3ccc8CC15x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC15x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y9E[];
extern void _ZN3ccc8CC15x9y93efgEv();
extern void _ZN3ccc8CC15x9y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC15x9y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC15x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC15x9y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc8CC15x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC15x9y9E[];
Class_Descriptor cd__ZN3ccc8CC15x9y9E = {  "_ZN3ccc8CC15x9y9E", // class name
  bases__ZN3ccc8CC15x9y9E, 2,
  &(vtc__ZN3ccc8CC15x9y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC15x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC15x9y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y10  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC15x9y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x9y103abcEv
  ~CC15x9y10(); // tgen
  CC15x9y10(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y10E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x9y103pqrEv");}
void  ccc::CC15x9y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x9y103abcEv");}
ccc::CC15x9y10 ::~CC15x9y10(){ note_dtor("_ZN3ccc9CC15x9y10E", this);} // tgen
ccc::CC15x9y10 ::CC15x9y10(){ note_ctor("_ZN3ccc9CC15x9y10E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y10E, buf);
    ::ccc::CC15x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y10E);
    dp->::ccc::CC15x9y10::~CC15x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y10E(Test__ZN3ccc9CC15x9y10E, "_ZN3ccc9CC15x9y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y10C1Ev();
extern void _ZN3ccc9CC15x9y10D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y10E[] = {
  NSPAIR(_ZN3ccc9CC15x9y10C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc9CC15x9y103pqrEv();
extern void _ZN3ccc9CC15x9y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y10E[];
Class_Descriptor cd__ZN3ccc9CC15x9y10E = {  "_ZN3ccc9CC15x9y10E", // class name
  bases__ZN3ccc9CC15x9y10E, 2,
  &(vtc__ZN3ccc9CC15x9y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y11  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC15x9y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x9y113efgEv
  ~CC15x9y11(); // tgen
  CC15x9y11(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y11E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x9y113pqrEv");}
void  ccc::CC15x9y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x9y113efgEv");}
ccc::CC15x9y11 ::~CC15x9y11(){ note_dtor("_ZN3ccc9CC15x9y11E", this);} // tgen
ccc::CC15x9y11 ::CC15x9y11(){ note_ctor("_ZN3ccc9CC15x9y11E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y11E, buf);
    ::ccc::CC15x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y11E);
    dp->::ccc::CC15x9y11::~CC15x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y11E(Test__ZN3ccc9CC15x9y11E, "_ZN3ccc9CC15x9y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y11C1Ev();
extern void _ZN3ccc9CC15x9y11D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y11E[] = {
  NSPAIR(_ZN3ccc9CC15x9y11C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y11E[];
extern void _ZN3ccc9CC15x9y113efgEv();
extern void _ZN3ccc9CC15x9y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y11E[];
Class_Descriptor cd__ZN3ccc9CC15x9y11E = {  "_ZN3ccc9CC15x9y11E", // class name
  bases__ZN3ccc9CC15x9y11E, 2,
  &(vtc__ZN3ccc9CC15x9y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y12  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc9CC15x9y123abcEv
  ~CC15x9y12(); // tgen
  CC15x9y12(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y12E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x9y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x9y123abcEv");}
ccc::CC15x9y12 ::~CC15x9y12(){ note_dtor("_ZN3ccc9CC15x9y12E", this);} // tgen
ccc::CC15x9y12 ::CC15x9y12(){ note_ctor("_ZN3ccc9CC15x9y12E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y12E, buf);
    ::ccc::CC15x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y12E);
    dp->::ccc::CC15x9y12::~CC15x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y12E(Test__ZN3ccc9CC15x9y12E, "_ZN3ccc9CC15x9y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y12C1Ev();
extern void _ZN3ccc9CC15x9y12D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y12E[] = {
  NSPAIR(_ZN3ccc9CC15x9y12C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc9CC15x9y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y12E[];
Class_Descriptor cd__ZN3ccc9CC15x9y12E = {  "_ZN3ccc9CC15x9y12E", // class name
  bases__ZN3ccc9CC15x9y12E, 2,
  &(vtc__ZN3ccc9CC15x9y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y13  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc9CC15x9y133efgEv
  ~CC15x9y13(); // tgen
  CC15x9y13(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y13E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x9y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x9y133efgEv");}
ccc::CC15x9y13 ::~CC15x9y13(){ note_dtor("_ZN3ccc9CC15x9y13E", this);} // tgen
ccc::CC15x9y13 ::CC15x9y13(){ note_ctor("_ZN3ccc9CC15x9y13E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y13E, buf);
    ::ccc::CC15x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y13E);
    dp->::ccc::CC15x9y13::~CC15x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y13E(Test__ZN3ccc9CC15x9y13E, "_ZN3ccc9CC15x9y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y13C1Ev();
extern void _ZN3ccc9CC15x9y13D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y13E[] = {
  NSPAIR(_ZN3ccc9CC15x9y13C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y13E[];
extern void _ZN3ccc9CC15x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y13E[];
Class_Descriptor cd__ZN3ccc9CC15x9y13E = {  "_ZN3ccc9CC15x9y13E", // class name
  bases__ZN3ccc9CC15x9y13E, 2,
  &(vtc__ZN3ccc9CC15x9y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y14  : ::ccc::AA15 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc9CC15x9y143pqrEv
  ~CC15x9y14(); // tgen
  CC15x9y14(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y14E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x9y143pqrEv");}
ccc::CC15x9y14 ::~CC15x9y14(){ note_dtor("_ZN3ccc9CC15x9y14E", this);} // tgen
ccc::CC15x9y14 ::CC15x9y14(){ note_ctor("_ZN3ccc9CC15x9y14E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y14E, buf);
    ::ccc::CC15x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y14E);
    dp->::ccc::CC15x9y14::~CC15x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y14E(Test__ZN3ccc9CC15x9y14E, "_ZN3ccc9CC15x9y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y14C1Ev();
extern void _ZN3ccc9CC15x9y14D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y14E[] = {
  NSPAIR(_ZN3ccc9CC15x9y14C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc9CC15x9y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x9y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y14E[];
Class_Descriptor cd__ZN3ccc9CC15x9y14E = {  "_ZN3ccc9CC15x9y14E", // class name
  bases__ZN3ccc9CC15x9y14E, 2,
  &(vtc__ZN3ccc9CC15x9y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x9y15  : ::ccc::AA15 , ::ccc::BB9 {
  ~CC15x9y15(); // tgen
  CC15x9y15(); // tgen
};
//SIG(1 _ZN3ccc9CC15x9y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x9y15 ::~CC15x9y15(){ note_dtor("_ZN3ccc9CC15x9y15E", this);} // tgen
ccc::CC15x9y15 ::CC15x9y15(){ note_ctor("_ZN3ccc9CC15x9y15E", this);} // tgen
}
static void Test__ZN3ccc9CC15x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x9y15E, buf);
    ::ccc::CC15x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x9y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc9CC15x9y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x9y15E);
    dp->::ccc::CC15x9y15::~CC15x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x9y15E(Test__ZN3ccc9CC15x9y15E, "_ZN3ccc9CC15x9y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x9y15C1Ev();
extern void _ZN3ccc9CC15x9y15D1Ev();
Name_Map name_map__ZN3ccc9CC15x9y15E[] = {
  NSPAIR(_ZN3ccc9CC15x9y15C1Ev),
  NSPAIR(_ZN3ccc9CC15x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc9CC15x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc3BB9E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x9y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x9y15E[];
Class_Descriptor cd__ZN3ccc9CC15x9y15E = {  "_ZN3ccc9CC15x9y15E", // class name
  bases__ZN3ccc9CC15x9y15E, 2,
  &(vtc__ZN3ccc9CC15x9y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x9y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y0  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC15x10y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x10y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y03pqrEv
  ~CC15x10y0(); // tgen
  CC15x10y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y0E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y03abcEv");}
void  ccc::CC15x10y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y03efgEv");}
void  ccc::CC15x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y03pqrEv");}
ccc::CC15x10y0 ::~CC15x10y0(){ note_dtor("_ZN3ccc9CC15x10y0E", this);} // tgen
ccc::CC15x10y0 ::CC15x10y0(){ note_ctor("_ZN3ccc9CC15x10y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y0E, buf);
    ::ccc::CC15x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y0E);
    dp->::ccc::CC15x10y0::~CC15x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y0E(Test__ZN3ccc9CC15x10y0E, "_ZN3ccc9CC15x10y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y0C1Ev();
extern void _ZN3ccc9CC15x10y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y0E[] = {
  NSPAIR(_ZN3ccc9CC15x10y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y0E[];
extern void _ZN3ccc9CC15x10y03pqrEv();
extern void _ZN3ccc9CC15x10y03abcEv();
extern void _ZN3ccc9CC15x10y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y0E[];
Class_Descriptor cd__ZN3ccc9CC15x10y0E = {  "_ZN3ccc9CC15x10y0E", // class name
  bases__ZN3ccc9CC15x10y0E, 2,
  &(vtc__ZN3ccc9CC15x10y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y1  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC15x10y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x10y13efgEv
  ~CC15x10y1(); // tgen
  CC15x10y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y1E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y13abcEv");}
void  ccc::CC15x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y13pqrEv");}
void  ccc::CC15x10y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y13efgEv");}
ccc::CC15x10y1 ::~CC15x10y1(){ note_dtor("_ZN3ccc9CC15x10y1E", this);} // tgen
ccc::CC15x10y1 ::CC15x10y1(){ note_ctor("_ZN3ccc9CC15x10y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y1E, buf);
    ::ccc::CC15x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y1E);
    dp->::ccc::CC15x10y1::~CC15x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y1E(Test__ZN3ccc9CC15x10y1E, "_ZN3ccc9CC15x10y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y1C1Ev();
extern void _ZN3ccc9CC15x10y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y1E[] = {
  NSPAIR(_ZN3ccc9CC15x10y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y1E[];
extern void _ZN3ccc9CC15x10y13pqrEv();
extern void _ZN3ccc9CC15x10y13abcEv();
extern void _ZN3ccc9CC15x10y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y1E[];
Class_Descriptor cd__ZN3ccc9CC15x10y1E = {  "_ZN3ccc9CC15x10y1E", // class name
  bases__ZN3ccc9CC15x10y1E, 2,
  &(vtc__ZN3ccc9CC15x10y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y2  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC15x10y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x10y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y23pqrEv
  ~CC15x10y2(); // tgen
  CC15x10y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y2E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y23efgEv");}
void  ccc::CC15x10y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y23abcEv");}
void  ccc::CC15x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y23pqrEv");}
ccc::CC15x10y2 ::~CC15x10y2(){ note_dtor("_ZN3ccc9CC15x10y2E", this);} // tgen
ccc::CC15x10y2 ::CC15x10y2(){ note_ctor("_ZN3ccc9CC15x10y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y2E, buf);
    ::ccc::CC15x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y2E);
    dp->::ccc::CC15x10y2::~CC15x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y2E(Test__ZN3ccc9CC15x10y2E, "_ZN3ccc9CC15x10y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y2C1Ev();
extern void _ZN3ccc9CC15x10y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y2E[] = {
  NSPAIR(_ZN3ccc9CC15x10y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y2E[];
extern void _ZN3ccc9CC15x10y23pqrEv();
extern void _ZN3ccc9CC15x10y23abcEv();
extern void _ZN3ccc9CC15x10y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y23efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y2E[];
Class_Descriptor cd__ZN3ccc9CC15x10y2E = {  "_ZN3ccc9CC15x10y2E", // class name
  bases__ZN3ccc9CC15x10y2E, 2,
  &(vtc__ZN3ccc9CC15x10y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y3  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC15x10y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x10y33abcEv
  ~CC15x10y3(); // tgen
  CC15x10y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y3E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y33efgEv");}
void  ccc::CC15x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y33pqrEv");}
void  ccc::CC15x10y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y33abcEv");}
ccc::CC15x10y3 ::~CC15x10y3(){ note_dtor("_ZN3ccc9CC15x10y3E", this);} // tgen
ccc::CC15x10y3 ::CC15x10y3(){ note_ctor("_ZN3ccc9CC15x10y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y3E, buf);
    ::ccc::CC15x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y3E);
    dp->::ccc::CC15x10y3::~CC15x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y3E(Test__ZN3ccc9CC15x10y3E, "_ZN3ccc9CC15x10y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y3C1Ev();
extern void _ZN3ccc9CC15x10y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y3E[] = {
  NSPAIR(_ZN3ccc9CC15x10y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y3E[];
extern void _ZN3ccc9CC15x10y33pqrEv();
extern void _ZN3ccc9CC15x10y33abcEv();
extern void _ZN3ccc9CC15x10y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y33efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y3E[];
Class_Descriptor cd__ZN3ccc9CC15x10y3E = {  "_ZN3ccc9CC15x10y3E", // class name
  bases__ZN3ccc9CC15x10y3E, 2,
  &(vtc__ZN3ccc9CC15x10y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y4  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC15x10y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x10y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x10y43efgEv
  ~CC15x10y4(); // tgen
  CC15x10y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y4E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y43pqrEv");}
void  ccc::CC15x10y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y43abcEv");}
void  ccc::CC15x10y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y43efgEv");}
ccc::CC15x10y4 ::~CC15x10y4(){ note_dtor("_ZN3ccc9CC15x10y4E", this);} // tgen
ccc::CC15x10y4 ::CC15x10y4(){ note_ctor("_ZN3ccc9CC15x10y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y4E, buf);
    ::ccc::CC15x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y4E);
    dp->::ccc::CC15x10y4::~CC15x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y4E(Test__ZN3ccc9CC15x10y4E, "_ZN3ccc9CC15x10y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y4C1Ev();
extern void _ZN3ccc9CC15x10y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y4E[] = {
  NSPAIR(_ZN3ccc9CC15x10y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y4E[];
extern void _ZN3ccc9CC15x10y43pqrEv();
extern void _ZN3ccc9CC15x10y43abcEv();
extern void _ZN3ccc9CC15x10y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y4E[];
Class_Descriptor cd__ZN3ccc9CC15x10y4E = {  "_ZN3ccc9CC15x10y4E", // class name
  bases__ZN3ccc9CC15x10y4E, 2,
  &(vtc__ZN3ccc9CC15x10y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y5  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC15x10y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x10y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x10y53abcEv
  ~CC15x10y5(); // tgen
  CC15x10y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y5E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y53pqrEv");}
void  ccc::CC15x10y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y53efgEv");}
void  ccc::CC15x10y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y53abcEv");}
ccc::CC15x10y5 ::~CC15x10y5(){ note_dtor("_ZN3ccc9CC15x10y5E", this);} // tgen
ccc::CC15x10y5 ::CC15x10y5(){ note_ctor("_ZN3ccc9CC15x10y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y5E, buf);
    ::ccc::CC15x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y5E);
    dp->::ccc::CC15x10y5::~CC15x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y5E(Test__ZN3ccc9CC15x10y5E, "_ZN3ccc9CC15x10y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y5C1Ev();
extern void _ZN3ccc9CC15x10y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y5E[] = {
  NSPAIR(_ZN3ccc9CC15x10y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y5E[];
extern void _ZN3ccc9CC15x10y53pqrEv();
extern void _ZN3ccc9CC15x10y53abcEv();
extern void _ZN3ccc9CC15x10y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y5E[];
Class_Descriptor cd__ZN3ccc9CC15x10y5E = {  "_ZN3ccc9CC15x10y5E", // class name
  bases__ZN3ccc9CC15x10y5E, 2,
  &(vtc__ZN3ccc9CC15x10y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y6  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC15x10y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x10y63efgEv
  ~CC15x10y6(); // tgen
  CC15x10y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y6E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y63abcEv");}
void  ccc::CC15x10y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y63efgEv");}
ccc::CC15x10y6 ::~CC15x10y6(){ note_dtor("_ZN3ccc9CC15x10y6E", this);} // tgen
ccc::CC15x10y6 ::CC15x10y6(){ note_ctor("_ZN3ccc9CC15x10y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y6E, buf);
    ::ccc::CC15x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y6E);
    dp->::ccc::CC15x10y6::~CC15x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y6E(Test__ZN3ccc9CC15x10y6E, "_ZN3ccc9CC15x10y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y6C1Ev();
extern void _ZN3ccc9CC15x10y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y6E[] = {
  NSPAIR(_ZN3ccc9CC15x10y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC15x10y63abcEv();
extern void _ZN3ccc9CC15x10y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y6E[];
Class_Descriptor cd__ZN3ccc9CC15x10y6E = {  "_ZN3ccc9CC15x10y6E", // class name
  bases__ZN3ccc9CC15x10y6E, 2,
  &(vtc__ZN3ccc9CC15x10y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y7  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC15x10y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y73pqrEv
  ~CC15x10y7(); // tgen
  CC15x10y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y7E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y73abcEv");}
void  ccc::CC15x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y73pqrEv");}
ccc::CC15x10y7 ::~CC15x10y7(){ note_dtor("_ZN3ccc9CC15x10y7E", this);} // tgen
ccc::CC15x10y7 ::CC15x10y7(){ note_ctor("_ZN3ccc9CC15x10y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y7E, buf);
    ::ccc::CC15x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y7E);
    dp->::ccc::CC15x10y7::~CC15x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y7E(Test__ZN3ccc9CC15x10y7E, "_ZN3ccc9CC15x10y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y7C1Ev();
extern void _ZN3ccc9CC15x10y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y7E[] = {
  NSPAIR(_ZN3ccc9CC15x10y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y7E[];
extern void _ZN3ccc9CC15x10y73pqrEv();
extern void _ZN3ccc9CC15x10y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y7E[];
Class_Descriptor cd__ZN3ccc9CC15x10y7E = {  "_ZN3ccc9CC15x10y7E", // class name
  bases__ZN3ccc9CC15x10y7E, 2,
  &(vtc__ZN3ccc9CC15x10y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y8  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC15x10y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x10y83abcEv
  ~CC15x10y8(); // tgen
  CC15x10y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y8E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y83efgEv");}
void  ccc::CC15x10y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x10y83abcEv");}
ccc::CC15x10y8 ::~CC15x10y8(){ note_dtor("_ZN3ccc9CC15x10y8E", this);} // tgen
ccc::CC15x10y8 ::CC15x10y8(){ note_ctor("_ZN3ccc9CC15x10y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y8E, buf);
    ::ccc::CC15x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y8E);
    dp->::ccc::CC15x10y8::~CC15x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y8E(Test__ZN3ccc9CC15x10y8E, "_ZN3ccc9CC15x10y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y8C1Ev();
extern void _ZN3ccc9CC15x10y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y8E[] = {
  NSPAIR(_ZN3ccc9CC15x10y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC15x10y83abcEv();
extern void _ZN3ccc9CC15x10y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y8E[];
Class_Descriptor cd__ZN3ccc9CC15x10y8E = {  "_ZN3ccc9CC15x10y8E", // class name
  bases__ZN3ccc9CC15x10y8E, 2,
  &(vtc__ZN3ccc9CC15x10y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y9  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC15x10y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x10y93pqrEv
  ~CC15x10y9(); // tgen
  CC15x10y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x10y9E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x10y93efgEv");}
void  ccc::CC15x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x10y93pqrEv");}
ccc::CC15x10y9 ::~CC15x10y9(){ note_dtor("_ZN3ccc9CC15x10y9E", this);} // tgen
ccc::CC15x10y9 ::CC15x10y9(){ note_ctor("_ZN3ccc9CC15x10y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x10y9E, buf);
    ::ccc::CC15x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x10y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC15x10y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x10y9E);
    dp->::ccc::CC15x10y9::~CC15x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x10y9E(Test__ZN3ccc9CC15x10y9E, "_ZN3ccc9CC15x10y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x10y9C1Ev();
extern void _ZN3ccc9CC15x10y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x10y9E[] = {
  NSPAIR(_ZN3ccc9CC15x10y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC15x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y9E[];
extern void _ZN3ccc9CC15x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC15x10y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x10y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x10y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x10y9E[];
Class_Descriptor cd__ZN3ccc9CC15x10y9E = {  "_ZN3ccc9CC15x10y9E", // class name
  bases__ZN3ccc9CC15x10y9E, 2,
  &(vtc__ZN3ccc9CC15x10y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x10y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y10  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC15x10y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x10y103abcEv
  ~CC15x10y10(); // tgen
  CC15x10y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y10E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x10y103pqrEv");}
void  ccc::CC15x10y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x10y103abcEv");}
ccc::CC15x10y10 ::~CC15x10y10(){ note_dtor("_ZN3ccc10CC15x10y10E", this);} // tgen
ccc::CC15x10y10 ::CC15x10y10(){ note_ctor("_ZN3ccc10CC15x10y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y10E, buf);
    ::ccc::CC15x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y10E);
    dp->::ccc::CC15x10y10::~CC15x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y10E(Test__ZN3ccc10CC15x10y10E, "_ZN3ccc10CC15x10y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y10C1Ev();
extern void _ZN3ccc10CC15x10y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y10E[] = {
  NSPAIR(_ZN3ccc10CC15x10y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y10E[];
extern void _ZN3ccc10CC15x10y103pqrEv();
extern void _ZN3ccc10CC15x10y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y10E[];
Class_Descriptor cd__ZN3ccc10CC15x10y10E = {  "_ZN3ccc10CC15x10y10E", // class name
  bases__ZN3ccc10CC15x10y10E, 2,
  &(vtc__ZN3ccc10CC15x10y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y11  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC15x10y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x10y113efgEv
  ~CC15x10y11(); // tgen
  CC15x10y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y11E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x10y113pqrEv");}
void  ccc::CC15x10y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x10y113efgEv");}
ccc::CC15x10y11 ::~CC15x10y11(){ note_dtor("_ZN3ccc10CC15x10y11E", this);} // tgen
ccc::CC15x10y11 ::CC15x10y11(){ note_ctor("_ZN3ccc10CC15x10y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y11E, buf);
    ::ccc::CC15x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y11E);
    dp->::ccc::CC15x10y11::~CC15x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y11E(Test__ZN3ccc10CC15x10y11E, "_ZN3ccc10CC15x10y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y11C1Ev();
extern void _ZN3ccc10CC15x10y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y11E[] = {
  NSPAIR(_ZN3ccc10CC15x10y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y11E[];
extern void _ZN3ccc10CC15x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc10CC15x10y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y11E[];
Class_Descriptor cd__ZN3ccc10CC15x10y11E = {  "_ZN3ccc10CC15x10y11E", // class name
  bases__ZN3ccc10CC15x10y11E, 2,
  &(vtc__ZN3ccc10CC15x10y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y12  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc10CC15x10y123abcEv
  ~CC15x10y12(); // tgen
  CC15x10y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y12E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x10y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x10y123abcEv");}
ccc::CC15x10y12 ::~CC15x10y12(){ note_dtor("_ZN3ccc10CC15x10y12E", this);} // tgen
ccc::CC15x10y12 ::CC15x10y12(){ note_ctor("_ZN3ccc10CC15x10y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y12E, buf);
    ::ccc::CC15x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y12E);
    dp->::ccc::CC15x10y12::~CC15x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y12E(Test__ZN3ccc10CC15x10y12E, "_ZN3ccc10CC15x10y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y12C1Ev();
extern void _ZN3ccc10CC15x10y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y12E[] = {
  NSPAIR(_ZN3ccc10CC15x10y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc10CC15x10y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y12E[];
Class_Descriptor cd__ZN3ccc10CC15x10y12E = {  "_ZN3ccc10CC15x10y12E", // class name
  bases__ZN3ccc10CC15x10y12E, 2,
  &(vtc__ZN3ccc10CC15x10y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y13  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc10CC15x10y133efgEv
  ~CC15x10y13(); // tgen
  CC15x10y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y13E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x10y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x10y133efgEv");}
ccc::CC15x10y13 ::~CC15x10y13(){ note_dtor("_ZN3ccc10CC15x10y13E", this);} // tgen
ccc::CC15x10y13 ::CC15x10y13(){ note_ctor("_ZN3ccc10CC15x10y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y13E, buf);
    ::ccc::CC15x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y13E);
    dp->::ccc::CC15x10y13::~CC15x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y13E(Test__ZN3ccc10CC15x10y13E, "_ZN3ccc10CC15x10y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y13C1Ev();
extern void _ZN3ccc10CC15x10y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y13E[] = {
  NSPAIR(_ZN3ccc10CC15x10y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc10CC15x10y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y13E[];
Class_Descriptor cd__ZN3ccc10CC15x10y13E = {  "_ZN3ccc10CC15x10y13E", // class name
  bases__ZN3ccc10CC15x10y13E, 2,
  &(vtc__ZN3ccc10CC15x10y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y13E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y14  : ::ccc::AA15 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc10CC15x10y143pqrEv
  ~CC15x10y14(); // tgen
  CC15x10y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y14E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x10y143pqrEv");}
ccc::CC15x10y14 ::~CC15x10y14(){ note_dtor("_ZN3ccc10CC15x10y14E", this);} // tgen
ccc::CC15x10y14 ::CC15x10y14(){ note_ctor("_ZN3ccc10CC15x10y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y14E, buf);
    ::ccc::CC15x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y14E);
    dp->::ccc::CC15x10y14::~CC15x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y14E(Test__ZN3ccc10CC15x10y14E, "_ZN3ccc10CC15x10y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y14C1Ev();
extern void _ZN3ccc10CC15x10y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y14E[] = {
  NSPAIR(_ZN3ccc10CC15x10y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y14E[];
extern void _ZN3ccc10CC15x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y14E[];
Class_Descriptor cd__ZN3ccc10CC15x10y14E = {  "_ZN3ccc10CC15x10y14E", // class name
  bases__ZN3ccc10CC15x10y14E, 2,
  &(vtc__ZN3ccc10CC15x10y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x10y15  : ::ccc::AA15 , ::ccc::BB10 {
  ~CC15x10y15(); // tgen
  CC15x10y15(); // tgen
};
//SIG(1 _ZN3ccc10CC15x10y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x10y15 ::~CC15x10y15(){ note_dtor("_ZN3ccc10CC15x10y15E", this);} // tgen
ccc::CC15x10y15 ::CC15x10y15(){ note_ctor("_ZN3ccc10CC15x10y15E", this);} // tgen
}
static void Test__ZN3ccc10CC15x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x10y15E, buf);
    ::ccc::CC15x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x10y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc10CC15x10y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x10y15E);
    dp->::ccc::CC15x10y15::~CC15x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x10y15E(Test__ZN3ccc10CC15x10y15E, "_ZN3ccc10CC15x10y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x10y15C1Ev();
extern void _ZN3ccc10CC15x10y15D1Ev();
Name_Map name_map__ZN3ccc10CC15x10y15E[] = {
  NSPAIR(_ZN3ccc10CC15x10y15C1Ev),
  NSPAIR(_ZN3ccc10CC15x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc10CC15x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB10E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x10y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x10y15E[];
Class_Descriptor cd__ZN3ccc10CC15x10y15E = {  "_ZN3ccc10CC15x10y15E", // class name
  bases__ZN3ccc10CC15x10y15E, 2,
  &(vtc__ZN3ccc10CC15x10y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x10y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y0  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC15x11y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x11y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y03pqrEv
  ~CC15x11y0(); // tgen
  CC15x11y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y0E) C1{ BC2{} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y03abcEv");}
void  ccc::CC15x11y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y03efgEv");}
void  ccc::CC15x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y03pqrEv");}
ccc::CC15x11y0 ::~CC15x11y0(){ note_dtor("_ZN3ccc9CC15x11y0E", this);} // tgen
ccc::CC15x11y0 ::CC15x11y0(){ note_ctor("_ZN3ccc9CC15x11y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y0E, buf);
    ::ccc::CC15x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y0E);
    dp->::ccc::CC15x11y0::~CC15x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y0E(Test__ZN3ccc9CC15x11y0E, "_ZN3ccc9CC15x11y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y0C1Ev();
extern void _ZN3ccc9CC15x11y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y0E[] = {
  NSPAIR(_ZN3ccc9CC15x11y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y0E[];
extern void _ZN3ccc9CC15x11y03pqrEv();
extern void _ZN3ccc9CC15x11y03efgEv();
extern void _ZN3ccc9CC15x11y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y03abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y0E[];
Class_Descriptor cd__ZN3ccc9CC15x11y0E = {  "_ZN3ccc9CC15x11y0E", // class name
  bases__ZN3ccc9CC15x11y0E, 2,
  &(vtc__ZN3ccc9CC15x11y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y1  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC15x11y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x11y13efgEv
  ~CC15x11y1(); // tgen
  CC15x11y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y1E) C1{ BC2{} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y13abcEv");}
void  ccc::CC15x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y13pqrEv");}
void  ccc::CC15x11y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y13efgEv");}
ccc::CC15x11y1 ::~CC15x11y1(){ note_dtor("_ZN3ccc9CC15x11y1E", this);} // tgen
ccc::CC15x11y1 ::CC15x11y1(){ note_ctor("_ZN3ccc9CC15x11y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y1E, buf);
    ::ccc::CC15x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y1E);
    dp->::ccc::CC15x11y1::~CC15x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y1E(Test__ZN3ccc9CC15x11y1E, "_ZN3ccc9CC15x11y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y1C1Ev();
extern void _ZN3ccc9CC15x11y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y1E[] = {
  NSPAIR(_ZN3ccc9CC15x11y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y1E[];
extern void _ZN3ccc9CC15x11y13pqrEv();
extern void _ZN3ccc9CC15x11y13efgEv();
extern void _ZN3ccc9CC15x11y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y13abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y1E[];
Class_Descriptor cd__ZN3ccc9CC15x11y1E = {  "_ZN3ccc9CC15x11y1E", // class name
  bases__ZN3ccc9CC15x11y1E, 2,
  &(vtc__ZN3ccc9CC15x11y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y2  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC15x11y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x11y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y23pqrEv
  ~CC15x11y2(); // tgen
  CC15x11y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y2E) C1{ BC2{} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y23efgEv");}
void  ccc::CC15x11y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y23abcEv");}
void  ccc::CC15x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y23pqrEv");}
ccc::CC15x11y2 ::~CC15x11y2(){ note_dtor("_ZN3ccc9CC15x11y2E", this);} // tgen
ccc::CC15x11y2 ::CC15x11y2(){ note_ctor("_ZN3ccc9CC15x11y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y2E, buf);
    ::ccc::CC15x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y2E);
    dp->::ccc::CC15x11y2::~CC15x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y2E(Test__ZN3ccc9CC15x11y2E, "_ZN3ccc9CC15x11y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y2C1Ev();
extern void _ZN3ccc9CC15x11y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y2E[] = {
  NSPAIR(_ZN3ccc9CC15x11y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y2E[];
extern void _ZN3ccc9CC15x11y23pqrEv();
extern void _ZN3ccc9CC15x11y23efgEv();
extern void _ZN3ccc9CC15x11y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y2E[];
Class_Descriptor cd__ZN3ccc9CC15x11y2E = {  "_ZN3ccc9CC15x11y2E", // class name
  bases__ZN3ccc9CC15x11y2E, 2,
  &(vtc__ZN3ccc9CC15x11y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y3  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC15x11y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x11y33abcEv
  ~CC15x11y3(); // tgen
  CC15x11y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y3E) C1{ BC2{} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y33efgEv");}
void  ccc::CC15x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y33pqrEv");}
void  ccc::CC15x11y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y33abcEv");}
ccc::CC15x11y3 ::~CC15x11y3(){ note_dtor("_ZN3ccc9CC15x11y3E", this);} // tgen
ccc::CC15x11y3 ::CC15x11y3(){ note_ctor("_ZN3ccc9CC15x11y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y3E, buf);
    ::ccc::CC15x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y3E);
    dp->::ccc::CC15x11y3::~CC15x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y3E(Test__ZN3ccc9CC15x11y3E, "_ZN3ccc9CC15x11y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y3C1Ev();
extern void _ZN3ccc9CC15x11y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y3E[] = {
  NSPAIR(_ZN3ccc9CC15x11y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y3E[];
extern void _ZN3ccc9CC15x11y33pqrEv();
extern void _ZN3ccc9CC15x11y33efgEv();
extern void _ZN3ccc9CC15x11y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y3E[];
Class_Descriptor cd__ZN3ccc9CC15x11y3E = {  "_ZN3ccc9CC15x11y3E", // class name
  bases__ZN3ccc9CC15x11y3E, 2,
  &(vtc__ZN3ccc9CC15x11y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y4  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC15x11y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x11y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x11y43efgEv
  ~CC15x11y4(); // tgen
  CC15x11y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y4E) C1{ BC2{} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y43pqrEv");}
void  ccc::CC15x11y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y43abcEv");}
void  ccc::CC15x11y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y43efgEv");}
ccc::CC15x11y4 ::~CC15x11y4(){ note_dtor("_ZN3ccc9CC15x11y4E", this);} // tgen
ccc::CC15x11y4 ::CC15x11y4(){ note_ctor("_ZN3ccc9CC15x11y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y4E, buf);
    ::ccc::CC15x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y4E);
    dp->::ccc::CC15x11y4::~CC15x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y4E(Test__ZN3ccc9CC15x11y4E, "_ZN3ccc9CC15x11y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y4C1Ev();
extern void _ZN3ccc9CC15x11y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y4E[] = {
  NSPAIR(_ZN3ccc9CC15x11y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y4E[];
extern void _ZN3ccc9CC15x11y43pqrEv();
extern void _ZN3ccc9CC15x11y43efgEv();
extern void _ZN3ccc9CC15x11y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y4E[];
Class_Descriptor cd__ZN3ccc9CC15x11y4E = {  "_ZN3ccc9CC15x11y4E", // class name
  bases__ZN3ccc9CC15x11y4E, 2,
  &(vtc__ZN3ccc9CC15x11y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y5  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC15x11y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x11y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x11y53abcEv
  ~CC15x11y5(); // tgen
  CC15x11y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y5E) C1{ BC2{} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y53pqrEv");}
void  ccc::CC15x11y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y53efgEv");}
void  ccc::CC15x11y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y53abcEv");}
ccc::CC15x11y5 ::~CC15x11y5(){ note_dtor("_ZN3ccc9CC15x11y5E", this);} // tgen
ccc::CC15x11y5 ::CC15x11y5(){ note_ctor("_ZN3ccc9CC15x11y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y5E, buf);
    ::ccc::CC15x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y5E);
    dp->::ccc::CC15x11y5::~CC15x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y5E(Test__ZN3ccc9CC15x11y5E, "_ZN3ccc9CC15x11y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y5C1Ev();
extern void _ZN3ccc9CC15x11y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y5E[] = {
  NSPAIR(_ZN3ccc9CC15x11y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y5E[];
extern void _ZN3ccc9CC15x11y53pqrEv();
extern void _ZN3ccc9CC15x11y53efgEv();
extern void _ZN3ccc9CC15x11y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y5E[];
Class_Descriptor cd__ZN3ccc9CC15x11y5E = {  "_ZN3ccc9CC15x11y5E", // class name
  bases__ZN3ccc9CC15x11y5E, 2,
  &(vtc__ZN3ccc9CC15x11y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y6  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC15x11y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x11y63efgEv
  ~CC15x11y6(); // tgen
  CC15x11y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y6E) C1{ BC2{} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y63abcEv");}
void  ccc::CC15x11y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y63efgEv");}
ccc::CC15x11y6 ::~CC15x11y6(){ note_dtor("_ZN3ccc9CC15x11y6E", this);} // tgen
ccc::CC15x11y6 ::CC15x11y6(){ note_ctor("_ZN3ccc9CC15x11y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y6E, buf);
    ::ccc::CC15x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y6E);
    dp->::ccc::CC15x11y6::~CC15x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y6E(Test__ZN3ccc9CC15x11y6E, "_ZN3ccc9CC15x11y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y6C1Ev();
extern void _ZN3ccc9CC15x11y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y6E[] = {
  NSPAIR(_ZN3ccc9CC15x11y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC15x11y63efgEv();
extern void _ZN3ccc9CC15x11y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y6E[];
Class_Descriptor cd__ZN3ccc9CC15x11y6E = {  "_ZN3ccc9CC15x11y6E", // class name
  bases__ZN3ccc9CC15x11y6E, 2,
  &(vtc__ZN3ccc9CC15x11y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y7  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC15x11y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y73pqrEv
  ~CC15x11y7(); // tgen
  CC15x11y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y7E) C1{ BC2{} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y73abcEv");}
void  ccc::CC15x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y73pqrEv");}
ccc::CC15x11y7 ::~CC15x11y7(){ note_dtor("_ZN3ccc9CC15x11y7E", this);} // tgen
ccc::CC15x11y7 ::CC15x11y7(){ note_ctor("_ZN3ccc9CC15x11y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y7E, buf);
    ::ccc::CC15x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y7E);
    dp->::ccc::CC15x11y7::~CC15x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y7E(Test__ZN3ccc9CC15x11y7E, "_ZN3ccc9CC15x11y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y7C1Ev();
extern void _ZN3ccc9CC15x11y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y7E[] = {
  NSPAIR(_ZN3ccc9CC15x11y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y7E[];
extern void _ZN3ccc9CC15x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC15x11y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y7E[];
Class_Descriptor cd__ZN3ccc9CC15x11y7E = {  "_ZN3ccc9CC15x11y7E", // class name
  bases__ZN3ccc9CC15x11y7E, 2,
  &(vtc__ZN3ccc9CC15x11y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y8  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC15x11y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x11y83abcEv
  ~CC15x11y8(); // tgen
  CC15x11y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y8E) C1{ BC2{} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y83efgEv");}
void  ccc::CC15x11y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x11y83abcEv");}
ccc::CC15x11y8 ::~CC15x11y8(){ note_dtor("_ZN3ccc9CC15x11y8E", this);} // tgen
ccc::CC15x11y8 ::CC15x11y8(){ note_ctor("_ZN3ccc9CC15x11y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y8E, buf);
    ::ccc::CC15x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y8E);
    dp->::ccc::CC15x11y8::~CC15x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y8E(Test__ZN3ccc9CC15x11y8E, "_ZN3ccc9CC15x11y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y8C1Ev();
extern void _ZN3ccc9CC15x11y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y8E[] = {
  NSPAIR(_ZN3ccc9CC15x11y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC15x11y83efgEv();
extern void _ZN3ccc9CC15x11y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y8E[];
Class_Descriptor cd__ZN3ccc9CC15x11y8E = {  "_ZN3ccc9CC15x11y8E", // class name
  bases__ZN3ccc9CC15x11y8E, 2,
  &(vtc__ZN3ccc9CC15x11y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y9  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC15x11y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x11y93pqrEv
  ~CC15x11y9(); // tgen
  CC15x11y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x11y9E) C1{ BC2{} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x11y93efgEv");}
void  ccc::CC15x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x11y93pqrEv");}
ccc::CC15x11y9 ::~CC15x11y9(){ note_dtor("_ZN3ccc9CC15x11y9E", this);} // tgen
ccc::CC15x11y9 ::CC15x11y9(){ note_ctor("_ZN3ccc9CC15x11y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x11y9E, buf);
    ::ccc::CC15x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x11y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC15x11y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x11y9E);
    dp->::ccc::CC15x11y9::~CC15x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x11y9E(Test__ZN3ccc9CC15x11y9E, "_ZN3ccc9CC15x11y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x11y9C1Ev();
extern void _ZN3ccc9CC15x11y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x11y9E[] = {
  NSPAIR(_ZN3ccc9CC15x11y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC15x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y9E[];
extern void _ZN3ccc9CC15x11y93pqrEv();
extern void _ZN3ccc9CC15x11y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x11y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x11y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x11y9E[];
Class_Descriptor cd__ZN3ccc9CC15x11y9E = {  "_ZN3ccc9CC15x11y9E", // class name
  bases__ZN3ccc9CC15x11y9E, 2,
  &(vtc__ZN3ccc9CC15x11y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x11y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y10  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC15x11y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x11y103abcEv
  ~CC15x11y10(); // tgen
  CC15x11y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y10E) C1{ BC2{} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x11y103pqrEv");}
void  ccc::CC15x11y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x11y103abcEv");}
ccc::CC15x11y10 ::~CC15x11y10(){ note_dtor("_ZN3ccc10CC15x11y10E", this);} // tgen
ccc::CC15x11y10 ::CC15x11y10(){ note_ctor("_ZN3ccc10CC15x11y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y10E, buf);
    ::ccc::CC15x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y10E);
    dp->::ccc::CC15x11y10::~CC15x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y10E(Test__ZN3ccc10CC15x11y10E, "_ZN3ccc10CC15x11y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y10C1Ev();
extern void _ZN3ccc10CC15x11y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y10E[] = {
  NSPAIR(_ZN3ccc10CC15x11y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y10E[];
extern void _ZN3ccc10CC15x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc10CC15x11y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y10E[];
Class_Descriptor cd__ZN3ccc10CC15x11y10E = {  "_ZN3ccc10CC15x11y10E", // class name
  bases__ZN3ccc10CC15x11y10E, 2,
  &(vtc__ZN3ccc10CC15x11y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y11  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC15x11y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x11y113efgEv
  ~CC15x11y11(); // tgen
  CC15x11y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y11E) C1{ BC2{} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x11y113pqrEv");}
void  ccc::CC15x11y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x11y113efgEv");}
ccc::CC15x11y11 ::~CC15x11y11(){ note_dtor("_ZN3ccc10CC15x11y11E", this);} // tgen
ccc::CC15x11y11 ::CC15x11y11(){ note_ctor("_ZN3ccc10CC15x11y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y11E, buf);
    ::ccc::CC15x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y11E);
    dp->::ccc::CC15x11y11::~CC15x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y11E(Test__ZN3ccc10CC15x11y11E, "_ZN3ccc10CC15x11y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y11C1Ev();
extern void _ZN3ccc10CC15x11y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y11E[] = {
  NSPAIR(_ZN3ccc10CC15x11y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y11E[];
extern void _ZN3ccc10CC15x11y113pqrEv();
extern void _ZN3ccc10CC15x11y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y11E[];
Class_Descriptor cd__ZN3ccc10CC15x11y11E = {  "_ZN3ccc10CC15x11y11E", // class name
  bases__ZN3ccc10CC15x11y11E, 2,
  &(vtc__ZN3ccc10CC15x11y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y12  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc10CC15x11y123abcEv
  ~CC15x11y12(); // tgen
  CC15x11y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y12E) C1{ BC2{} BC3{ v2 v3} v1}
}
namespace ccc { 
void  ccc::CC15x11y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x11y123abcEv");}
ccc::CC15x11y12 ::~CC15x11y12(){ note_dtor("_ZN3ccc10CC15x11y12E", this);} // tgen
ccc::CC15x11y12 ::CC15x11y12(){ note_ctor("_ZN3ccc10CC15x11y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y12E, buf);
    ::ccc::CC15x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y12E);
    dp->::ccc::CC15x11y12::~CC15x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y12E(Test__ZN3ccc10CC15x11y12E, "_ZN3ccc10CC15x11y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y12C1Ev();
extern void _ZN3ccc10CC15x11y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y12E[] = {
  NSPAIR(_ZN3ccc10CC15x11y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc10CC15x11y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y12E[];
Class_Descriptor cd__ZN3ccc10CC15x11y12E = {  "_ZN3ccc10CC15x11y12E", // class name
  bases__ZN3ccc10CC15x11y12E, 2,
  &(vtc__ZN3ccc10CC15x11y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y12E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y13  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc10CC15x11y133efgEv
  ~CC15x11y13(); // tgen
  CC15x11y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y13E) C1{ BC2{} BC3{ v2 v1} v1}
}
namespace ccc { 
void  ccc::CC15x11y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x11y133efgEv");}
ccc::CC15x11y13 ::~CC15x11y13(){ note_dtor("_ZN3ccc10CC15x11y13E", this);} // tgen
ccc::CC15x11y13 ::CC15x11y13(){ note_ctor("_ZN3ccc10CC15x11y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y13E, buf);
    ::ccc::CC15x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y13E);
    dp->::ccc::CC15x11y13::~CC15x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y13E(Test__ZN3ccc10CC15x11y13E, "_ZN3ccc10CC15x11y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y13C1Ev();
extern void _ZN3ccc10CC15x11y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y13E[] = {
  NSPAIR(_ZN3ccc10CC15x11y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc10CC15x11y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y13E[];
Class_Descriptor cd__ZN3ccc10CC15x11y13E = {  "_ZN3ccc10CC15x11y13E", // class name
  bases__ZN3ccc10CC15x11y13E, 2,
  &(vtc__ZN3ccc10CC15x11y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y14  : ::ccc::AA15 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc10CC15x11y143pqrEv
  ~CC15x11y14(); // tgen
  CC15x11y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y14E) C1{ BC2{} BC3{ v1 v2} v1}
}
namespace ccc { 
void  ccc::CC15x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x11y143pqrEv");}
ccc::CC15x11y14 ::~CC15x11y14(){ note_dtor("_ZN3ccc10CC15x11y14E", this);} // tgen
ccc::CC15x11y14 ::CC15x11y14(){ note_ctor("_ZN3ccc10CC15x11y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y14E, buf);
    ::ccc::CC15x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y14E);
    dp->::ccc::CC15x11y14::~CC15x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y14E(Test__ZN3ccc10CC15x11y14E, "_ZN3ccc10CC15x11y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y14C1Ev();
extern void _ZN3ccc10CC15x11y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y14E[] = {
  NSPAIR(_ZN3ccc10CC15x11y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y14E[];
extern void _ZN3ccc10CC15x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y14E[];
Class_Descriptor cd__ZN3ccc10CC15x11y14E = {  "_ZN3ccc10CC15x11y14E", // class name
  bases__ZN3ccc10CC15x11y14E, 2,
  &(vtc__ZN3ccc10CC15x11y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x11y15  : ::ccc::AA15 , ::ccc::BB11 {
  ~CC15x11y15(); // tgen
  CC15x11y15(); // tgen
};
//SIG(1 _ZN3ccc10CC15x11y15E) C1{ BC2{} BC3{ v1 v2}}
}
namespace ccc { 
ccc::CC15x11y15 ::~CC15x11y15(){ note_dtor("_ZN3ccc10CC15x11y15E", this);} // tgen
ccc::CC15x11y15 ::CC15x11y15(){ note_ctor("_ZN3ccc10CC15x11y15E", this);} // tgen
}
static void Test__ZN3ccc10CC15x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x11y15E, buf);
    ::ccc::CC15x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x11y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc10CC15x11y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x11y15E);
    dp->::ccc::CC15x11y15::~CC15x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x11y15E(Test__ZN3ccc10CC15x11y15E, "_ZN3ccc10CC15x11y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x11y15C1Ev();
extern void _ZN3ccc10CC15x11y15D1Ev();
Name_Map name_map__ZN3ccc10CC15x11y15E[] = {
  NSPAIR(_ZN3ccc10CC15x11y15C1Ev),
  NSPAIR(_ZN3ccc10CC15x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc10CC15x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB11E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x11y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x11y15E[];
Class_Descriptor cd__ZN3ccc10CC15x11y15E = {  "_ZN3ccc10CC15x11y15E", // class name
  bases__ZN3ccc10CC15x11y15E, 2,
  &(vtc__ZN3ccc10CC15x11y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x11y15E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y0  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC15x12y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x12y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y03pqrEv
  ~CC15x12y0(); // tgen
  CC15x12y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y0E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y03abcEv");}
void  ccc::CC15x12y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y03efgEv");}
void  ccc::CC15x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y03pqrEv");}
ccc::CC15x12y0 ::~CC15x12y0(){ note_dtor("_ZN3ccc9CC15x12y0E", this);} // tgen
ccc::CC15x12y0 ::CC15x12y0(){ note_ctor("_ZN3ccc9CC15x12y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y0E, buf);
    ::ccc::CC15x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y0E);
    dp->::ccc::CC15x12y0::~CC15x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y0E(Test__ZN3ccc9CC15x12y0E, "_ZN3ccc9CC15x12y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y0C1Ev();
extern void _ZN3ccc9CC15x12y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y0E[] = {
  NSPAIR(_ZN3ccc9CC15x12y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y0E[];
extern void _ZN3ccc9CC15x12y03abcEv();
extern void _ZN3ccc9CC15x12y03efgEv();
extern void _ZN3ccc9CC15x12y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y0E[];
Class_Descriptor cd__ZN3ccc9CC15x12y0E = {  "_ZN3ccc9CC15x12y0E", // class name
  bases__ZN3ccc9CC15x12y0E, 2,
  &(vtc__ZN3ccc9CC15x12y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y1  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC15x12y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x12y13efgEv
  ~CC15x12y1(); // tgen
  CC15x12y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y1E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y13abcEv");}
void  ccc::CC15x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y13pqrEv");}
void  ccc::CC15x12y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y13efgEv");}
ccc::CC15x12y1 ::~CC15x12y1(){ note_dtor("_ZN3ccc9CC15x12y1E", this);} // tgen
ccc::CC15x12y1 ::CC15x12y1(){ note_ctor("_ZN3ccc9CC15x12y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y1E, buf);
    ::ccc::CC15x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y1E);
    dp->::ccc::CC15x12y1::~CC15x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y1E(Test__ZN3ccc9CC15x12y1E, "_ZN3ccc9CC15x12y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y1C1Ev();
extern void _ZN3ccc9CC15x12y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y1E[] = {
  NSPAIR(_ZN3ccc9CC15x12y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y1E[];
extern void _ZN3ccc9CC15x12y13abcEv();
extern void _ZN3ccc9CC15x12y13pqrEv();
extern void _ZN3ccc9CC15x12y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y1E[];
Class_Descriptor cd__ZN3ccc9CC15x12y1E = {  "_ZN3ccc9CC15x12y1E", // class name
  bases__ZN3ccc9CC15x12y1E, 2,
  &(vtc__ZN3ccc9CC15x12y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y2  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC15x12y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x12y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y23pqrEv
  ~CC15x12y2(); // tgen
  CC15x12y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y2E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y23efgEv");}
void  ccc::CC15x12y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y23abcEv");}
void  ccc::CC15x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y23pqrEv");}
ccc::CC15x12y2 ::~CC15x12y2(){ note_dtor("_ZN3ccc9CC15x12y2E", this);} // tgen
ccc::CC15x12y2 ::CC15x12y2(){ note_ctor("_ZN3ccc9CC15x12y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y2E, buf);
    ::ccc::CC15x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y2E);
    dp->::ccc::CC15x12y2::~CC15x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y2E(Test__ZN3ccc9CC15x12y2E, "_ZN3ccc9CC15x12y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y2C1Ev();
extern void _ZN3ccc9CC15x12y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y2E[] = {
  NSPAIR(_ZN3ccc9CC15x12y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y2E[];
extern void _ZN3ccc9CC15x12y23abcEv();
extern void _ZN3ccc9CC15x12y23efgEv();
extern void _ZN3ccc9CC15x12y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y2E[];
Class_Descriptor cd__ZN3ccc9CC15x12y2E = {  "_ZN3ccc9CC15x12y2E", // class name
  bases__ZN3ccc9CC15x12y2E, 2,
  &(vtc__ZN3ccc9CC15x12y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y3  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC15x12y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x12y33abcEv
  ~CC15x12y3(); // tgen
  CC15x12y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y3E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y33efgEv");}
void  ccc::CC15x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y33pqrEv");}
void  ccc::CC15x12y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y33abcEv");}
ccc::CC15x12y3 ::~CC15x12y3(){ note_dtor("_ZN3ccc9CC15x12y3E", this);} // tgen
ccc::CC15x12y3 ::CC15x12y3(){ note_ctor("_ZN3ccc9CC15x12y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y3E, buf);
    ::ccc::CC15x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y3E);
    dp->::ccc::CC15x12y3::~CC15x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y3E(Test__ZN3ccc9CC15x12y3E, "_ZN3ccc9CC15x12y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y3C1Ev();
extern void _ZN3ccc9CC15x12y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y3E[] = {
  NSPAIR(_ZN3ccc9CC15x12y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y3E[];
extern void _ZN3ccc9CC15x12y33abcEv();
extern void _ZN3ccc9CC15x12y33efgEv();
extern void _ZN3ccc9CC15x12y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y33pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y3E[];
Class_Descriptor cd__ZN3ccc9CC15x12y3E = {  "_ZN3ccc9CC15x12y3E", // class name
  bases__ZN3ccc9CC15x12y3E, 2,
  &(vtc__ZN3ccc9CC15x12y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y4  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC15x12y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x12y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x12y43efgEv
  ~CC15x12y4(); // tgen
  CC15x12y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y4E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y43pqrEv");}
void  ccc::CC15x12y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y43abcEv");}
void  ccc::CC15x12y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y43efgEv");}
ccc::CC15x12y4 ::~CC15x12y4(){ note_dtor("_ZN3ccc9CC15x12y4E", this);} // tgen
ccc::CC15x12y4 ::CC15x12y4(){ note_ctor("_ZN3ccc9CC15x12y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y4E, buf);
    ::ccc::CC15x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y4E);
    dp->::ccc::CC15x12y4::~CC15x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y4E(Test__ZN3ccc9CC15x12y4E, "_ZN3ccc9CC15x12y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y4C1Ev();
extern void _ZN3ccc9CC15x12y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y4E[] = {
  NSPAIR(_ZN3ccc9CC15x12y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y4E[];
extern void _ZN3ccc9CC15x12y43abcEv();
extern void _ZN3ccc9CC15x12y43pqrEv();
extern void _ZN3ccc9CC15x12y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y4E[];
Class_Descriptor cd__ZN3ccc9CC15x12y4E = {  "_ZN3ccc9CC15x12y4E", // class name
  bases__ZN3ccc9CC15x12y4E, 2,
  &(vtc__ZN3ccc9CC15x12y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y5  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC15x12y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x12y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x12y53abcEv
  ~CC15x12y5(); // tgen
  CC15x12y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y5E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y53pqrEv");}
void  ccc::CC15x12y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y53efgEv");}
void  ccc::CC15x12y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y53abcEv");}
ccc::CC15x12y5 ::~CC15x12y5(){ note_dtor("_ZN3ccc9CC15x12y5E", this);} // tgen
ccc::CC15x12y5 ::CC15x12y5(){ note_ctor("_ZN3ccc9CC15x12y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y5E, buf);
    ::ccc::CC15x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y5E);
    dp->::ccc::CC15x12y5::~CC15x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y5E(Test__ZN3ccc9CC15x12y5E, "_ZN3ccc9CC15x12y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y5C1Ev();
extern void _ZN3ccc9CC15x12y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y5E[] = {
  NSPAIR(_ZN3ccc9CC15x12y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y5E[];
extern void _ZN3ccc9CC15x12y53abcEv();
extern void _ZN3ccc9CC15x12y53pqrEv();
extern void _ZN3ccc9CC15x12y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y53efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y5E[];
Class_Descriptor cd__ZN3ccc9CC15x12y5E = {  "_ZN3ccc9CC15x12y5E", // class name
  bases__ZN3ccc9CC15x12y5E, 2,
  &(vtc__ZN3ccc9CC15x12y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y6  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC15x12y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x12y63efgEv
  ~CC15x12y6(); // tgen
  CC15x12y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y6E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y63abcEv");}
void  ccc::CC15x12y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y63efgEv");}
ccc::CC15x12y6 ::~CC15x12y6(){ note_dtor("_ZN3ccc9CC15x12y6E", this);} // tgen
ccc::CC15x12y6 ::CC15x12y6(){ note_ctor("_ZN3ccc9CC15x12y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y6E, buf);
    ::ccc::CC15x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y6E);
    dp->::ccc::CC15x12y6::~CC15x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y6E(Test__ZN3ccc9CC15x12y6E, "_ZN3ccc9CC15x12y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y6C1Ev();
extern void _ZN3ccc9CC15x12y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y6E[] = {
  NSPAIR(_ZN3ccc9CC15x12y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y6E[];
extern void _ZN3ccc9CC15x12y63abcEv();
extern void _ZN3ccc9CC15x12y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y6E[];
Class_Descriptor cd__ZN3ccc9CC15x12y6E = {  "_ZN3ccc9CC15x12y6E", // class name
  bases__ZN3ccc9CC15x12y6E, 2,
  &(vtc__ZN3ccc9CC15x12y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y7  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC15x12y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y73pqrEv
  ~CC15x12y7(); // tgen
  CC15x12y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y7E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y73abcEv");}
void  ccc::CC15x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y73pqrEv");}
ccc::CC15x12y7 ::~CC15x12y7(){ note_dtor("_ZN3ccc9CC15x12y7E", this);} // tgen
ccc::CC15x12y7 ::CC15x12y7(){ note_ctor("_ZN3ccc9CC15x12y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y7E, buf);
    ::ccc::CC15x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y7E);
    dp->::ccc::CC15x12y7::~CC15x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y7E(Test__ZN3ccc9CC15x12y7E, "_ZN3ccc9CC15x12y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y7C1Ev();
extern void _ZN3ccc9CC15x12y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y7E[] = {
  NSPAIR(_ZN3ccc9CC15x12y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y7E[];
extern void _ZN3ccc9CC15x12y73abcEv();
extern void _ZN3ccc9CC15x12y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y7E[];
Class_Descriptor cd__ZN3ccc9CC15x12y7E = {  "_ZN3ccc9CC15x12y7E", // class name
  bases__ZN3ccc9CC15x12y7E, 2,
  &(vtc__ZN3ccc9CC15x12y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y8  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC15x12y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x12y83abcEv
  ~CC15x12y8(); // tgen
  CC15x12y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y8E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y83efgEv");}
void  ccc::CC15x12y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x12y83abcEv");}
ccc::CC15x12y8 ::~CC15x12y8(){ note_dtor("_ZN3ccc9CC15x12y8E", this);} // tgen
ccc::CC15x12y8 ::CC15x12y8(){ note_ctor("_ZN3ccc9CC15x12y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y8E, buf);
    ::ccc::CC15x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y8E);
    dp->::ccc::CC15x12y8::~CC15x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y8E(Test__ZN3ccc9CC15x12y8E, "_ZN3ccc9CC15x12y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y8C1Ev();
extern void _ZN3ccc9CC15x12y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y8E[] = {
  NSPAIR(_ZN3ccc9CC15x12y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y8E[];
extern void _ZN3ccc9CC15x12y83abcEv();
extern void _ZN3ccc9CC15x12y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y83efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y8E[];
Class_Descriptor cd__ZN3ccc9CC15x12y8E = {  "_ZN3ccc9CC15x12y8E", // class name
  bases__ZN3ccc9CC15x12y8E, 2,
  &(vtc__ZN3ccc9CC15x12y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y9  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC15x12y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x12y93pqrEv
  ~CC15x12y9(); // tgen
  CC15x12y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x12y9E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x12y93efgEv");}
void  ccc::CC15x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x12y93pqrEv");}
ccc::CC15x12y9 ::~CC15x12y9(){ note_dtor("_ZN3ccc9CC15x12y9E", this);} // tgen
ccc::CC15x12y9 ::CC15x12y9(){ note_ctor("_ZN3ccc9CC15x12y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x12y9E, buf);
    ::ccc::CC15x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x12y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC15x12y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x12y9E);
    dp->::ccc::CC15x12y9::~CC15x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x12y9E(Test__ZN3ccc9CC15x12y9E, "_ZN3ccc9CC15x12y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x12y9C1Ev();
extern void _ZN3ccc9CC15x12y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x12y9E[] = {
  NSPAIR(_ZN3ccc9CC15x12y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC15x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC15x12y93efgEv();
extern void _ZN3ccc9CC15x12y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x12y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x12y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x12y9E[];
Class_Descriptor cd__ZN3ccc9CC15x12y9E = {  "_ZN3ccc9CC15x12y9E", // class name
  bases__ZN3ccc9CC15x12y9E, 2,
  &(vtc__ZN3ccc9CC15x12y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x12y9E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y10  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC15x12y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x12y103abcEv
  ~CC15x12y10(); // tgen
  CC15x12y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y10E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x12y103pqrEv");}
void  ccc::CC15x12y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x12y103abcEv");}
ccc::CC15x12y10 ::~CC15x12y10(){ note_dtor("_ZN3ccc10CC15x12y10E", this);} // tgen
ccc::CC15x12y10 ::CC15x12y10(){ note_ctor("_ZN3ccc10CC15x12y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y10E, buf);
    ::ccc::CC15x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y10E);
    dp->::ccc::CC15x12y10::~CC15x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y10E(Test__ZN3ccc10CC15x12y10E, "_ZN3ccc10CC15x12y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y10C1Ev();
extern void _ZN3ccc10CC15x12y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y10E[] = {
  NSPAIR(_ZN3ccc10CC15x12y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y10E[];
extern void _ZN3ccc10CC15x12y103abcEv();
extern void _ZN3ccc10CC15x12y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y103pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y10E[];
Class_Descriptor cd__ZN3ccc10CC15x12y10E = {  "_ZN3ccc10CC15x12y10E", // class name
  bases__ZN3ccc10CC15x12y10E, 2,
  &(vtc__ZN3ccc10CC15x12y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y11  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC15x12y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x12y113efgEv
  ~CC15x12y11(); // tgen
  CC15x12y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y11E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x12y113pqrEv");}
void  ccc::CC15x12y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x12y113efgEv");}
ccc::CC15x12y11 ::~CC15x12y11(){ note_dtor("_ZN3ccc10CC15x12y11E", this);} // tgen
ccc::CC15x12y11 ::CC15x12y11(){ note_ctor("_ZN3ccc10CC15x12y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y11E, buf);
    ::ccc::CC15x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y11E);
    dp->::ccc::CC15x12y11::~CC15x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y11E(Test__ZN3ccc10CC15x12y11E, "_ZN3ccc10CC15x12y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y11C1Ev();
extern void _ZN3ccc10CC15x12y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y11E[] = {
  NSPAIR(_ZN3ccc10CC15x12y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc10CC15x12y113pqrEv();
extern void _ZN3ccc10CC15x12y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y11E[];
Class_Descriptor cd__ZN3ccc10CC15x12y11E = {  "_ZN3ccc10CC15x12y11E", // class name
  bases__ZN3ccc10CC15x12y11E, 2,
  &(vtc__ZN3ccc10CC15x12y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y11E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y12  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc10CC15x12y123abcEv
  ~CC15x12y12(); // tgen
  CC15x12y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y12E) C1{ BC2{} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC15x12y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x12y123abcEv");}
ccc::CC15x12y12 ::~CC15x12y12(){ note_dtor("_ZN3ccc10CC15x12y12E", this);} // tgen
ccc::CC15x12y12 ::CC15x12y12(){ note_ctor("_ZN3ccc10CC15x12y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y12E, buf);
    ::ccc::CC15x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y12E);
    dp->::ccc::CC15x12y12::~CC15x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y12E(Test__ZN3ccc10CC15x12y12E, "_ZN3ccc10CC15x12y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y12C1Ev();
extern void _ZN3ccc10CC15x12y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y12E[] = {
  NSPAIR(_ZN3ccc10CC15x12y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y12E[];
extern void _ZN3ccc10CC15x12y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y12E[];
Class_Descriptor cd__ZN3ccc10CC15x12y12E = {  "_ZN3ccc10CC15x12y12E", // class name
  bases__ZN3ccc10CC15x12y12E, 2,
  &(vtc__ZN3ccc10CC15x12y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y12E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y13  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc10CC15x12y133efgEv
  ~CC15x12y13(); // tgen
  CC15x12y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y13E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x12y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x12y133efgEv");}
ccc::CC15x12y13 ::~CC15x12y13(){ note_dtor("_ZN3ccc10CC15x12y13E", this);} // tgen
ccc::CC15x12y13 ::CC15x12y13(){ note_ctor("_ZN3ccc10CC15x12y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y13E, buf);
    ::ccc::CC15x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y13E);
    dp->::ccc::CC15x12y13::~CC15x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y13E(Test__ZN3ccc10CC15x12y13E, "_ZN3ccc10CC15x12y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y13C1Ev();
extern void _ZN3ccc10CC15x12y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y13E[] = {
  NSPAIR(_ZN3ccc10CC15x12y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc10CC15x12y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y13E[];
Class_Descriptor cd__ZN3ccc10CC15x12y13E = {  "_ZN3ccc10CC15x12y13E", // class name
  bases__ZN3ccc10CC15x12y13E, 2,
  &(vtc__ZN3ccc10CC15x12y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y14  : ::ccc::AA15 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc10CC15x12y143pqrEv
  ~CC15x12y14(); // tgen
  CC15x12y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y14E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x12y143pqrEv");}
ccc::CC15x12y14 ::~CC15x12y14(){ note_dtor("_ZN3ccc10CC15x12y14E", this);} // tgen
ccc::CC15x12y14 ::CC15x12y14(){ note_ctor("_ZN3ccc10CC15x12y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y14E, buf);
    ::ccc::CC15x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y14E);
    dp->::ccc::CC15x12y14::~CC15x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y14E(Test__ZN3ccc10CC15x12y14E, "_ZN3ccc10CC15x12y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y14C1Ev();
extern void _ZN3ccc10CC15x12y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y14E[] = {
  NSPAIR(_ZN3ccc10CC15x12y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc10CC15x12y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x12y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y14E[];
Class_Descriptor cd__ZN3ccc10CC15x12y14E = {  "_ZN3ccc10CC15x12y14E", // class name
  bases__ZN3ccc10CC15x12y14E, 2,
  &(vtc__ZN3ccc10CC15x12y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x12y15  : ::ccc::AA15 , ::ccc::BB12 {
  ~CC15x12y15(); // tgen
  CC15x12y15(); // tgen
};
//SIG(1 _ZN3ccc10CC15x12y15E) C1{ BC2{} BC3{ v1}}
}
namespace ccc { 
ccc::CC15x12y15 ::~CC15x12y15(){ note_dtor("_ZN3ccc10CC15x12y15E", this);} // tgen
ccc::CC15x12y15 ::CC15x12y15(){ note_ctor("_ZN3ccc10CC15x12y15E", this);} // tgen
}
static void Test__ZN3ccc10CC15x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x12y15E, buf);
    ::ccc::CC15x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x12y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc10CC15x12y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x12y15E);
    dp->::ccc::CC15x12y15::~CC15x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x12y15E(Test__ZN3ccc10CC15x12y15E, "_ZN3ccc10CC15x12y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x12y15C1Ev();
extern void _ZN3ccc10CC15x12y15D1Ev();
Name_Map name_map__ZN3ccc10CC15x12y15E[] = {
  NSPAIR(_ZN3ccc10CC15x12y15C1Ev),
  NSPAIR(_ZN3ccc10CC15x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc10CC15x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB12E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y15E[];
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x12y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x12y15E[];
Class_Descriptor cd__ZN3ccc10CC15x12y15E = {  "_ZN3ccc10CC15x12y15E", // class name
  bases__ZN3ccc10CC15x12y15E, 2,
  &(vtc__ZN3ccc10CC15x12y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x12y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y0  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC15x13y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x13y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y03pqrEv
  ~CC15x13y0(); // tgen
  CC15x13y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y0E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y03abcEv");}
void  ccc::CC15x13y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y03efgEv");}
void  ccc::CC15x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y03pqrEv");}
ccc::CC15x13y0 ::~CC15x13y0(){ note_dtor("_ZN3ccc9CC15x13y0E", this);} // tgen
ccc::CC15x13y0 ::CC15x13y0(){ note_ctor("_ZN3ccc9CC15x13y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y0E, buf);
    ::ccc::CC15x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y0E);
    dp->::ccc::CC15x13y0::~CC15x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y0E(Test__ZN3ccc9CC15x13y0E, "_ZN3ccc9CC15x13y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y0C1Ev();
extern void _ZN3ccc9CC15x13y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y0E[] = {
  NSPAIR(_ZN3ccc9CC15x13y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y0E[];
extern void _ZN3ccc9CC15x13y03efgEv();
extern void _ZN3ccc9CC15x13y03abcEv();
extern void _ZN3ccc9CC15x13y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y0E[];
Class_Descriptor cd__ZN3ccc9CC15x13y0E = {  "_ZN3ccc9CC15x13y0E", // class name
  bases__ZN3ccc9CC15x13y0E, 2,
  &(vtc__ZN3ccc9CC15x13y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y1  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC15x13y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x13y13efgEv
  ~CC15x13y1(); // tgen
  CC15x13y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y1E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y13abcEv");}
void  ccc::CC15x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y13pqrEv");}
void  ccc::CC15x13y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y13efgEv");}
ccc::CC15x13y1 ::~CC15x13y1(){ note_dtor("_ZN3ccc9CC15x13y1E", this);} // tgen
ccc::CC15x13y1 ::CC15x13y1(){ note_ctor("_ZN3ccc9CC15x13y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y1E, buf);
    ::ccc::CC15x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y1E);
    dp->::ccc::CC15x13y1::~CC15x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y1E(Test__ZN3ccc9CC15x13y1E, "_ZN3ccc9CC15x13y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y1C1Ev();
extern void _ZN3ccc9CC15x13y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y1E[] = {
  NSPAIR(_ZN3ccc9CC15x13y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y1E[];
extern void _ZN3ccc9CC15x13y13efgEv();
extern void _ZN3ccc9CC15x13y13abcEv();
extern void _ZN3ccc9CC15x13y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y13pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y1E[];
Class_Descriptor cd__ZN3ccc9CC15x13y1E = {  "_ZN3ccc9CC15x13y1E", // class name
  bases__ZN3ccc9CC15x13y1E, 2,
  &(vtc__ZN3ccc9CC15x13y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y2  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC15x13y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x13y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y23pqrEv
  ~CC15x13y2(); // tgen
  CC15x13y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y2E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y23efgEv");}
void  ccc::CC15x13y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y23abcEv");}
void  ccc::CC15x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y23pqrEv");}
ccc::CC15x13y2 ::~CC15x13y2(){ note_dtor("_ZN3ccc9CC15x13y2E", this);} // tgen
ccc::CC15x13y2 ::CC15x13y2(){ note_ctor("_ZN3ccc9CC15x13y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y2E, buf);
    ::ccc::CC15x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y2E);
    dp->::ccc::CC15x13y2::~CC15x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y2E(Test__ZN3ccc9CC15x13y2E, "_ZN3ccc9CC15x13y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y2C1Ev();
extern void _ZN3ccc9CC15x13y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y2E[] = {
  NSPAIR(_ZN3ccc9CC15x13y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y2E[];
extern void _ZN3ccc9CC15x13y23efgEv();
extern void _ZN3ccc9CC15x13y23abcEv();
extern void _ZN3ccc9CC15x13y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y2E[];
Class_Descriptor cd__ZN3ccc9CC15x13y2E = {  "_ZN3ccc9CC15x13y2E", // class name
  bases__ZN3ccc9CC15x13y2E, 2,
  &(vtc__ZN3ccc9CC15x13y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y3  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC15x13y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x13y33abcEv
  ~CC15x13y3(); // tgen
  CC15x13y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y3E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y33efgEv");}
void  ccc::CC15x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y33pqrEv");}
void  ccc::CC15x13y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y33abcEv");}
ccc::CC15x13y3 ::~CC15x13y3(){ note_dtor("_ZN3ccc9CC15x13y3E", this);} // tgen
ccc::CC15x13y3 ::CC15x13y3(){ note_ctor("_ZN3ccc9CC15x13y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y3E, buf);
    ::ccc::CC15x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y3E);
    dp->::ccc::CC15x13y3::~CC15x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y3E(Test__ZN3ccc9CC15x13y3E, "_ZN3ccc9CC15x13y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y3C1Ev();
extern void _ZN3ccc9CC15x13y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y3E[] = {
  NSPAIR(_ZN3ccc9CC15x13y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y3E[];
extern void _ZN3ccc9CC15x13y33efgEv();
extern void _ZN3ccc9CC15x13y33pqrEv();
extern void _ZN3ccc9CC15x13y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y3E[];
Class_Descriptor cd__ZN3ccc9CC15x13y3E = {  "_ZN3ccc9CC15x13y3E", // class name
  bases__ZN3ccc9CC15x13y3E, 2,
  &(vtc__ZN3ccc9CC15x13y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y4  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC15x13y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x13y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x13y43efgEv
  ~CC15x13y4(); // tgen
  CC15x13y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y4E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y43pqrEv");}
void  ccc::CC15x13y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y43abcEv");}
void  ccc::CC15x13y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y43efgEv");}
ccc::CC15x13y4 ::~CC15x13y4(){ note_dtor("_ZN3ccc9CC15x13y4E", this);} // tgen
ccc::CC15x13y4 ::CC15x13y4(){ note_ctor("_ZN3ccc9CC15x13y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y4E, buf);
    ::ccc::CC15x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y4E);
    dp->::ccc::CC15x13y4::~CC15x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y4E(Test__ZN3ccc9CC15x13y4E, "_ZN3ccc9CC15x13y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y4C1Ev();
extern void _ZN3ccc9CC15x13y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y4E[] = {
  NSPAIR(_ZN3ccc9CC15x13y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y4E[];
extern void _ZN3ccc9CC15x13y43efgEv();
extern void _ZN3ccc9CC15x13y43pqrEv();
extern void _ZN3ccc9CC15x13y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y43abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y4E[];
Class_Descriptor cd__ZN3ccc9CC15x13y4E = {  "_ZN3ccc9CC15x13y4E", // class name
  bases__ZN3ccc9CC15x13y4E, 2,
  &(vtc__ZN3ccc9CC15x13y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y5  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC15x13y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x13y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x13y53abcEv
  ~CC15x13y5(); // tgen
  CC15x13y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y5E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y53pqrEv");}
void  ccc::CC15x13y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y53efgEv");}
void  ccc::CC15x13y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y53abcEv");}
ccc::CC15x13y5 ::~CC15x13y5(){ note_dtor("_ZN3ccc9CC15x13y5E", this);} // tgen
ccc::CC15x13y5 ::CC15x13y5(){ note_ctor("_ZN3ccc9CC15x13y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y5E, buf);
    ::ccc::CC15x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y5E);
    dp->::ccc::CC15x13y5::~CC15x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y5E(Test__ZN3ccc9CC15x13y5E, "_ZN3ccc9CC15x13y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y5C1Ev();
extern void _ZN3ccc9CC15x13y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y5E[] = {
  NSPAIR(_ZN3ccc9CC15x13y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y5E[];
extern void _ZN3ccc9CC15x13y53efgEv();
extern void _ZN3ccc9CC15x13y53pqrEv();
extern void _ZN3ccc9CC15x13y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y5E[];
Class_Descriptor cd__ZN3ccc9CC15x13y5E = {  "_ZN3ccc9CC15x13y5E", // class name
  bases__ZN3ccc9CC15x13y5E, 2,
  &(vtc__ZN3ccc9CC15x13y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y6  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC15x13y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x13y63efgEv
  ~CC15x13y6(); // tgen
  CC15x13y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y6E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y63abcEv");}
void  ccc::CC15x13y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y63efgEv");}
ccc::CC15x13y6 ::~CC15x13y6(){ note_dtor("_ZN3ccc9CC15x13y6E", this);} // tgen
ccc::CC15x13y6 ::CC15x13y6(){ note_ctor("_ZN3ccc9CC15x13y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y6E, buf);
    ::ccc::CC15x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y6E);
    dp->::ccc::CC15x13y6::~CC15x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y6E(Test__ZN3ccc9CC15x13y6E, "_ZN3ccc9CC15x13y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y6C1Ev();
extern void _ZN3ccc9CC15x13y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y6E[] = {
  NSPAIR(_ZN3ccc9CC15x13y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y6E[];
extern void _ZN3ccc9CC15x13y63efgEv();
extern void _ZN3ccc9CC15x13y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y63abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y6E[];
Class_Descriptor cd__ZN3ccc9CC15x13y6E = {  "_ZN3ccc9CC15x13y6E", // class name
  bases__ZN3ccc9CC15x13y6E, 2,
  &(vtc__ZN3ccc9CC15x13y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y6E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y7  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC15x13y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y73pqrEv
  ~CC15x13y7(); // tgen
  CC15x13y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y7E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y73abcEv");}
void  ccc::CC15x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y73pqrEv");}
ccc::CC15x13y7 ::~CC15x13y7(){ note_dtor("_ZN3ccc9CC15x13y7E", this);} // tgen
ccc::CC15x13y7 ::CC15x13y7(){ note_ctor("_ZN3ccc9CC15x13y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y7E, buf);
    ::ccc::CC15x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y7E);
    dp->::ccc::CC15x13y7::~CC15x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y7E(Test__ZN3ccc9CC15x13y7E, "_ZN3ccc9CC15x13y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y7C1Ev();
extern void _ZN3ccc9CC15x13y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y7E[] = {
  NSPAIR(_ZN3ccc9CC15x13y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC15x13y73abcEv();
extern void _ZN3ccc9CC15x13y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y7E[];
Class_Descriptor cd__ZN3ccc9CC15x13y7E = {  "_ZN3ccc9CC15x13y7E", // class name
  bases__ZN3ccc9CC15x13y7E, 2,
  &(vtc__ZN3ccc9CC15x13y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y7E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y8  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC15x13y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x13y83abcEv
  ~CC15x13y8(); // tgen
  CC15x13y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y8E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y83efgEv");}
void  ccc::CC15x13y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x13y83abcEv");}
ccc::CC15x13y8 ::~CC15x13y8(){ note_dtor("_ZN3ccc9CC15x13y8E", this);} // tgen
ccc::CC15x13y8 ::CC15x13y8(){ note_ctor("_ZN3ccc9CC15x13y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y8E, buf);
    ::ccc::CC15x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y8E);
    dp->::ccc::CC15x13y8::~CC15x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y8E(Test__ZN3ccc9CC15x13y8E, "_ZN3ccc9CC15x13y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y8C1Ev();
extern void _ZN3ccc9CC15x13y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y8E[] = {
  NSPAIR(_ZN3ccc9CC15x13y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y8E[];
extern void _ZN3ccc9CC15x13y83efgEv();
extern void _ZN3ccc9CC15x13y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y8E[];
Class_Descriptor cd__ZN3ccc9CC15x13y8E = {  "_ZN3ccc9CC15x13y8E", // class name
  bases__ZN3ccc9CC15x13y8E, 2,
  &(vtc__ZN3ccc9CC15x13y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y8E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y9  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC15x13y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x13y93pqrEv
  ~CC15x13y9(); // tgen
  CC15x13y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x13y9E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x13y93efgEv");}
void  ccc::CC15x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x13y93pqrEv");}
ccc::CC15x13y9 ::~CC15x13y9(){ note_dtor("_ZN3ccc9CC15x13y9E", this);} // tgen
ccc::CC15x13y9 ::CC15x13y9(){ note_ctor("_ZN3ccc9CC15x13y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x13y9E, buf);
    ::ccc::CC15x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x13y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC15x13y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x13y9E);
    dp->::ccc::CC15x13y9::~CC15x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x13y9E(Test__ZN3ccc9CC15x13y9E, "_ZN3ccc9CC15x13y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x13y9C1Ev();
extern void _ZN3ccc9CC15x13y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x13y9E[] = {
  NSPAIR(_ZN3ccc9CC15x13y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC15x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y9E[];
extern void _ZN3ccc9CC15x13y93efgEv();
extern void _ZN3ccc9CC15x13y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x13y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x13y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x13y9E[];
Class_Descriptor cd__ZN3ccc9CC15x13y9E = {  "_ZN3ccc9CC15x13y9E", // class name
  bases__ZN3ccc9CC15x13y9E, 2,
  &(vtc__ZN3ccc9CC15x13y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x13y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y10  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC15x13y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x13y103abcEv
  ~CC15x13y10(); // tgen
  CC15x13y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y10E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x13y103pqrEv");}
void  ccc::CC15x13y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x13y103abcEv");}
ccc::CC15x13y10 ::~CC15x13y10(){ note_dtor("_ZN3ccc10CC15x13y10E", this);} // tgen
ccc::CC15x13y10 ::CC15x13y10(){ note_ctor("_ZN3ccc10CC15x13y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y10E, buf);
    ::ccc::CC15x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y10E);
    dp->::ccc::CC15x13y10::~CC15x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y10E(Test__ZN3ccc10CC15x13y10E, "_ZN3ccc10CC15x13y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y10C1Ev();
extern void _ZN3ccc10CC15x13y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y10E[] = {
  NSPAIR(_ZN3ccc10CC15x13y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc10CC15x13y103pqrEv();
extern void _ZN3ccc10CC15x13y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y10E[];
Class_Descriptor cd__ZN3ccc10CC15x13y10E = {  "_ZN3ccc10CC15x13y10E", // class name
  bases__ZN3ccc10CC15x13y10E, 2,
  &(vtc__ZN3ccc10CC15x13y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y10E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y11  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC15x13y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x13y113efgEv
  ~CC15x13y11(); // tgen
  CC15x13y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y11E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x13y113pqrEv");}
void  ccc::CC15x13y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x13y113efgEv");}
ccc::CC15x13y11 ::~CC15x13y11(){ note_dtor("_ZN3ccc10CC15x13y11E", this);} // tgen
ccc::CC15x13y11 ::CC15x13y11(){ note_ctor("_ZN3ccc10CC15x13y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y11E, buf);
    ::ccc::CC15x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y11E);
    dp->::ccc::CC15x13y11::~CC15x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y11E(Test__ZN3ccc10CC15x13y11E, "_ZN3ccc10CC15x13y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y11C1Ev();
extern void _ZN3ccc10CC15x13y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y11E[] = {
  NSPAIR(_ZN3ccc10CC15x13y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y11E[];
extern void _ZN3ccc10CC15x13y113efgEv();
extern void _ZN3ccc10CC15x13y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y113pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y11E[];
Class_Descriptor cd__ZN3ccc10CC15x13y11E = {  "_ZN3ccc10CC15x13y11E", // class name
  bases__ZN3ccc10CC15x13y11E, 2,
  &(vtc__ZN3ccc10CC15x13y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y12  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc10CC15x13y123abcEv
  ~CC15x13y12(); // tgen
  CC15x13y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y12E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x13y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x13y123abcEv");}
ccc::CC15x13y12 ::~CC15x13y12(){ note_dtor("_ZN3ccc10CC15x13y12E", this);} // tgen
ccc::CC15x13y12 ::CC15x13y12(){ note_ctor("_ZN3ccc10CC15x13y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y12E, buf);
    ::ccc::CC15x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y12E);
    dp->::ccc::CC15x13y12::~CC15x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y12E(Test__ZN3ccc10CC15x13y12E, "_ZN3ccc10CC15x13y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y12C1Ev();
extern void _ZN3ccc10CC15x13y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y12E[] = {
  NSPAIR(_ZN3ccc10CC15x13y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc10CC15x13y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y12E[];
Class_Descriptor cd__ZN3ccc10CC15x13y12E = {  "_ZN3ccc10CC15x13y12E", // class name
  bases__ZN3ccc10CC15x13y12E, 2,
  &(vtc__ZN3ccc10CC15x13y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y13  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc10CC15x13y133efgEv
  ~CC15x13y13(); // tgen
  CC15x13y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y13E) C1{ BC2{} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC15x13y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x13y133efgEv");}
ccc::CC15x13y13 ::~CC15x13y13(){ note_dtor("_ZN3ccc10CC15x13y13E", this);} // tgen
ccc::CC15x13y13 ::CC15x13y13(){ note_ctor("_ZN3ccc10CC15x13y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y13E, buf);
    ::ccc::CC15x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y13E);
    dp->::ccc::CC15x13y13::~CC15x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y13E(Test__ZN3ccc10CC15x13y13E, "_ZN3ccc10CC15x13y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y13C1Ev();
extern void _ZN3ccc10CC15x13y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y13E[] = {
  NSPAIR(_ZN3ccc10CC15x13y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y13E[];
extern void _ZN3ccc10CC15x13y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y13E[];
Class_Descriptor cd__ZN3ccc10CC15x13y13E = {  "_ZN3ccc10CC15x13y13E", // class name
  bases__ZN3ccc10CC15x13y13E, 2,
  &(vtc__ZN3ccc10CC15x13y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y13E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y14  : ::ccc::AA15 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc10CC15x13y143pqrEv
  ~CC15x13y14(); // tgen
  CC15x13y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y14E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x13y143pqrEv");}
ccc::CC15x13y14 ::~CC15x13y14(){ note_dtor("_ZN3ccc10CC15x13y14E", this);} // tgen
ccc::CC15x13y14 ::CC15x13y14(){ note_ctor("_ZN3ccc10CC15x13y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y14E, buf);
    ::ccc::CC15x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y14E);
    dp->::ccc::CC15x13y14::~CC15x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y14E(Test__ZN3ccc10CC15x13y14E, "_ZN3ccc10CC15x13y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y14C1Ev();
extern void _ZN3ccc10CC15x13y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y14E[] = {
  NSPAIR(_ZN3ccc10CC15x13y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc10CC15x13y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x13y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y14E[];
Class_Descriptor cd__ZN3ccc10CC15x13y14E = {  "_ZN3ccc10CC15x13y14E", // class name
  bases__ZN3ccc10CC15x13y14E, 2,
  &(vtc__ZN3ccc10CC15x13y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y14E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x13y15  : ::ccc::AA15 , ::ccc::BB13 {
  ~CC15x13y15(); // tgen
  CC15x13y15(); // tgen
};
//SIG(1 _ZN3ccc10CC15x13y15E) C1{ BC2{} BC3{ v1}}
}
namespace ccc { 
ccc::CC15x13y15 ::~CC15x13y15(){ note_dtor("_ZN3ccc10CC15x13y15E", this);} // tgen
ccc::CC15x13y15 ::CC15x13y15(){ note_ctor("_ZN3ccc10CC15x13y15E", this);} // tgen
}
static void Test__ZN3ccc10CC15x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x13y15E, buf);
    ::ccc::CC15x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x13y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc10CC15x13y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x13y15E);
    dp->::ccc::CC15x13y15::~CC15x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x13y15E(Test__ZN3ccc10CC15x13y15E, "_ZN3ccc10CC15x13y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x13y15C1Ev();
extern void _ZN3ccc10CC15x13y15D1Ev();
Name_Map name_map__ZN3ccc10CC15x13y15E[] = {
  NSPAIR(_ZN3ccc10CC15x13y15C1Ev),
  NSPAIR(_ZN3ccc10CC15x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc10CC15x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB13E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y15E[];
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x13y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x13y15E[];
Class_Descriptor cd__ZN3ccc10CC15x13y15E = {  "_ZN3ccc10CC15x13y15E", // class name
  bases__ZN3ccc10CC15x13y15E, 2,
  &(vtc__ZN3ccc10CC15x13y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x13y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y0  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC15x14y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x14y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y03pqrEv
  ~CC15x14y0(); // tgen
  CC15x14y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y0E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y03abcEv");}
void  ccc::CC15x14y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y03efgEv");}
void  ccc::CC15x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y03pqrEv");}
ccc::CC15x14y0 ::~CC15x14y0(){ note_dtor("_ZN3ccc9CC15x14y0E", this);} // tgen
ccc::CC15x14y0 ::CC15x14y0(){ note_ctor("_ZN3ccc9CC15x14y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y0E, buf);
    ::ccc::CC15x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y0E);
    dp->::ccc::CC15x14y0::~CC15x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y0E(Test__ZN3ccc9CC15x14y0E, "_ZN3ccc9CC15x14y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y0C1Ev();
extern void _ZN3ccc9CC15x14y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y0E[] = {
  NSPAIR(_ZN3ccc9CC15x14y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y0E[];
extern void _ZN3ccc9CC15x14y03pqrEv();
extern void _ZN3ccc9CC15x14y03abcEv();
extern void _ZN3ccc9CC15x14y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y03efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y0E[];
Class_Descriptor cd__ZN3ccc9CC15x14y0E = {  "_ZN3ccc9CC15x14y0E", // class name
  bases__ZN3ccc9CC15x14y0E, 2,
  &(vtc__ZN3ccc9CC15x14y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y1  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC15x14y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x14y13efgEv
  ~CC15x14y1(); // tgen
  CC15x14y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y1E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y13abcEv");}
void  ccc::CC15x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y13pqrEv");}
void  ccc::CC15x14y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y13efgEv");}
ccc::CC15x14y1 ::~CC15x14y1(){ note_dtor("_ZN3ccc9CC15x14y1E", this);} // tgen
ccc::CC15x14y1 ::CC15x14y1(){ note_ctor("_ZN3ccc9CC15x14y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y1E, buf);
    ::ccc::CC15x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y1E);
    dp->::ccc::CC15x14y1::~CC15x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y1E(Test__ZN3ccc9CC15x14y1E, "_ZN3ccc9CC15x14y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y1C1Ev();
extern void _ZN3ccc9CC15x14y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y1E[] = {
  NSPAIR(_ZN3ccc9CC15x14y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y1E[];
extern void _ZN3ccc9CC15x14y13pqrEv();
extern void _ZN3ccc9CC15x14y13abcEv();
extern void _ZN3ccc9CC15x14y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y1E[];
Class_Descriptor cd__ZN3ccc9CC15x14y1E = {  "_ZN3ccc9CC15x14y1E", // class name
  bases__ZN3ccc9CC15x14y1E, 2,
  &(vtc__ZN3ccc9CC15x14y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y1E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y2  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC15x14y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x14y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y23pqrEv
  ~CC15x14y2(); // tgen
  CC15x14y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y2E) C1{ BC2{} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y23efgEv");}
void  ccc::CC15x14y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y23abcEv");}
void  ccc::CC15x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y23pqrEv");}
ccc::CC15x14y2 ::~CC15x14y2(){ note_dtor("_ZN3ccc9CC15x14y2E", this);} // tgen
ccc::CC15x14y2 ::CC15x14y2(){ note_ctor("_ZN3ccc9CC15x14y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y2E, buf);
    ::ccc::CC15x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y2E);
    dp->::ccc::CC15x14y2::~CC15x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y2E(Test__ZN3ccc9CC15x14y2E, "_ZN3ccc9CC15x14y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y2C1Ev();
extern void _ZN3ccc9CC15x14y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y2E[] = {
  NSPAIR(_ZN3ccc9CC15x14y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y2E[];
extern void _ZN3ccc9CC15x14y23pqrEv();
extern void _ZN3ccc9CC15x14y23efgEv();
extern void _ZN3ccc9CC15x14y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y23abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y2E[];
Class_Descriptor cd__ZN3ccc9CC15x14y2E = {  "_ZN3ccc9CC15x14y2E", // class name
  bases__ZN3ccc9CC15x14y2E, 2,
  &(vtc__ZN3ccc9CC15x14y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y2E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y3  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC15x14y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x14y33abcEv
  ~CC15x14y3(); // tgen
  CC15x14y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y3E) C1{ BC2{} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y33efgEv");}
void  ccc::CC15x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y33pqrEv");}
void  ccc::CC15x14y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y33abcEv");}
ccc::CC15x14y3 ::~CC15x14y3(){ note_dtor("_ZN3ccc9CC15x14y3E", this);} // tgen
ccc::CC15x14y3 ::CC15x14y3(){ note_ctor("_ZN3ccc9CC15x14y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y3E, buf);
    ::ccc::CC15x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y3E);
    dp->::ccc::CC15x14y3::~CC15x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y3E(Test__ZN3ccc9CC15x14y3E, "_ZN3ccc9CC15x14y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y3C1Ev();
extern void _ZN3ccc9CC15x14y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y3E[] = {
  NSPAIR(_ZN3ccc9CC15x14y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y3E[];
extern void _ZN3ccc9CC15x14y33pqrEv();
extern void _ZN3ccc9CC15x14y33efgEv();
extern void _ZN3ccc9CC15x14y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y3E[];
Class_Descriptor cd__ZN3ccc9CC15x14y3E = {  "_ZN3ccc9CC15x14y3E", // class name
  bases__ZN3ccc9CC15x14y3E, 2,
  &(vtc__ZN3ccc9CC15x14y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y3E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y4  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC15x14y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x14y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x14y43efgEv
  ~CC15x14y4(); // tgen
  CC15x14y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y4E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y43pqrEv");}
void  ccc::CC15x14y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y43abcEv");}
void  ccc::CC15x14y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y43efgEv");}
ccc::CC15x14y4 ::~CC15x14y4(){ note_dtor("_ZN3ccc9CC15x14y4E", this);} // tgen
ccc::CC15x14y4 ::CC15x14y4(){ note_ctor("_ZN3ccc9CC15x14y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y4E, buf);
    ::ccc::CC15x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y4E);
    dp->::ccc::CC15x14y4::~CC15x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y4E(Test__ZN3ccc9CC15x14y4E, "_ZN3ccc9CC15x14y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y4C1Ev();
extern void _ZN3ccc9CC15x14y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y4E[] = {
  NSPAIR(_ZN3ccc9CC15x14y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y4E[];
extern void _ZN3ccc9CC15x14y43pqrEv();
extern void _ZN3ccc9CC15x14y43abcEv();
extern void _ZN3ccc9CC15x14y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y4E[];
Class_Descriptor cd__ZN3ccc9CC15x14y4E = {  "_ZN3ccc9CC15x14y4E", // class name
  bases__ZN3ccc9CC15x14y4E, 2,
  &(vtc__ZN3ccc9CC15x14y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y4E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y5  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC15x14y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x14y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x14y53abcEv
  ~CC15x14y5(); // tgen
  CC15x14y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y5E) C1{ BC2{} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y53pqrEv");}
void  ccc::CC15x14y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y53efgEv");}
void  ccc::CC15x14y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y53abcEv");}
ccc::CC15x14y5 ::~CC15x14y5(){ note_dtor("_ZN3ccc9CC15x14y5E", this);} // tgen
ccc::CC15x14y5 ::CC15x14y5(){ note_ctor("_ZN3ccc9CC15x14y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y5E, buf);
    ::ccc::CC15x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y5E);
    dp->::ccc::CC15x14y5::~CC15x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y5E(Test__ZN3ccc9CC15x14y5E, "_ZN3ccc9CC15x14y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y5C1Ev();
extern void _ZN3ccc9CC15x14y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y5E[] = {
  NSPAIR(_ZN3ccc9CC15x14y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y5E[];
extern void _ZN3ccc9CC15x14y53pqrEv();
extern void _ZN3ccc9CC15x14y53efgEv();
extern void _ZN3ccc9CC15x14y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y5E[];
Class_Descriptor cd__ZN3ccc9CC15x14y5E = {  "_ZN3ccc9CC15x14y5E", // class name
  bases__ZN3ccc9CC15x14y5E, 2,
  &(vtc__ZN3ccc9CC15x14y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y5E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y6  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC15x14y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x14y63efgEv
  ~CC15x14y6(); // tgen
  CC15x14y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y6E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y63abcEv");}
void  ccc::CC15x14y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y63efgEv");}
ccc::CC15x14y6 ::~CC15x14y6(){ note_dtor("_ZN3ccc9CC15x14y6E", this);} // tgen
ccc::CC15x14y6 ::CC15x14y6(){ note_ctor("_ZN3ccc9CC15x14y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y6E, buf);
    ::ccc::CC15x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y6E);
    dp->::ccc::CC15x14y6::~CC15x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y6E(Test__ZN3ccc9CC15x14y6E, "_ZN3ccc9CC15x14y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y6C1Ev();
extern void _ZN3ccc9CC15x14y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y6E[] = {
  NSPAIR(_ZN3ccc9CC15x14y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC15x14y63abcEv();
extern void _ZN3ccc9CC15x14y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y6E[];
Class_Descriptor cd__ZN3ccc9CC15x14y6E = {  "_ZN3ccc9CC15x14y6E", // class name
  bases__ZN3ccc9CC15x14y6E, 2,
  &(vtc__ZN3ccc9CC15x14y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y6E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y7  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC15x14y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y73pqrEv
  ~CC15x14y7(); // tgen
  CC15x14y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y7E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y73abcEv");}
void  ccc::CC15x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y73pqrEv");}
ccc::CC15x14y7 ::~CC15x14y7(){ note_dtor("_ZN3ccc9CC15x14y7E", this);} // tgen
ccc::CC15x14y7 ::CC15x14y7(){ note_ctor("_ZN3ccc9CC15x14y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y7E, buf);
    ::ccc::CC15x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y7E);
    dp->::ccc::CC15x14y7::~CC15x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y7E(Test__ZN3ccc9CC15x14y7E, "_ZN3ccc9CC15x14y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y7C1Ev();
extern void _ZN3ccc9CC15x14y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y7E[] = {
  NSPAIR(_ZN3ccc9CC15x14y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y7E[];
extern void _ZN3ccc9CC15x14y73pqrEv();
extern void _ZN3ccc9CC15x14y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y73abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y7E[];
Class_Descriptor cd__ZN3ccc9CC15x14y7E = {  "_ZN3ccc9CC15x14y7E", // class name
  bases__ZN3ccc9CC15x14y7E, 2,
  &(vtc__ZN3ccc9CC15x14y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y7E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y8  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC15x14y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x14y83abcEv
  ~CC15x14y8(); // tgen
  CC15x14y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y8E) C1{ BC2{} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y83efgEv");}
void  ccc::CC15x14y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x14y83abcEv");}
ccc::CC15x14y8 ::~CC15x14y8(){ note_dtor("_ZN3ccc9CC15x14y8E", this);} // tgen
ccc::CC15x14y8 ::CC15x14y8(){ note_ctor("_ZN3ccc9CC15x14y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y8E, buf);
    ::ccc::CC15x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y8E);
    dp->::ccc::CC15x14y8::~CC15x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y8E(Test__ZN3ccc9CC15x14y8E, "_ZN3ccc9CC15x14y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y8C1Ev();
extern void _ZN3ccc9CC15x14y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y8E[] = {
  NSPAIR(_ZN3ccc9CC15x14y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC15x14y83efgEv();
extern void _ZN3ccc9CC15x14y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y8E[];
Class_Descriptor cd__ZN3ccc9CC15x14y8E = {  "_ZN3ccc9CC15x14y8E", // class name
  bases__ZN3ccc9CC15x14y8E, 2,
  &(vtc__ZN3ccc9CC15x14y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y8E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y9  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC15x14y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x14y93pqrEv
  ~CC15x14y9(); // tgen
  CC15x14y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x14y9E) C1{ BC2{} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x14y93efgEv");}
void  ccc::CC15x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x14y93pqrEv");}
ccc::CC15x14y9 ::~CC15x14y9(){ note_dtor("_ZN3ccc9CC15x14y9E", this);} // tgen
ccc::CC15x14y9 ::CC15x14y9(){ note_ctor("_ZN3ccc9CC15x14y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x14y9E, buf);
    ::ccc::CC15x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x14y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC15x14y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x14y9E);
    dp->::ccc::CC15x14y9::~CC15x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x14y9E(Test__ZN3ccc9CC15x14y9E, "_ZN3ccc9CC15x14y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x14y9C1Ev();
extern void _ZN3ccc9CC15x14y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x14y9E[] = {
  NSPAIR(_ZN3ccc9CC15x14y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC15x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y9E[];
extern void _ZN3ccc9CC15x14y93pqrEv();
extern void _ZN3ccc9CC15x14y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x14y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x14y93efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x14y9E[];
Class_Descriptor cd__ZN3ccc9CC15x14y9E = {  "_ZN3ccc9CC15x14y9E", // class name
  bases__ZN3ccc9CC15x14y9E, 2,
  &(vtc__ZN3ccc9CC15x14y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x14y9E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y10  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC15x14y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x14y103abcEv
  ~CC15x14y10(); // tgen
  CC15x14y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y10E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x14y103pqrEv");}
void  ccc::CC15x14y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x14y103abcEv");}
ccc::CC15x14y10 ::~CC15x14y10(){ note_dtor("_ZN3ccc10CC15x14y10E", this);} // tgen
ccc::CC15x14y10 ::CC15x14y10(){ note_ctor("_ZN3ccc10CC15x14y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y10E, buf);
    ::ccc::CC15x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y10E);
    dp->::ccc::CC15x14y10::~CC15x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y10E(Test__ZN3ccc10CC15x14y10E, "_ZN3ccc10CC15x14y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y10C1Ev();
extern void _ZN3ccc10CC15x14y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y10E[] = {
  NSPAIR(_ZN3ccc10CC15x14y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y10E[];
extern void _ZN3ccc10CC15x14y103pqrEv();
extern void _ZN3ccc10CC15x14y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y10E[];
Class_Descriptor cd__ZN3ccc10CC15x14y10E = {  "_ZN3ccc10CC15x14y10E", // class name
  bases__ZN3ccc10CC15x14y10E, 2,
  &(vtc__ZN3ccc10CC15x14y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y10E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y11  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC15x14y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x14y113efgEv
  ~CC15x14y11(); // tgen
  CC15x14y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y11E) C1{ BC2{} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC15x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x14y113pqrEv");}
void  ccc::CC15x14y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x14y113efgEv");}
ccc::CC15x14y11 ::~CC15x14y11(){ note_dtor("_ZN3ccc10CC15x14y11E", this);} // tgen
ccc::CC15x14y11 ::CC15x14y11(){ note_ctor("_ZN3ccc10CC15x14y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y11E, buf);
    ::ccc::CC15x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y11E);
    dp->::ccc::CC15x14y11::~CC15x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y11E(Test__ZN3ccc10CC15x14y11E, "_ZN3ccc10CC15x14y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y11C1Ev();
extern void _ZN3ccc10CC15x14y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y11E[] = {
  NSPAIR(_ZN3ccc10CC15x14y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y11E[];
extern void _ZN3ccc10CC15x14y113pqrEv();
extern void _ZN3ccc10CC15x14y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y11E[];
Class_Descriptor cd__ZN3ccc10CC15x14y11E = {  "_ZN3ccc10CC15x14y11E", // class name
  bases__ZN3ccc10CC15x14y11E, 2,
  &(vtc__ZN3ccc10CC15x14y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y11E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y12  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc10CC15x14y123abcEv
  ~CC15x14y12(); // tgen
  CC15x14y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y12E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x14y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x14y123abcEv");}
ccc::CC15x14y12 ::~CC15x14y12(){ note_dtor("_ZN3ccc10CC15x14y12E", this);} // tgen
ccc::CC15x14y12 ::CC15x14y12(){ note_ctor("_ZN3ccc10CC15x14y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y12E, buf);
    ::ccc::CC15x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y12E);
    dp->::ccc::CC15x14y12::~CC15x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y12E(Test__ZN3ccc10CC15x14y12E, "_ZN3ccc10CC15x14y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y12C1Ev();
extern void _ZN3ccc10CC15x14y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y12E[] = {
  NSPAIR(_ZN3ccc10CC15x14y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc10CC15x14y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y12E[];
Class_Descriptor cd__ZN3ccc10CC15x14y12E = {  "_ZN3ccc10CC15x14y12E", // class name
  bases__ZN3ccc10CC15x14y12E, 2,
  &(vtc__ZN3ccc10CC15x14y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y12E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y13  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc10CC15x14y133efgEv
  ~CC15x14y13(); // tgen
  CC15x14y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y13E) C1{ BC2{} BC3{ v2} v1}
}
namespace ccc { 
void  ccc::CC15x14y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x14y133efgEv");}
ccc::CC15x14y13 ::~CC15x14y13(){ note_dtor("_ZN3ccc10CC15x14y13E", this);} // tgen
ccc::CC15x14y13 ::CC15x14y13(){ note_ctor("_ZN3ccc10CC15x14y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y13E, buf);
    ::ccc::CC15x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y13E);
    dp->::ccc::CC15x14y13::~CC15x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y13E(Test__ZN3ccc10CC15x14y13E, "_ZN3ccc10CC15x14y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y13C1Ev();
extern void _ZN3ccc10CC15x14y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y13E[] = {
  NSPAIR(_ZN3ccc10CC15x14y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc10CC15x14y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y13E[];
Class_Descriptor cd__ZN3ccc10CC15x14y13E = {  "_ZN3ccc10CC15x14y13E", // class name
  bases__ZN3ccc10CC15x14y13E, 2,
  &(vtc__ZN3ccc10CC15x14y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y13E),4, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y14  : ::ccc::AA15 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc10CC15x14y143pqrEv
  ~CC15x14y14(); // tgen
  CC15x14y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y14E) C1{ BC2{} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC15x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x14y143pqrEv");}
ccc::CC15x14y14 ::~CC15x14y14(){ note_dtor("_ZN3ccc10CC15x14y14E", this);} // tgen
ccc::CC15x14y14 ::CC15x14y14(){ note_ctor("_ZN3ccc10CC15x14y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y14E, buf);
    ::ccc::CC15x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y14E);
    dp->::ccc::CC15x14y14::~CC15x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y14E(Test__ZN3ccc10CC15x14y14E, "_ZN3ccc10CC15x14y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y14C1Ev();
extern void _ZN3ccc10CC15x14y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y14E[] = {
  NSPAIR(_ZN3ccc10CC15x14y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&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
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y14E[];
extern void _ZN3ccc10CC15x14y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x14y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y14E[];
Class_Descriptor cd__ZN3ccc10CC15x14y14E = {  "_ZN3ccc10CC15x14y14E", // class name
  bases__ZN3ccc10CC15x14y14E, 2,
  &(vtc__ZN3ccc10CC15x14y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y14E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x14y15  : ::ccc::AA15 , ::ccc::BB14 {
  ~CC15x14y15(); // tgen
  CC15x14y15(); // tgen
};
//SIG(1 _ZN3ccc10CC15x14y15E) C1{ BC2{} BC3{ v1}}
}
namespace ccc { 
ccc::CC15x14y15 ::~CC15x14y15(){ note_dtor("_ZN3ccc10CC15x14y15E", this);} // tgen
ccc::CC15x14y15 ::CC15x14y15(){ note_ctor("_ZN3ccc10CC15x14y15E", this);} // tgen
}
static void Test__ZN3ccc10CC15x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x14y15E, buf);
    ::ccc::CC15x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC15x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x14y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc10CC15x14y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x14y15E);
    dp->::ccc::CC15x14y15::~CC15x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x14y15E(Test__ZN3ccc10CC15x14y15E, "_ZN3ccc10CC15x14y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x14y15C1Ev();
extern void _ZN3ccc10CC15x14y15D1Ev();
Name_Map name_map__ZN3ccc10CC15x14y15E[] = {
  NSPAIR(_ZN3ccc10CC15x14y15C1Ev),
  NSPAIR(_ZN3ccc10CC15x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc10CC15x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB14E,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x14y15E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x14y15E[];
Class_Descriptor cd__ZN3ccc10CC15x14y15E = {  "_ZN3ccc10CC15x14y15E", // class name
  bases__ZN3ccc10CC15x14y15E, 2,
  &(vtc__ZN3ccc10CC15x14y15E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x14y15E),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace ccc { 
struct  CC15x15y0  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC15x15y03abcEv
  virtual void  efg(); // _ZN3ccc9CC15x15y03efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y03pqrEv
  ~CC15x15y0(); // tgen
  CC15x15y0(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y0E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y0 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y03abcEv");}
void  ccc::CC15x15y0 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y03efgEv");}
void  ccc::CC15x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y03pqrEv");}
ccc::CC15x15y0 ::~CC15x15y0(){ note_dtor("_ZN3ccc9CC15x15y0E", this);} // tgen
ccc::CC15x15y0 ::CC15x15y0(){ note_ctor("_ZN3ccc9CC15x15y0E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y0E, buf);
    ::ccc::CC15x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y0E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y0E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y0E);
    dp->::ccc::CC15x15y0::~CC15x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y0E(Test__ZN3ccc9CC15x15y0E, "_ZN3ccc9CC15x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y0C1Ev();
extern void _ZN3ccc9CC15x15y0D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y0E[] = {
  NSPAIR(_ZN3ccc9CC15x15y0C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y0E[];
extern void _ZN3ccc9CC15x15y03abcEv();
extern void _ZN3ccc9CC15x15y03efgEv();
extern void _ZN3ccc9CC15x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y0E[];
Class_Descriptor cd__ZN3ccc9CC15x15y0E = {  "_ZN3ccc9CC15x15y0E", // class name
  bases__ZN3ccc9CC15x15y0E, 2,
  &(vtc__ZN3ccc9CC15x15y0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y0E),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  CC15x15y1  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC15x15y13abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y13pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x15y13efgEv
  ~CC15x15y1(); // tgen
  CC15x15y1(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y1E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y1 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y13abcEv");}
void  ccc::CC15x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y13pqrEv");}
void  ccc::CC15x15y1 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y13efgEv");}
ccc::CC15x15y1 ::~CC15x15y1(){ note_dtor("_ZN3ccc9CC15x15y1E", this);} // tgen
ccc::CC15x15y1 ::CC15x15y1(){ note_ctor("_ZN3ccc9CC15x15y1E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y1E, buf);
    ::ccc::CC15x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y1E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y1E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y1E);
    dp->::ccc::CC15x15y1::~CC15x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y1E(Test__ZN3ccc9CC15x15y1E, "_ZN3ccc9CC15x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y1C1Ev();
extern void _ZN3ccc9CC15x15y1D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y1E[] = {
  NSPAIR(_ZN3ccc9CC15x15y1C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y1E[];
extern void _ZN3ccc9CC15x15y13abcEv();
extern void _ZN3ccc9CC15x15y13pqrEv();
extern void _ZN3ccc9CC15x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y13efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y1E[];
Class_Descriptor cd__ZN3ccc9CC15x15y1E = {  "_ZN3ccc9CC15x15y1E", // class name
  bases__ZN3ccc9CC15x15y1E, 2,
  &(vtc__ZN3ccc9CC15x15y1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y1E),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  CC15x15y2  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC15x15y23efgEv
  virtual void  abc(); // _ZN3ccc9CC15x15y23abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y23pqrEv
  ~CC15x15y2(); // tgen
  CC15x15y2(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y2E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y2 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y23efgEv");}
void  ccc::CC15x15y2 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y23abcEv");}
void  ccc::CC15x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y23pqrEv");}
ccc::CC15x15y2 ::~CC15x15y2(){ note_dtor("_ZN3ccc9CC15x15y2E", this);} // tgen
ccc::CC15x15y2 ::CC15x15y2(){ note_ctor("_ZN3ccc9CC15x15y2E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y2E, buf);
    ::ccc::CC15x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y2E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y2E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y2E);
    dp->::ccc::CC15x15y2::~CC15x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y2E(Test__ZN3ccc9CC15x15y2E, "_ZN3ccc9CC15x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y2C1Ev();
extern void _ZN3ccc9CC15x15y2D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y2E[] = {
  NSPAIR(_ZN3ccc9CC15x15y2C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y2E[];
extern void _ZN3ccc9CC15x15y23efgEv();
extern void _ZN3ccc9CC15x15y23abcEv();
extern void _ZN3ccc9CC15x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y23pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y2E[];
Class_Descriptor cd__ZN3ccc9CC15x15y2E = {  "_ZN3ccc9CC15x15y2E", // class name
  bases__ZN3ccc9CC15x15y2E, 2,
  &(vtc__ZN3ccc9CC15x15y2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y2E),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  CC15x15y3  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC15x15y33efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y33pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x15y33abcEv
  ~CC15x15y3(); // tgen
  CC15x15y3(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y3E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y3 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y33efgEv");}
void  ccc::CC15x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y33pqrEv");}
void  ccc::CC15x15y3 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y33abcEv");}
ccc::CC15x15y3 ::~CC15x15y3(){ note_dtor("_ZN3ccc9CC15x15y3E", this);} // tgen
ccc::CC15x15y3 ::CC15x15y3(){ note_ctor("_ZN3ccc9CC15x15y3E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y3E, buf);
    ::ccc::CC15x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y3E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y3E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y3E);
    dp->::ccc::CC15x15y3::~CC15x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y3E(Test__ZN3ccc9CC15x15y3E, "_ZN3ccc9CC15x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y3C1Ev();
extern void _ZN3ccc9CC15x15y3D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y3E[] = {
  NSPAIR(_ZN3ccc9CC15x15y3C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y3E[];
extern void _ZN3ccc9CC15x15y33efgEv();
extern void _ZN3ccc9CC15x15y33pqrEv();
extern void _ZN3ccc9CC15x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y33abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y3E[];
Class_Descriptor cd__ZN3ccc9CC15x15y3E = {  "_ZN3ccc9CC15x15y3E", // class name
  bases__ZN3ccc9CC15x15y3E, 2,
  &(vtc__ZN3ccc9CC15x15y3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y3E),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  CC15x15y4  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC15x15y43pqrEv
  virtual void  abc(); // _ZN3ccc9CC15x15y43abcEv
  virtual void  efg(); // _ZN3ccc9CC15x15y43efgEv
  ~CC15x15y4(); // tgen
  CC15x15y4(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y4E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y43pqrEv");}
void  ccc::CC15x15y4 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y43abcEv");}
void  ccc::CC15x15y4 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y43efgEv");}
ccc::CC15x15y4 ::~CC15x15y4(){ note_dtor("_ZN3ccc9CC15x15y4E", this);} // tgen
ccc::CC15x15y4 ::CC15x15y4(){ note_ctor("_ZN3ccc9CC15x15y4E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y4E, buf);
    ::ccc::CC15x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y4E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y4E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y4E);
    dp->::ccc::CC15x15y4::~CC15x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y4E(Test__ZN3ccc9CC15x15y4E, "_ZN3ccc9CC15x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y4C1Ev();
extern void _ZN3ccc9CC15x15y4D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y4E[] = {
  NSPAIR(_ZN3ccc9CC15x15y4C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y4E[];
extern void _ZN3ccc9CC15x15y43pqrEv();
extern void _ZN3ccc9CC15x15y43abcEv();
extern void _ZN3ccc9CC15x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y4E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y43efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y4E[];
Class_Descriptor cd__ZN3ccc9CC15x15y4E = {  "_ZN3ccc9CC15x15y4E", // class name
  bases__ZN3ccc9CC15x15y4E, 2,
  &(vtc__ZN3ccc9CC15x15y4E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y4E),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  CC15x15y5  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC15x15y53pqrEv
  virtual void  efg(); // _ZN3ccc9CC15x15y53efgEv
  virtual void  abc(); // _ZN3ccc9CC15x15y53abcEv
  ~CC15x15y5(); // tgen
  CC15x15y5(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y5E) C1{ BC2{} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC15x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y53pqrEv");}
void  ccc::CC15x15y5 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y53efgEv");}
void  ccc::CC15x15y5 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y53abcEv");}
ccc::CC15x15y5 ::~CC15x15y5(){ note_dtor("_ZN3ccc9CC15x15y5E", this);} // tgen
ccc::CC15x15y5 ::CC15x15y5(){ note_ctor("_ZN3ccc9CC15x15y5E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y5E, buf);
    ::ccc::CC15x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y5E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y5E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y5E);
    dp->::ccc::CC15x15y5::~CC15x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y5E(Test__ZN3ccc9CC15x15y5E, "_ZN3ccc9CC15x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y5C1Ev();
extern void _ZN3ccc9CC15x15y5D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y5E[] = {
  NSPAIR(_ZN3ccc9CC15x15y5C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y5E[];
extern void _ZN3ccc9CC15x15y53pqrEv();
extern void _ZN3ccc9CC15x15y53efgEv();
extern void _ZN3ccc9CC15x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y5E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y53abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y5E[];
Class_Descriptor cd__ZN3ccc9CC15x15y5E = {  "_ZN3ccc9CC15x15y5E", // class name
  bases__ZN3ccc9CC15x15y5E, 2,
  &(vtc__ZN3ccc9CC15x15y5E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y5E),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  CC15x15y6  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC15x15y63abcEv
  virtual void  efg(); // _ZN3ccc9CC15x15y63efgEv
  ~CC15x15y6(); // tgen
  CC15x15y6(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y6E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y6 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y63abcEv");}
void  ccc::CC15x15y6 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y63efgEv");}
ccc::CC15x15y6 ::~CC15x15y6(){ note_dtor("_ZN3ccc9CC15x15y6E", this);} // tgen
ccc::CC15x15y6 ::CC15x15y6(){ note_ctor("_ZN3ccc9CC15x15y6E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y6E, buf);
    ::ccc::CC15x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y6E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y6E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y6E);
    dp->::ccc::CC15x15y6::~CC15x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y6E(Test__ZN3ccc9CC15x15y6E, "_ZN3ccc9CC15x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y6C1Ev();
extern void _ZN3ccc9CC15x15y6D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y6E[] = {
  NSPAIR(_ZN3ccc9CC15x15y6C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y6E[];
extern void _ZN3ccc9CC15x15y63abcEv();
extern void _ZN3ccc9CC15x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y6E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y63efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y6E[];
Class_Descriptor cd__ZN3ccc9CC15x15y6E = {  "_ZN3ccc9CC15x15y6E", // class name
  bases__ZN3ccc9CC15x15y6E, 2,
  &(vtc__ZN3ccc9CC15x15y6E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y6E),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  CC15x15y7  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC15x15y73abcEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y73pqrEv
  ~CC15x15y7(); // tgen
  CC15x15y7(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y7E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y7 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y73abcEv");}
void  ccc::CC15x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y73pqrEv");}
ccc::CC15x15y7 ::~CC15x15y7(){ note_dtor("_ZN3ccc9CC15x15y7E", this);} // tgen
ccc::CC15x15y7 ::CC15x15y7(){ note_ctor("_ZN3ccc9CC15x15y7E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y7E, buf);
    ::ccc::CC15x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y7E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y7E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y7E);
    dp->::ccc::CC15x15y7::~CC15x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y7E(Test__ZN3ccc9CC15x15y7E, "_ZN3ccc9CC15x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y7C1Ev();
extern void _ZN3ccc9CC15x15y7D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y7E[] = {
  NSPAIR(_ZN3ccc9CC15x15y7C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y7E[];
extern void _ZN3ccc9CC15x15y73abcEv();
extern void _ZN3ccc9CC15x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y7E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y73pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y7E[];
Class_Descriptor cd__ZN3ccc9CC15x15y7E = {  "_ZN3ccc9CC15x15y7E", // class name
  bases__ZN3ccc9CC15x15y7E, 2,
  &(vtc__ZN3ccc9CC15x15y7E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y7E),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  CC15x15y8  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC15x15y83efgEv
  virtual void  abc(); // _ZN3ccc9CC15x15y83abcEv
  ~CC15x15y8(); // tgen
  CC15x15y8(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y8E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y8 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y83efgEv");}
void  ccc::CC15x15y8 ::abc(){vfunc_called(this, "_ZN3ccc9CC15x15y83abcEv");}
ccc::CC15x15y8 ::~CC15x15y8(){ note_dtor("_ZN3ccc9CC15x15y8E", this);} // tgen
ccc::CC15x15y8 ::CC15x15y8(){ note_ctor("_ZN3ccc9CC15x15y8E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y8E, buf);
    ::ccc::CC15x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y8E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y8E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y8E);
    dp->::ccc::CC15x15y8::~CC15x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y8E(Test__ZN3ccc9CC15x15y8E, "_ZN3ccc9CC15x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y8C1Ev();
extern void _ZN3ccc9CC15x15y8D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y8E[] = {
  NSPAIR(_ZN3ccc9CC15x15y8C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y8E[];
extern void _ZN3ccc9CC15x15y83efgEv();
extern void _ZN3ccc9CC15x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y8E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y83abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y8E[];
Class_Descriptor cd__ZN3ccc9CC15x15y8E = {  "_ZN3ccc9CC15x15y8E", // class name
  bases__ZN3ccc9CC15x15y8E, 2,
  &(vtc__ZN3ccc9CC15x15y8E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y8E),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  CC15x15y9  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC15x15y93efgEv
  virtual void  pqr(); // _ZN3ccc9CC15x15y93pqrEv
  ~CC15x15y9(); // tgen
  CC15x15y9(); // tgen
};
//SIG(1 _ZN3ccc9CC15x15y9E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y9 ::efg(){vfunc_called(this, "_ZN3ccc9CC15x15y93efgEv");}
void  ccc::CC15x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc9CC15x15y93pqrEv");}
ccc::CC15x15y9 ::~CC15x15y9(){ note_dtor("_ZN3ccc9CC15x15y9E", this);} // tgen
ccc::CC15x15y9 ::CC15x15y9(){ note_ctor("_ZN3ccc9CC15x15y9E", this);} // tgen
}
static void Test__ZN3ccc9CC15x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc9CC15x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC15x15y9E, buf);
    ::ccc::CC15x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC15x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC15x15y9E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc9CC15x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC15x15y9E");
    test_class_info(&lv, &cd__ZN3ccc9CC15x15y9E);
    dp->::ccc::CC15x15y9::~CC15x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC15x15y9E(Test__ZN3ccc9CC15x15y9E, "_ZN3ccc9CC15x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC15x15y9C1Ev();
extern void _ZN3ccc9CC15x15y9D1Ev();
Name_Map name_map__ZN3ccc9CC15x15y9E[] = {
  NSPAIR(_ZN3ccc9CC15x15y9C1Ev),
  NSPAIR(_ZN3ccc9CC15x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC15x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y9E[];
extern void _ZN3ccc9CC15x15y93efgEv();
extern void _ZN3ccc9CC15x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC15x15y9E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC15x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC15x15y93pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc9CC15x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC15x15y9E[];
Class_Descriptor cd__ZN3ccc9CC15x15y9E = {  "_ZN3ccc9CC15x15y9E", // class name
  bases__ZN3ccc9CC15x15y9E, 2,
  &(vtc__ZN3ccc9CC15x15y9E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC15x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC15x15y9E),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  CC15x15y10  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC15x15y103pqrEv
  virtual void  abc(); // _ZN3ccc10CC15x15y103abcEv
  ~CC15x15y10(); // tgen
  CC15x15y10(); // tgen
};
//SIG(1 _ZN3ccc10CC15x15y10E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x15y103pqrEv");}
void  ccc::CC15x15y10 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x15y103abcEv");}
ccc::CC15x15y10 ::~CC15x15y10(){ note_dtor("_ZN3ccc10CC15x15y10E", this);} // tgen
ccc::CC15x15y10 ::CC15x15y10(){ note_ctor("_ZN3ccc10CC15x15y10E", this);} // tgen
}
static void Test__ZN3ccc10CC15x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x15y10E, buf);
    ::ccc::CC15x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x15y10E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y10E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y10E);
    dp->::ccc::CC15x15y10::~CC15x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y10E(Test__ZN3ccc10CC15x15y10E, "_ZN3ccc10CC15x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x15y10C1Ev();
extern void _ZN3ccc10CC15x15y10D1Ev();
Name_Map name_map__ZN3ccc10CC15x15y10E[] = {
  NSPAIR(_ZN3ccc10CC15x15y10C1Ev),
  NSPAIR(_ZN3ccc10CC15x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y10E[];
extern void _ZN3ccc10CC15x15y103pqrEv();
extern void _ZN3ccc10CC15x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x15y10E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y103abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x15y10E[];
Class_Descriptor cd__ZN3ccc10CC15x15y10E = {  "_ZN3ccc10CC15x15y10E", // class name
  bases__ZN3ccc10CC15x15y10E, 2,
  &(vtc__ZN3ccc10CC15x15y10E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x15y10E),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  CC15x15y11  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC15x15y113pqrEv
  virtual void  efg(); // _ZN3ccc10CC15x15y113efgEv
  ~CC15x15y11(); // tgen
  CC15x15y11(); // tgen
};
//SIG(1 _ZN3ccc10CC15x15y11E) C1{ BC2{} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC15x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x15y113pqrEv");}
void  ccc::CC15x15y11 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x15y113efgEv");}
ccc::CC15x15y11 ::~CC15x15y11(){ note_dtor("_ZN3ccc10CC15x15y11E", this);} // tgen
ccc::CC15x15y11 ::CC15x15y11(){ note_ctor("_ZN3ccc10CC15x15y11E", this);} // tgen
}
static void Test__ZN3ccc10CC15x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x15y11E, buf);
    ::ccc::CC15x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x15y11E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y11E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y11E);
    dp->::ccc::CC15x15y11::~CC15x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y11E(Test__ZN3ccc10CC15x15y11E, "_ZN3ccc10CC15x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x15y11C1Ev();
extern void _ZN3ccc10CC15x15y11D1Ev();
Name_Map name_map__ZN3ccc10CC15x15y11E[] = {
  NSPAIR(_ZN3ccc10CC15x15y11C1Ev),
  NSPAIR(_ZN3ccc10CC15x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y11E[];
extern void _ZN3ccc10CC15x15y113pqrEv();
extern void _ZN3ccc10CC15x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x15y11E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y113efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x15y11E[];
Class_Descriptor cd__ZN3ccc10CC15x15y11E = {  "_ZN3ccc10CC15x15y11E", // class name
  bases__ZN3ccc10CC15x15y11E, 2,
  &(vtc__ZN3ccc10CC15x15y11E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x15y11E),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  CC15x15y12  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc10CC15x15y123abcEv
  ~CC15x15y12(); // tgen
  CC15x15y12(); // tgen
};
//SIG(1 _ZN3ccc10CC15x15y12E) C1{ BC2{} BC3{} v1}
}
namespace ccc { 
void  ccc::CC15x15y12 ::abc(){vfunc_called(this, "_ZN3ccc10CC15x15y123abcEv");}
ccc::CC15x15y12 ::~CC15x15y12(){ note_dtor("_ZN3ccc10CC15x15y12E", this);} // tgen
ccc::CC15x15y12 ::CC15x15y12(){ note_ctor("_ZN3ccc10CC15x15y12E", this);} // tgen
}
static void Test__ZN3ccc10CC15x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x15y12E, buf);
    ::ccc::CC15x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x15y12E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y12E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y12E);
    dp->::ccc::CC15x15y12::~CC15x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y12E(Test__ZN3ccc10CC15x15y12E, "_ZN3ccc10CC15x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x15y12C1Ev();
extern void _ZN3ccc10CC15x15y12D1Ev();
Name_Map name_map__ZN3ccc10CC15x15y12E[] = {
  NSPAIR(_ZN3ccc10CC15x15y12C1Ev),
  NSPAIR(_ZN3ccc10CC15x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y12E[];
extern void _ZN3ccc10CC15x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x15y12E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y123abcEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x15y12E[];
Class_Descriptor cd__ZN3ccc10CC15x15y12E = {  "_ZN3ccc10CC15x15y12E", // class name
  bases__ZN3ccc10CC15x15y12E, 2,
  &(vtc__ZN3ccc10CC15x15y12E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x15y12E),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  CC15x15y13  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc10CC15x15y133efgEv
  ~CC15x15y13(); // tgen
  CC15x15y13(); // tgen
};
//SIG(1 _ZN3ccc10CC15x15y13E) C1{ BC2{} BC3{} v1}
}
namespace ccc { 
void  ccc::CC15x15y13 ::efg(){vfunc_called(this, "_ZN3ccc10CC15x15y133efgEv");}
ccc::CC15x15y13 ::~CC15x15y13(){ note_dtor("_ZN3ccc10CC15x15y13E", this);} // tgen
ccc::CC15x15y13 ::CC15x15y13(){ note_ctor("_ZN3ccc10CC15x15y13E", this);} // tgen
}
static void Test__ZN3ccc10CC15x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x15y13E, buf);
    ::ccc::CC15x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x15y13E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y13E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y13E);
    dp->::ccc::CC15x15y13::~CC15x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y13E(Test__ZN3ccc10CC15x15y13E, "_ZN3ccc10CC15x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x15y13C1Ev();
extern void _ZN3ccc10CC15x15y13D1Ev();
Name_Map name_map__ZN3ccc10CC15x15y13E[] = {
  NSPAIR(_ZN3ccc10CC15x15y13C1Ev),
  NSPAIR(_ZN3ccc10CC15x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y13E[];
extern void _ZN3ccc10CC15x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x15y13E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y133efgEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x15y13E[];
Class_Descriptor cd__ZN3ccc10CC15x15y13E = {  "_ZN3ccc10CC15x15y13E", // class name
  bases__ZN3ccc10CC15x15y13E, 2,
  &(vtc__ZN3ccc10CC15x15y13E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x15y13E),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  CC15x15y14  : ::ccc::AA15 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc10CC15x15y143pqrEv
  ~CC15x15y14(); // tgen
  CC15x15y14(); // tgen
};
//SIG(1 _ZN3ccc10CC15x15y14E) C1{ BC2{} BC3{} v1}
}
namespace ccc { 
void  ccc::CC15x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc10CC15x15y143pqrEv");}
ccc::CC15x15y14 ::~CC15x15y14(){ note_dtor("_ZN3ccc10CC15x15y14E", this);} // tgen
ccc::CC15x15y14 ::CC15x15y14(){ note_ctor("_ZN3ccc10CC15x15y14E", this);} // tgen
}
static void Test__ZN3ccc10CC15x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc10CC15x15y14E, buf);
    ::ccc::CC15x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC15x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc10CC15x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc10CC15x15y14E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y14E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y14E);
    dp->::ccc::CC15x15y14::~CC15x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y14E(Test__ZN3ccc10CC15x15y14E, "_ZN3ccc10CC15x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc10CC15x15y14C1Ev();
extern void _ZN3ccc10CC15x15y14D1Ev();
Name_Map name_map__ZN3ccc10CC15x15y14E[] = {
  NSPAIR(_ZN3ccc10CC15x15y14C1Ev),
  NSPAIR(_ZN3ccc10CC15x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y14E[];
extern void _ZN3ccc10CC15x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc10CC15x15y14E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc10CC15x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc10CC15x15y143pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc10CC15x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc10CC15x15y14E[];
Class_Descriptor cd__ZN3ccc10CC15x15y14E = {  "_ZN3ccc10CC15x15y14E", // class name
  bases__ZN3ccc10CC15x15y14E, 2,
  &(vtc__ZN3ccc10CC15x15y14E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc10CC15x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc10CC15x15y14E),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  CC15x15y15  : ::ccc::AA15 , ::ccc::BB15 {
};
//SIG(1 _ZN3ccc10CC15x15y15E) C1{ BC2{} BC3{}}
}
namespace ccc { 
}
static void Test__ZN3ccc10CC15x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc10CC15x15y15E;
  void *lvp;
  {
    char buf[1];
    init_test(&cd__ZN3ccc10CC15x15y15E, buf);
    ::ccc::CC15x15y15 &lv = *(new (buf) ::ccc::CC15x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), 1, "sizeof(_ZN3ccc10CC15x15y15E)");
    check2(__alignof__(lv), 1, "__alignof__(_ZN3ccc10CC15x15y15E)");
    check_base_class_offset(lv, (::ccc::AA15*), 0, "_ZN3ccc10CC15x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc10CC15x15y15E");
    test_class_info(&lv, &cd__ZN3ccc10CC15x15y15E);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc10CC15x15y15E(Test__ZN3ccc10CC15x15y15E, "_ZN3ccc10CC15x15y15E", 1);

#else // __cplusplus

extern Class_Descriptor cd__ZN3ccc4AA15E;
extern VTBL_ENTRY _ZTIN3ccc4AA15E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc10CC15x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3ccc4BB15E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd__ZN3ccc10CC15x15y15E = {  "_ZN3ccc10CC15x15y15E", // class name
  bases__ZN3ccc10CC15x15y15E, 2,
  0, // no vftv
  0, //no vtt
  1, // object size
  {0,0},0, // 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

//============================================================================

